用vue写一个仿简书的轮播图的示例代码


Posted in Javascript onMarch 13, 2018

1.先展示最终效果:

用vue写一个仿简书的轮播图的示例代码

2.解决思路

Vue的理念是以数据驱动视图,所以拒绝通过改变元素的margin-top来实现滚动效果。写好css样式,只需改变每张图片的class即可实现轮播效果。动画效果交给transition完成。可以将轮播图看成两个(mainSlide和extraSlide),各个图片的位置如图所示:

用vue写一个仿简书的轮播图的示例代码

3.代码实现

各个slide的样式:

$width: 800px;   // 容器宽度
$height: 300px;   // 容器高度
$bWidth: 500px;   // 大图片宽度
$sWidth: $width - $bWidth; // 小图片宽度
$sHeight: $height / 2; // 小图片高度
#slider-wrapper{
  width: $width;
  height: $height;
  margin: 0 auto;
  cursor: pointer;
  background: #ddd;
  border-radius: 5px;
  box-shadow: 0 1px 6px rgba(0,0,0,0.117647), 0 1px 4px rgba(0,0,0,0.117647);
  display: flex;
  overflow: hidden;
  div{
    display: inline-block;
  }
}
.main-slide{
  width: $bWidth;
  height: $height;
  float: left;
  transition: all .4s ease;
}
.extra-slide{
  width: $sWidth;
  position: relative;
  .extra-slide-item{
    position: absolute;
    width: $sWidth;
    height: $sHeight;
    left: 0;
    transition: .4s ease-out;
  }
  .extra-slide-top{
    top: -$sHeight;
  }
  .extra-slide-middle-first{
    top: 0;
    z-index: 2
  }
  .extra-slide-middle-second{
    top: $sHeight;
    z-index: 2
  }
  .extra-slide-bottom{
    top: $height
  }
  .extra-slide-hide{
    display: none!important;
  }
}

模板包含两个轮播图:

<div id="slider-wrapper" @mouseover="stop" @mouseout="start">
  <!-- 轮播图1,mainSlide -->
  <div class="main-slide" :style="`background: url(${slideConfig[nowIndex].src})`"></div>
  <!-- 轮播图2,extraSlide -->
  <div class="extra-slide">
    <div class="extra-slide-item" :class="slideClass(i)" v-for="(v, i) in slideConfig" :key="i" :style="`background: url(${v.src}); background-size: cover`"></div>
  </div>
</div>

scripts部分,设置一个nowIndex,定时改变nowIndex。所有图片的class根据这个nowIndex来变化,这里使用了es6的map类型,详情点击:https://3water.com/article/111734.htm

export default {
  name: 'slider',
  data: function() {  
    return {
      slideInterval: null,
      nowIndex: 0,
      slideLength: this.slideConfig.length
    }
  },
  props: {
    slideConfig: {
      type: Array
    }
  },
  methods: {
    // 限制index不能超出图片列表长度
    resetIndex(i) {
      return i > this.slideLength - 1 ? i - this.slideLength : i
    },
    slideClass(i) {
      let nowIndex = this.nowIndex
      // Map就是key也可以是非字符串的对象,不用Map多写几个 if else 也可以
      let map = new Map([
        [this.resetIndex(nowIndex), 'extra-slide-top'],
        [this.resetIndex(nowIndex + 1), 'extra-slide-middle-first'],
        [this.resetIndex(nowIndex + 2), 'extra-slide-middle-second'],
        [this.resetIndex(nowIndex + 3), 'extra-slide-bottom']
      ])
      // 图片的class根据nowIndex的变化而变化
      return map.get(i) ? map.get(i) : 'extra-slide-hide'
    },
    start() {
      // 定时改变nowIndex
      this.slideInterval = setInterval(() => {
        this.nowIndex = this.nowIndex > this.slideLength - 2 ? 0 : this.nowIndex + 1
        console.log(this.nowIndex)
      }, 2000)
    },
    stop() {
      clearInterval(this.slideInterval)
      this.slideInterval = null
    }
  },
  mounted() {
    this.start()
  },
  destroyed() {
    this.stop()
  }
}

slideConfig,组件的props:

const prefix = '/src/assets/'
const slideConfig = [{
 src: prefix + 's1.jpg',
 title: '图1',
 desc: '说明1'
}, {
 src: prefix + 's2.jpg',
 title: '图2',
 desc: '说明2'
}, {
 src: prefix + 's3.jpg',
 title: '图3',
 desc: '说明3'
}, {
 src: prefix + 's4.jpg',
 title: '图4',
 desc: '说明4'
}, {
 src: prefix + 's5.jpg',
 title: '图5',
 desc: '说明5'
}, {
 src: prefix + 's6.jpg',
 title: '图6',
 desc: '说明6'
}]
export default slideConfig

使用:

<slider :slideConfig="slideConfig" />

2018/3/12 16:55 : slideConfig已修改成Props,提取slider.vue就可以直接用了

gitHub传送门:https://github.com/bougieL/jianshuslider

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Jquery 常用方法经典总结
Jan 28 Javascript
js获取时间(本周、本季度、本月..)
Nov 22 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
Apr 25 Javascript
jQuery中nextAll()方法用法实例
Jan 07 Javascript
jQuery随机密码生成的方法
Mar 09 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
Sep 04 Javascript
非常棒的jQuery图片轮播效果
Apr 17 Javascript
自动适应iframe右边的高度
Dec 22 Javascript
JS数组操作中的经典算法实例讲解
Jul 26 Javascript
微信小程序实现传递多个参数与事件处理
Aug 12 Javascript
在vue项目中 实现定义全局变量 全局函数操作
Oct 26 Javascript
React四级菜单的实现
Apr 08 Javascript
vue-cli脚手架引入图片的几种方法总结
Mar 13 #Javascript
解决vue-cli创建项目的loader问题
Mar 13 #Javascript
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
Mar 13 #Javascript
基于vue.js实现的分页
Mar 13 #Javascript
微信小程序中实现手指缩放图片的示例代码
Mar 13 #Javascript
基于vue中css预加载使用sass的配置方式详解
Mar 13 #Javascript
Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解
Mar 13 #Javascript
You might like
php中文字符截取防乱码
2008/03/28 PHP
php中CI操作多个数据库的代码
2012/07/05 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
2014/03/18 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
PHP两个n位的二进制整数相加问题的解决
2018/08/26 PHP
jQuery.validate 常用方法及需要注意的问题
2013/03/20 Javascript
js propertychange和oninput事件
2014/09/28 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
AngularJS Bootstrap详细介绍及实例代码
2016/07/28 Javascript
vue.js表格组件开发的实例详解
2016/10/12 Javascript
最常见的左侧分类菜单栏jQuery实现代码
2016/11/28 Javascript
JavaScript获取短信验证码(周期性)
2016/12/29 Javascript
Easyui ueditor 整合解决不能编辑的问题(推荐)
2017/06/25 Javascript
Bootstrap Table从零开始
2017/06/30 Javascript
使用JavaScript实现表格编辑器(实例讲解)
2017/08/02 Javascript
基于jquery的on和click的区别详解
2018/01/15 jQuery
JavaScript数组去重的方法总结【12种方法,号称史上最全】
2019/02/28 Javascript
socket在egg中的使用实例代码详解
2019/05/30 Javascript
小程序实现层叠卡片滑动效果
2019/08/26 Javascript
小程序实现锚点滑动效果
2019/09/23 Javascript
python多线程之事件Event的使用详解
2018/04/27 Python
Python 删除整个文本中的空格,并实现按行显示
2018/07/24 Python
利用Python对文件夹下图片数据进行批量改名的代码实例
2019/02/21 Python
Pytorch 之修改Tensor部分值方式
2019/12/27 Python
Django Haystack 全文检索与关键词高亮的实现
2020/02/17 Python
浅谈pytorch池化maxpool2D注意事项
2020/02/18 Python
Python numpy多维数组实现原理详解
2020/03/10 Python
python实现快速文件格式批量转换的方法
2020/10/16 Python
Python根据URL地址下载文件并保存至对应目录的实现
2020/11/15 Python
小学生教师节演讲稿
2014/09/03 职场文书
2014年学校卫生工作总结
2014/11/20 职场文书
买卖合同纠纷代理词
2015/05/25 职场文书
浅谈Nginx 中的两种限流方式
2021/03/31 Servers
Golang 编译成DLL文件的操作
2021/05/06 Golang
解决Tkinter中button按钮未按却主动执行command函数的问题
2021/05/23 Python