轮播图的过渡效果都是由以下的class切换实现的,需要有所了解,详细到上面链接的官网查看。
过渡的类名
在进入/离开的过渡中,会有 6 个 class 切换。
v-enter:定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。
v-enter-active:定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。
v-enter-to:2.1.8 版及以上定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter 被移除),在过渡/动画完成之后移除。
v-leave:定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。
v-leave-active:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。
v-leave-to:2.1.8 版及以上定义离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave 被删除),在过渡/动画完成之后移除。
对于这些在过渡中切换的类名来说,如果你使用一个没有名字的 ,则 v- 是这些类名的默认前缀。如果你使用了 ,那么 v-enter 会替换为 my-transition-enter。
html
<div class="bannerShuff" ref="banner">
<transition-group tag="ul" class='slide-ul' name="list">
<!-- 设置了name="list",下面的类名都为list开头 -->
<li v-for="(item,index) in bannerImgArray" :key="index" v-show="bannerNum==index">
<div style="position: absolute; z-index: 2; width: 100%; height: 100%;">
<div class="bannerText">banner图上如果有文字放这</div>
</div>
<img id="bannerImg" width="100%" :src="item.src" />
</li>
</transition-group>
<ul class="bannerIndex">
<li v-for="(item,index) in bannerImgArray" :key="index" :class="index==bannerNum?'bannerIndexOn':'bannerIndexLi'"></li>
</ul>
</div>
js
export default{
data(){
return{
bannerNum: 0, //用来控制图片显示
// 轮播图片数组
bannerImgArray:[
{
src: require('@/assets/img/模糊图1.jpg'),
},
{
src: require('@/assets/img/模糊图2.jpg'),
},
{
src: require('@/assets/img/模糊图3.jpg')
}
],
},
method:{
// banner轮播
bannerShuff(){
//定时5s滑动一次
this.timer= setInterval(this.autoPlay,5000);
},
autoPlay(){
this.bannerNum++;
if(this.bannerImgArray.length === this.bannerNum){
this.bannerNum = 0;
}
},
// banner高度自适应,因为banner图宽度自适应屏幕宽度,如果固定高度,图片会显示不全,所以获取宽度*宽高比来设置高度,就能等比缩放图片
autoHeight(){
let that = this;
that.$refs.banner.style.height = this.$refs.banner.clientWidth * (高/宽) + 'px';
}
}
},
mounted() {
this.changeBanner(); //优化图片加载显示
this.$nextTick(function (){
//监听窗口变化,因为只调用一次autoHeight获取的是第一次进入页面时浏览器的宽度,如果窗口变化,高度不会随之改变,所以对窗口变化进行监听,只要有变化,就再次调用
window.onresize = () => {
this.autoHeight();
}
this.autoHeight();
this.bannerShuff();
})
},
beforeDestroy() {
//销毁定时器
clearInterval(this.timer);
}
}
css
.bannerText{ /* 文字的样式 */
width: 1200px;
margin: 0 auto;
font-size: 48px;
color: #FFFFFF;
line-height: 67px;
position: relative;
text-align: left;
padding-top: 12%;
}
.bannerShuff{
position: relative;
width: 100%;
height: 460px;
overflow: hidden;
}
.slide-ul{
width: 100%;
height: 100%;
}
.slide-ul li{
position: absolute;
width: 100%;
height: 100%;
}
/* 图标样式 */
.bannerIndex{
min-width: 1200px;
left: 43%;
position: absolute;
bottom: 38px;
z-index: 30;
}
.bannerIndexLi{
position: relative;
top: -1px;
float: left;
margin-right: 5px;
width: 60px;
height: 5px;
background: rgba(255,255,255,0.5);
}
.bannerIndexOn{
position: relative;
top: -1px;
float: left;
margin-right: 5px;
width: 60px;
height: 5px;
background: #fff;
}
/* 过渡样式 */
.list-enter-to{
transition: all 1s ease;
transform: translateX(0);
}
.list-leave-active{
transition: all 1s ease;
transform: translateX(-100%);
}
.list-enter{
transform: translateX(100%);
}
.list-leave{
transform: translateX(0);
}
实现图片优化加载
如果banner图太大,会导致加载过慢,用户体验不好,可以先加载模糊图,在原图加载完成后替换成清晰图,模糊图就是对图片进行压缩后的,可以缩小图片大小,降低分辨率等
// banner优化
changeBanner(){
let that = this;
let img = new Image();
img.src = require('@/assets/img/原图.jpg');
//这里三张都是同一张图,不同图可增加image
img.onload = function (){
that.bannerImgArray[0].src = img.src;
that.bannerImgArray[1].src = img.src;
that.bannerImgArray[2].src = img.src;
}
}
版权声明:本文为qq_41580337原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。