用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 相关文章推荐
IE6下CSS图片缓存问题解决方法
Dec 09 Javascript
jqGrid读取选择的多行的某个属性代码
May 18 Javascript
JS实现仿QQ聊天窗口抖动特效
May 10 Javascript
简单实现jquery隔行变色
Nov 09 jQuery
vue对storejs获取的数据进行处理时遇到的几种问题小结
Mar 20 Javascript
Angular Material Icon使用详解
Nov 07 Javascript
详解在网页上通过JS实现文本的语音朗读
Mar 28 Javascript
深入学习js函数的隐式参数 arguments 和 this
Jun 24 Javascript
微信小程序开发(三):返回上一级页面并刷新操作示例【页面栈】
Jun 01 Javascript
JS中的继承操作实例总结
Jun 06 Javascript
详解vue 组件注册
Nov 20 Vue.js
Typescript类型系统FLOW静态检查基本规范
May 25 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
Oracle 常见问题解答
2006/10/09 PHP
php Notice: Undefined index 错误提示解决方法
2010/08/29 PHP
php中对2个数组相加的函数
2011/06/24 PHP
Ping服务的php实现方法,让网站快速被收录
2012/02/04 PHP
thinkphp视图模型查询提示ERR: 1146:Table 'db.pr_order_view' doesn't exist的解决方法
2014/10/30 PHP
php自动获取关键字的方法
2015/01/06 PHP
PHP Primary script unknown 解决方法总结
2019/08/22 PHP
jquery ajax 检测用户注册时用户名是否存在
2009/11/03 Javascript
javascript XMLHttpRequest对象全面剖析
2010/04/24 Javascript
jquery插件制作 表单验证实现代码
2012/08/17 Javascript
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
2013/06/29 Javascript
JavaScript程序设计之JS调试
2015/12/09 Javascript
基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
2016/05/12 Javascript
微信小程序 MINA文件结构
2016/10/17 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
JavaScript禁止微信浏览器下拉回弹效果
2017/05/16 Javascript
vue实现滑动到底部加载更多效果
2020/10/27 Javascript
JS通用方法触发点击事件代码实例
2020/02/17 Javascript
JS如何调用WebAssembly编译出来的.wasm文件
2020/11/05 Javascript
35个Python编程小技巧
2014/04/01 Python
python实现的jpg格式图片修复代码
2015/04/21 Python
Python中用max()方法求最大值的介绍
2015/05/15 Python
简单了解Python下用于监视文件系统的pyinotify包
2015/11/13 Python
Python进阶-函数默认参数(详解)
2017/05/18 Python
linux安装python修改默认python版本方法
2019/03/31 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
详解python中的数据类型和控制流
2019/08/08 Python
python适合做数据挖掘吗
2020/06/16 Python
Lulu Guinness露露·吉尼斯官网:红唇包
2019/02/03 全球购物
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
会计师职业生涯规划范文
2014/02/18 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
2014年纪检部工作总结
2014/11/12 职场文书
毕业实习计划书
2015/01/16 职场文书
教师节感谢信
2015/01/22 职场文书
Nebula Graph解决风控业务实践
2022/03/31 MySQL