轮播图模块(vue)

通过属性方式传值

值为一个数组、每一项含有imgUrl(图片地址)、link(跳转链接),link为可选属性

<template>
<div class="createBannerArea"> <!-- 图片区域 -->
<div class="imgArea" ref="imgArea" style="marginLeft:0" @mouseenter="onMouseenter" @mouseleave="onMouseleave">
<template v-if="arrUrl[0].link">
<a v-for="(item,index) in arrUrl" :key="index" href="item.link">
<img :src=item.imgUrl :alt="item.imgUrl" srcset="">
</a>
<a href="arrUrl[0].link">
<img :src=arrUrl[0].imgUrl alt="" srcset="">
</a>
</template>
<template v-else>
<img v-for="(item,index) in arrUrl" :key="index" :src=item.imgUrl alt="" srcset="">
<img src=arrUrl[0].imgUrl alt="" srcset="">
</template>
</div> <!-- 小圆圈 -->
<div class="circleArea">
<span ref="circle" v-for="(item,index) in arrUrl" :key="index" @click="onClick(index)"></span>
</div> </div>
</template> <script>
export default {
name: 'createBannerArea',
data(){
return {
timer1: null, // 图片切换定时器
timer2: null, // 图片过渡定时器
time1: 2000, // timer1定时器的时间
time2: 10, // timer2定时器的时间
time3: 500, // 多久完成过渡
index: 0, // 当前显示第几张
circleColor: '#ddd', // 圆圈颜色
activeCirclecolor: '#aaa', // 选中状态时圆圈颜色
}
},
props: {
arrUrl: {
type: Array,
default: function(){
return []
}
}
},
methods: {
onMouseenter(){
clearInterval(this.timer1)
this.timer1 = null
},
onMouseleave(){
this.autoChange()
},
onClick(index){
this.index = index
this.setStatus();
this.autoChange();
},
// 轮播
autoChange(){
if(this.timer1){
clearInterval(this.timer1);
this.timer1 = null
}
this.timer1 = setInterval(() => {
if(this.index == this.arrUrl.length){
this.index = 1;
}else{
this.index ++
}
this.setStatus()
}, this.time1);
}, // 设置动画
setStatus(){
for(var i = 0; i < this.arrUrl.length; i++){
if(i == this.index){
this.$refs.circle[i].style.backgroundColor = this.activeCirclecolor;
}else{
this.$refs.circle[i].style.backgroundColor = this.circleColor;
}
if(this.index === this.arrUrl.length){
this.$refs.circle[0].style.backgroundColor = this.activeCirclecolor;
}
}
var start = parseInt(this.$refs.imgArea.style.marginLeft);
var end = -this.index * 100;
var dis = end - start;
var speed = dis / this.time3;
if(this.timer2){
clearInterval(this.timer2);
this.timer2 = null
}
this.timer2 = setInterval(() => {
start += speed * this.time2;
this.$refs.imgArea.style.marginLeft = start + '%';
if(Math.abs(end - start) < 1){
if(this.index == this.arrUrl.length){
this.$refs.imgArea.style.marginLeft = 0 + '%';
}else{
this.$refs.imgArea.style.marginLeft = end + '%';
}
clearInterval(this.timer2);
this.timer2 = null
}
}, this.time2);
}, // 清除定时器
clearTimer(){
clearInterval(this.timer1);
clearInterval(this.timer2);
}, onVisibilitychange(){
document.addEventListener("visibilitychange", this.isDocuHidden)
},
// 判断页面是hidden还是visible状态,目的是当最小化和切换其他标签页时,停止定时器,优化性能
// visible: 页面内容至少是部分可见。 在实际中,这意味着页面是非最小化窗口的前景选项卡。
// hidden: 页面内容对用户不可见。 在实际中,这意味着文档可以是一个后台标签,或是最小化窗口的一部分,或是在操作系统锁屏激活的状态下。
isDocuHidden(){
if(document.visibilityState == 'hidden'){
this.clearTimer()
}else if(document.visibilityState == 'visible'){
this.autoChange();
}
}
}, beforeDestroy(){
// 当组件销毁前清除定时器和document的事件
this.clearTimer()
document.removeEventListener('visibilitychange',this.isDocuHidden)
}, mounted: function () {
this.$nextTick( () => {
this.autoChange()
this.onVisibilitychange();
})
}
}
</script> <style scoped>
.createBannerArea{
width: 100%;
height: 500px;
overflow: hidden;
outline: 1px solid red;
margin: 10px auto;
}
.createBannerArea .imgArea{
display: flex;
flex-wrap: nowrap;
width: 100%;
height: 100%;
}
.createBannerArea .imgArea a{
flex: 0 0 auto;
width: 100%;
height: 100%;
}
.createBannerArea .imgArea img{
width: 100%;
height: 100%;
}
.circleArea{
margin-top: -25px;
text-align: center;
}
.circleArea span{
display: inline-block;
width: 10px;
height: 10px;
margin: 0 10px;
border-radius: 50%;
background-color: #999;
cursor: pointer;
}
.circleArea span:first-child{
background-color: #777;
}
</style>

轮播图模块(vue)的更多相关文章

  1. 移动端轮播图vue-awesome-swiper

    日常写设计文档,日常写Demo,写轮播图的时候觉得bootstrap不适合移动端,或者说不是轻量级的,于是换成Swiper,但是写的时候才发现怎么把这东西嵌到Vue里面啊? Σ( ° △ °|||)︴ ...

  2. vue轮播图插件vue-awesome-swiper的使用与组件化

    不管是APP还是移动端网页开发,轮播图在大部分项目当中都是存在的,这时候如果用vue开发项目,选择一款好的插件并且封装好是很重要的 1. 推荐使用vue-awesome-swiper 安装:cnpm ...

  3. vue music-抓取歌单列表数据(渲染轮播图)

    下载安装新依赖 babel-runtime:对es6语法进行转译 fastclick:对移动端进行点击300毫秒延迟 ,,取消掉 babel-polyfill:API 先添加,在npm install ...

  4. vue轮播图

    vue开发中遇到这样一个需求实现导航栏和中间内容相结合实现页面滑动导航跟随改变的效果.看效果: 这里我用的是vue所带的插件:vue-awesome-swiper,传送门:https://www.np ...

  5. vue.js学习之better-scroll封装的轮播图初始化失败

    vue.js学习之better-scroll封装的轮播图初始化失败 问题一:slider组件初始化失败 原因:页面异步获取数据很慢,导致slider初始化之后,数据还未获取到,导致图片还未加载 解决方 ...

  6. vue移动音乐app开发学习(三):轮播图组件的开发

    本系列文章是为了记录学习中的知识点,便于后期自己观看.如果有需要的同学请登录慕课网,找到Vue 2.0 高级实战-开发移动端音乐WebApp进行观看,传送门. 完成后的页面状态以及项目结构如下: 一: ...

  7. 用vue写一个仿简书的轮播图

    原文地址:用vue写一个仿简书的轮播图 先展示最终效果: Vue的理念是以数据驱动视图,所以拒绝通过改变元素的margin-top来实现滚动效果.写好css样式,只需改变每张图片的class即可实现轮 ...

  8. vue自定义轮播图组件 swiper

    1.banner 组件 components/Banner.vue <!-- 轮播图 组件 --> <template> <div class="swiper- ...

  9. Vue轮播图插件---Vue-Awesome-Swiper

    轮播图插件 Vue-Awesome-Swiper 地址:https://github.com/surmon-china/vue-awesome-swiper 安装:npm install vue-aw ...

随机推荐

  1. vue2-vux-fitness-project

    非常感谢那些无私开源的程序员,希望我也能够有能力像你们那样,开源很多很有意思的东西~~ //index.html <!DOCTYPE html> <html> <head ...

  2. 【风马一族_php】NO3_php基础知识

    原文来自:http://www.cnblogs.com/sows/p/6001079.html(博客园的)风马一族 侵犯版本,后果自负 回顾 PHP基础语法 1.标签:<?php //PHP 代 ...

  3. codechef Heavy-light Decompositions

    Heavy-light Decompositions Problem Code: HLDOTSSubmit All submissions for this problem are available ...

  4. NS2学习笔记

    这两天在调一个仿真程序,比较奇怪的错误,就是一个节点广播消息,在它通信半径内的节点收不到消息,一直在通信上找问题,找了半天也没找到. 最后,用gdb调试,发现在一个操作指针处发生了段错误,引起的原因时 ...

  5. SAS信用评分之番外篇异常值的识别

    SAS信用评分之番外篇异常值的识别 今天想分享给大家的是我早期建模的时候一个识别异常值的办法,也许你在"信用风险评分卡研究"看过,但是代码只能识别一个变量,我将这个代码作了改良,但 ...

  6. python 异常处理与流程控制

  7. phpexcel使用说明2

      转自:http://serisboy.iteye.com/blog/1928139 首先到phpexcel官网上下载最新的phpexcel类,下周解压缩一个classes文件夹,里面包含了PHPE ...

  8. 2018-7-21-win10-uwp-调用-Microsoft.Windows.Photos_8wekyb3d8bbwe-应用

    title author date CreateTime categories win10 uwp 调用 Microsoft.Windows.Photos_8wekyb3d8bbwe 应用 linde ...

  9. Redis源码解析:09redis数据库实现(键值对操作、键超时功能、键空间通知)

    本章对Redis服务器的数据库实现进行介绍,说明Redis数据库相关操作的实现,包括数据库中键值对的添加.删除.查看.更新等操作的实现:客户端切换数据库的实现:键超时相关功能的实现.键空间事件通知等. ...

  10. iptables 累计(Accounting)

    对於每一条规则,核心各自设置两个专属的计数器,用于累计符合该条件的封包数,以及这些封包的总位元组数.这两项资讯可用於统计网路用量. 举例来說,假设有一台Internet闸道器路,eth0接内部网络,e ...