首页 >> js开发 >> js在Vue中使用CSS3实现内容无缝滚动的示例代码js大全
js在Vue中使用CSS3实现内容无缝滚动的示例代码js大全
发布时间: 2021年1月13日 | 浏览:
| 分类:js开发
一、效果预览
一、效果预览
一、效果预览
最近在做一个活动页面,遇到幸运用户中奖的滚动公告需求。下面是实现效果:(gif录制略显卡顿,实际效果很流畅)
二、无缝滚动原理二、无缝滚动原理二、无缝滚动原理1、容器宽高固定,超出内容隐藏;
2、内容准备2份,现参与滚动的内容有A、B两份,向左滚动;
3、滑动过程中,B份紧随A份之后,营造出无缝滚动回来的效果;
4、在A部分内容完全滚出容器的一瞬间,立刻将AB内容位置复原,由于A、B内容一模一样,这个复原过程很难看出来;
5、循环第3步;三、代码
三、代码三、代码1、html部分
2、CSS部分
.lucky-user {
width: 540px; //容器定宽高
height: 30px;
margin: 0 auto;
font-size: 18px;
line-height: 30px;
color: #E9B65F;
overflow: hidden; //超出内容隐藏
.user-list {
width: fit-content; // Q1
white-space: nowrap; // 内容不换行
animation-name: seamless-scrolling; // Q3
animation-timing-function: linear; // 动画速度曲线,匀速
animation-iteration-count: infinite; // 动画循环无限次播放
li {
display: inline-block;
margin-right: 30px;
}
}
}
@keyframes seamless-scrolling {
0% {
transform: translateX(0px);
}
100% {
transform: translateX(-50%); //Q2
}
}
.lucky-user {
width: 540px; //容器定宽高
height: 30px;
margin: 0 auto;
font-size: 18px;
line-height: 30px;
color: #E9B65F;
overflow: hidden; //超出内容隐藏
.user-list {
width: fit-content; // Q1
white-space: nowrap; // 内容不换行
animation-name: seamless-scrolling; // Q3
animation-timing-function: linear; // 动画速度曲线,匀速
animation-iteration-count: infinite; // 动画循环无限次播放
li {
display: inline-block;
margin-right: 30px;
}
}
}
@keyframes seamless-scrolling {
0% {
transform: translateX(0px);
}
100% {
transform: translateX(-50%); //Q2
}
}
Q1:因为滚动内容一般都不是固定的,需要接口获取,所以内容区的宽度也就无法确定,这里使用CSS3的新特性width: fit-content,使宽度自适应内部内容,至于为什么这里需要设置宽度属性,见下文
Q2:设置动画。由于内容区实际有AB两份,B是A的副本,所以一段动画的终点就是内容区向左位移50%(内容区width的50%),这也就解释了Q1中为什么一定要设置宽度属性了:如果不设置,width的值不会随内容撑开,此时的50%是父容器width的50%,终点值就错了
Q3:为什么animation不采用简写形式,而是拆开? 因为animation-duration 动画时长不能固定,如果接口获取到的数据很多,动画时长固定5s,那滚动地得有多快?所以animation-duration采用属性绑定形式,根据数据长度进行延长
:style="animation-duration: ${luckyUsers.length * 4}s;" 具体乘几看自己喜欢。
我也试过采用简写形式进行style属性绑定,结果发现动画不生效。
3、JS部分
export default {
name: 'app',
data() {
return {
luckyUsers: []
}
},
created() {
this.getLuckyUsersList()
},
methods: {
getLuckyUsersList () {
//调接口拿取数据
this.luckyUsers = [
'000000抽中了xxx奖品',
'111111抽中了xxx奖品',
'222222抽中了xxx奖品',
]
}
}
}
export default {
name: 'app',
data() {
return {
luckyUsers: []
}
},
created() {
this.getLuckyUsersList()
},
methods: {
getLuckyUsersList () {
//调接口拿取数据
this.luckyUsers = [
'000000抽中了xxx奖品',
'111111抽中了xxx奖品',
'222222抽中了xxx奖品',
]
}
}
}
四、总结
四、总结四、总结无缝滚动的实现主要借助了css3中的animation、width:fit-content自适应属性、translate位移等特性;
从实现原理上看,其实就是一个欺骗眼睛的小伎俩而已~
一、效果预览
一、效果预览
最近在做一个活动页面,遇到幸运用户中奖的滚动公告需求。下面是实现效果:(gif录制略显卡顿,实际效果很流畅)
二、无缝滚动原理二、无缝滚动原理二、无缝滚动原理1、容器宽高固定,超出内容隐藏;
2、内容准备2份,现参与滚动的内容有A、B两份,向左滚动;
3、滑动过程中,B份紧随A份之后,营造出无缝滚动回来的效果;
4、在A部分内容完全滚出容器的一瞬间,立刻将AB内容位置复原,由于A、B内容一模一样,这个复原过程很难看出来;
5、循环第3步;三、代码
三、代码三、代码1、html部分
- {{ item }}
- {{ item }}
- {{ item }}
- {{ item }}
2、CSS部分
.lucky-user {
width: 540px; //容器定宽高
height: 30px;
margin: 0 auto;
font-size: 18px;
line-height: 30px;
color: #E9B65F;
overflow: hidden; //超出内容隐藏
.user-list {
width: fit-content; // Q1
white-space: nowrap; // 内容不换行
animation-name: seamless-scrolling; // Q3
animation-timing-function: linear; // 动画速度曲线,匀速
animation-iteration-count: infinite; // 动画循环无限次播放
li {
display: inline-block;
margin-right: 30px;
}
}
}
@keyframes seamless-scrolling {
0% {
transform: translateX(0px);
}
100% {
transform: translateX(-50%); //Q2
}
}
.lucky-user {
width: 540px; //容器定宽高
height: 30px;
margin: 0 auto;
font-size: 18px;
line-height: 30px;
color: #E9B65F;
overflow: hidden; //超出内容隐藏
.user-list {
width: fit-content; // Q1
white-space: nowrap; // 内容不换行
animation-name: seamless-scrolling; // Q3
animation-timing-function: linear; // 动画速度曲线,匀速
animation-iteration-count: infinite; // 动画循环无限次播放
li {
display: inline-block;
margin-right: 30px;
}
}
}
@keyframes seamless-scrolling {
0% {
transform: translateX(0px);
}
100% {
transform: translateX(-50%); //Q2
}
}
Q1:因为滚动内容一般都不是固定的,需要接口获取,所以内容区的宽度也就无法确定,这里使用CSS3的新特性width: fit-content,使宽度自适应内部内容,至于为什么这里需要设置宽度属性,见下文
Q2:设置动画。由于内容区实际有AB两份,B是A的副本,所以一段动画的终点就是内容区向左位移50%(内容区width的50%),这也就解释了Q1中为什么一定要设置宽度属性了:如果不设置,width的值不会随内容撑开,此时的50%是父容器width的50%,终点值就错了
Q3:为什么animation不采用简写形式,而是拆开? 因为animation-duration 动画时长不能固定,如果接口获取到的数据很多,动画时长固定5s,那滚动地得有多快?所以animation-duration采用属性绑定形式,根据数据长度进行延长
:style="animation-duration: ${luckyUsers.length * 4}s;" 具体乘几看自己喜欢。
我也试过采用简写形式进行style属性绑定,结果发现动画不生效。
3、JS部分
export default {
name: 'app',
data() {
return {
luckyUsers: []
}
},
created() {
this.getLuckyUsersList()
},
methods: {
getLuckyUsersList () {
//调接口拿取数据
this.luckyUsers = [
'000000抽中了xxx奖品',
'111111抽中了xxx奖品',
'222222抽中了xxx奖品',
]
}
}
}
export default {
name: 'app',
data() {
return {
luckyUsers: []
}
},
created() {
this.getLuckyUsersList()
},
methods: {
getLuckyUsersList () {
//调接口拿取数据
this.luckyUsers = [
'000000抽中了xxx奖品',
'111111抽中了xxx奖品',
'222222抽中了xxx奖品',
]
}
}
}
四、总结
四、总结四、总结无缝滚动的实现主要借助了css3中的animation、width:fit-content自适应属性、translate位移等特性;
从实现原理上看,其实就是一个欺骗眼睛的小伎俩而已~