使用css编写无限重复不间断的加载动画
使用css动画写一个无限加载且循环不间断的加载框
·
使用css编写无限重复加载动画
难点介绍
在开始写代码之前,我们可以思考,在浏览器页面里,我们怎么可以感觉到一个元素在无限重复滚动。实际上我们的元素首尾是断开的,所以说,我们看到的无限重复滚动的动画,他不是连续的,是我们的眼睛被欺骗了,我们想要达到的就是这种效果。
如何达到眼睛被欺骗的效果
平常的思路
我们可以将滚动的元素复制成两份,元素1在我们的视野里滚动,另外一份在元素2跟在元素1后面滚动,这两个相同元素的无限滚动,不就成了无限加载了吗
升级版思路
按照前面的思路来写代码,不仅要写两个盒子去装元素,还需要写两个动画
但是我们仔细思考一下,一个元素在前面滚动,另外一个元素紧跟在后面滚动,如果我们把这两个系统的元素看作同一个元素,那么我是不是只需要写一个元素,让这个元素滚动自身的百分之50,循环下去,不也可以无限滚动吗
代码环节
复制到vscode的html页面里就可以运行了
平常思路代码
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
/*
这里的relative可有意思了,我们的元素自身的宽度在平常状态下只能获取到可见区域的宽度
而在absolute状态下可以获取到元素可见与不可见的总宽度
在写这个的时候这个问题也困扰了我好久
*/
.slider {
position: relative;
width: 200px;
height: 100px;
overflow: hidden;
}
.slider-absolute {
position: absolute;
top: 0;
left: 0;
display: flex;
justify-content: flex-start;
align-items: center;
/* 不能让元素换行 */
flex-wrap: nowrap;
}
.box {
display: flex;
align-items: center;
justify-content: flex-start;
animation: slider 5s infinite linear;
}
span {
display: inline-block;
padding: 10px;
background-color: aqua;
/* 只能用与动画方向相反的元素间的间隔 不然会出现卡顿 */
margin-right: 20px;
}
@keyframes slider {
0% {
transform: translateX(0);
}
100% {
transform: translateX(-100%);
/* 若元素有隐藏在父级元素之外的内容 需要使用绝对定位来获取自己本身可见与不可见的宽度 */
}
}
</style>
</head>
<body>
<div class="slider">
<div class="slider-absolute">
<div class="box">
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
<span>5</span>
</div>
<div class="box">
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
<span>5</span>
</div>
</div>
</div>
</body>
</html>
升级版代码
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
/*
这里的relative可有意思了,我们的元素自身的宽度在平常状态下只能获取到可见区域的宽度
而在absolute状态下可以获取到元素可见与不可见的总宽度
在写这个的时候这个问题也困扰了我好久
*/
.slider {
position: relative;
width: 200px;
height: 100px;
overflow: hidden;
}
.box {
position: absolute;
left: 0;
top: 0;
display: flex;
justify-content: flex-start;
align-items: center;
/* 不能让元素换行 */
flex-wrap: nowrap;
animation: slider 5s infinite linear;
}
span {
display: inline-block;
padding: 10px;
background-color: aqua;
/* 只能用与动画方向相反的元素间的间隔 不然会出现卡顿 */
margin-right: 20px;
}
@keyframes slider {
0% {
transform: translateX(0);
}
100% {
/* 若元素有隐藏在父级元素之外的内容 需要使用绝对定位来获取自己本身可见与不可见的宽度 */
transform: translateX(-50%);
}
}
</style>
</head>
<body>
<div class="slider">
<div class="box">
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
<span>5</span>
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
<span>5</span>
</div>
</div>
</body>
</html>
更多推荐
已为社区贡献1条内容
所有评论(0)