原生JS与CSS3实现重力模拟弹跳登录页:opacity、transition与box-shadow详解
本文介绍如何使用原生JavaScript结合CSS3的opacity、transition和box-shadow属性,构建一个具有重力模拟效果的炫酷登录页面。详细解析了透明度控制、过渡动画及阴影效果的语法与应用,并提供完整代码实现方案,帮助开发者掌握前端交互特效的制作技巧。
重力模拟弹跳登录页面实现概述
本文基于此前保存的JavaScript特效视频内容,通过手动编写代码的方式,演示如何利用原生JavaScript实现一个视觉效果出众的登录页面。其具体视觉效果可通过后续展示的界面图片直观了解。
最终实现效果如下图所示:

在深入代码细节之前,建议先了解CSS中opacity、transition和box-shadow这三个关键属性的作用与用法。
CSS3核心属性详解
1. opacity属性
CSS3 opacity 属性说明
示例展示
以下代码演示如何设置一个div元素的透明度级别:
div
{
opacity:0.5;
}
页面底部提供了更多相关示例。
浏览器兼容性
支持该属性的浏览器包括:Internet Explorer、Firefox、Opera、Google Chrome和Safari。
目前所有主流浏览器均支持opacity属性。
需要注意的是,Internet Explorer 8及更早版本支持另一种滤镜属性,例如:filter:Alpha(opacity=50)。
属性定义与使用说明
Opacity属性用于设置元素的透明度级别。
| 默认值: | 1 |
|---|---|
| 继承: | no |
| 版本: | CSS3 |
| JavaScript 语法: | object.style.opacity=0.5 |
语法格式
opacity: value|inherit;
| 值 | 描述 |
|---|---|
| value | 指定不透明度。从0.0(完全透明)到1.0(完全不透明) |
| inherit | Opacity属性的值应该从父元素继承 |
transition过渡动画属性
2. transition属性
功能:实现元素从一种样式平滑过渡到另一种样式的效果。
定义与用法
transition属性是一个简写属性,用于同时设置以下四个过渡相关属性:
- transition-property
- transition-duration
- transition-timing-function
- transition-delay
注意:务必设置transition-duration属性,否则默认时长为0,将不会产生任何过渡动画效果。
语法格式
transition: property duration timing-function delay;
| 值 | 描述 |
|---|---|
| transition-property | 规定设置过渡效果的 CSS 属性的名称。 |
| transition-duration | 规定完成过渡效果需要多少秒或毫秒。 |
| transition-timing-function | 规定速度效果的速度曲线。 |
| transition-delay | 定义过渡效果何时开始。 |
box-shadow阴影效果属性
3. box-shadow属性
功能:为元素添加阴影效果。
定义与用法
box-shadow属性允许向元素框添加一个或多个阴影。
提示:可结合使用border-image-*属性来构建美观的可伸缩按钮样式。
| 默认值: | none |
|---|---|
| 继承性: | no |
| 版本: | CSS3 |
| JavaScript 语法: | object.style.boxShadow="10px 10px 5px #888888" |
语法格式
box-shadow: h-shadow v-shadow blur spread color inset;
注意:box-shadow属性用于向元素框添加一个或多个阴影。该属性由逗号分隔的阴影列表组成,每个阴影包含2至4个长度值、可选的颜色值以及可选的inset关键词。若省略长度值,则默认为0。
| 值 | 描述 | 测试 |
|---|---|---|
| h-shadow | 必需。水平阴影的位置。允许负值。 | 测试 |
| v-shadow | 必需。垂直阴影的位置。允许负值。 | 测试 |
| blur | 可选。模糊距离。 | 测试 |
| spread | 可选。阴影的尺寸。 | 测试 |
| color | 可选。阴影的颜色。请参阅 CSS 颜色值。 | 测试 |
| inset | 可选。将外部阴影 (outset) 改为内部阴影。 | 测试 |
完整代码实现
具体实现方式如下,请参考以下代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>梦幻登录</title>
<style type="text/css">
* {
margin: 0;
padding: 0;
list-style: none;
}
body {
overflow: hidden;
}
#bg_wrap {
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
overflow: hidden;
}
#bg_wrap div {
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
opacity: 0;
/* 设置透明度 */
transition: opacity 3s;
}
/* nth-of-type(1) *筛选选择器选择第一个*/
#bg_wrap div:nth-of-type(1) {
opacity: 1;
}
#Login {
width: 272px;
height: 300px;
margin: 200px auto;
}
#Login .move {
position: absolute;
top: -100px;
z-index: 999;
}
#Login h3 {
width: 270px;
font-size: 30px;
font-weight: 700;
color: #fff;
font-family: '微软雅黑';
text-align: center;
margin-bottom: 30px;
cursor: move;
/* top: 100px; */
}
/* #username {
top: 170px;
}
#password {
top: 225px;
} */
#Login input.text {
width: 270px;
height: 42px;
color: #fff;
background: rgba(45, 45, 45, 0.15);
border-radius: 6px;
border: 1px solid rgba(255, 255, 255, 0.15);
box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 1.0) inset;
text-indent: 10px;
}
#Login input.btn {
/* top: 280px; */
background: #ef4300;
width: 272px;
height: 44px;
border-radius: 6px;
color: #fff;
box-shadow: 0 15px 30px 0 rgba(255, 255, 255, 0.25) inset, 0 2px 7px 0 rgba(0, 0, 0, 0.2);
/* -webkit-box-shadow: 0 15px 30px 0 rgba(255, 255, 255, 0.25) inset, 0 2px 7px 0 rgba(0, 0, 0, 0.2);
-moz-box-shadow: 0 15px 30px 0 rgba(255, 255, 255, 0.25) inset, 0 2px 7px 0 rgba(0, 0, 0, 0.2); */
border: 0;
text-align: center;
}
/* #Login input.focus {
outline: none;
box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.2) inset;
} */
input::-webkit-input-placeholder {
color: #fff;
}
</style>
</head>
<body>
<div id="bg_wrap">
<div><img src="images/1.jpg" width="100%" height="100%"></div>
<div><img src="images/2.jpg" width="100%" height="100%"></div>
<div><img src="images/3.jpg" width="100%" height="100%"></div>
</div>
<div id="Login">
<h3 id="title" class="move">User Login</h3>
<form action="#" method="post" target="_blank">
<input type="text" placeholder="UserName" name="username" id="username" class="text move">
<input type="password" placeholder="PassWord" name="password" id="password" class="text move">
<input type="submit" value="Sign in" class="btn move" id="submit">
</form>
</div>
<script type="text/javascript">
/*背景渐变*/
/*function(){} 匿名函数
()() IIFE匿名函数立刻执行,函数自执行体*/
(function() {
var timer = null; //声明定时器
var oImg = document.querySelectorAll('#bg_wrap div') //h5最新元素获取写法获取到的是一组元素
//querySelector获取单个元素的 兼容ie8
var len = oImg.length; //3
var index = 0;
timer = setInterval(function() {
oImg[index].style.opacity = 0;
index++;
// if(index>=3){
// index=0;
// }
index %= len; //index=index%len求模取余 0%3=0; 1%3=1; 2%3=2; 3%3=0;
oImg[index].style.opacity = 1;
}, 2000);
})();
// 重力模拟弹跳系统
(function() {
/*
改变定位元素的top值
达到指定位置之后进行弹跳一次
多个元素一次运动
动画序列*/
var oMove = document.querySelectorAll('.move');
var oLen = oMove.length;
var timer = null;
var timeout = null;
var speed = 3; //移动距离
move(oLen - 1);
function move(index) {
if (index < 0) {
clearInterval(timer); //清除循环定时器
clearTimeout(timeout); //清除延时定时器
return; //终止函数
}
var endTop = 150 + (index * 60); //根据下标计算endTop值
timer = setInterval(function() {
speed += 3;
var T = oMove[index].offsetTop + speed; //设置每一次的top值
if (T > endTop) {
T = endTop;
speed *= -1 //取反,让移动距离变为负数
speed *= 0.4;
//慢慢停下来
}
oMove[index].style.top = T + 'px';
}, 20);
timeout = setTimeout(function() {
clearInterval(timer);
index--;
console.log(9);
move(index);
console.log(index);
}, 900) //过900毫秒之后再执行方法里的代码
}
})()
</script>
</body>
</html>
总结
以上内容介绍了如何利用原生JavaScript和CSS实现带有重力模拟弹跳效果的登录页面,希望能为读者提供帮助。如有任何疑问,欢迎留言,小编会及时回复。同时感谢大家对本站的支持!
JS处理含Emoji或中文的字符串转数组乱码问题
2026-11-05 16:12:28
JS怎么使用展开运算符合并对象
2026-11-05 14:42:18
ES6+环境下判断JS对象为空的简洁写法
2026-11-05 12:12:23
怎么通过replacer函数自定义JS中JSON的格式化输出
2026-11-05 11:19:44
JS正则表达式基础:字面量与RegExp构造函数的区别及常用元字符
2026-11-05 11:16:58
