用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 相关文章推荐
根据分辨率不同,调用不同的css文件
Jul 07 Javascript
从新浪弄下来的全屏广告代码 与使用说明
Mar 15 Javascript
继续学习javascript闭包
Dec 03 Javascript
浅析创建javascript对象的方法
May 13 Javascript
JS开发中基本数据类型具体有哪几种
Oct 19 Javascript
vue微信分享 vue实现当前页面分享其他页面
Dec 02 Javascript
vue父组件异步获取数据传给子组件的方法
Jul 26 Javascript
layerUI下的绑定事件实例代码
Aug 17 Javascript
Jquery的autocomplete插件用法及参数讲解
Mar 12 jQuery
解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题
Aug 14 Javascript
js实现点击按钮随机生成背景颜色
Sep 05 Javascript
在Vue中使用mockjs代码实例
Nov 25 Vue.js
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 cookie 登录验证示例代码
2009/03/16 PHP
php代码架构的八点注意事项
2016/01/25 PHP
Laravel实现ApiToken认证请求
2019/10/14 PHP
Js+XML 操作
2006/09/20 Javascript
YUI 读码日记之 YAHOO.util.Dom - Part.1
2008/03/22 Javascript
jquery 子窗口操作父窗口的代码
2009/09/21 Javascript
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
2010/06/25 Javascript
js输出列表实现代码
2010/09/12 Javascript
jQuery的学习步骤
2011/02/23 Javascript
javascript模拟实现C# String.format函数功能代码
2013/11/25 Javascript
jQuery模拟黑客帝国矩阵效果实例
2015/06/28 Javascript
js实现搜索框关键字智能匹配代码
2020/03/26 Javascript
基于JS实现移动端访问PC端页面时跳转到对应的移动端网页
2020/12/24 Javascript
Javascript实现鼠标框选操作  不是点击选取
2016/04/14 Javascript
JS Ajax请求如何防止重复提交
2016/06/13 Javascript
基于jQuery实现的幻灯图片切换
2016/12/02 Javascript
js实现div色块拖动录制
2020/01/16 Javascript
[03:08]Ti4观战指南上
2014/07/07 DOTA
python中wx将图标显示在右下角的脚本代码
2013/03/08 Python
使用python判断你是青少年还是老年人
2018/11/29 Python
python中多个装饰器的调用顺序详解
2019/07/16 Python
python自动发微信监控报警
2019/09/06 Python
Python二维数组实现求出3*3矩阵对角线元素的和示例
2019/11/29 Python
浅析Python数字类型和字符串类型的内置方法
2019/12/22 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
python将下载到本地m3u8视频合成MP4的代码详解
2020/11/24 Python
Python读写锁实现实现代码解析
2020/11/28 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
2020/12/07 Python
HTML如何让IMG自动适应DIV容器大小的实现方法
2020/02/25 HTML / CSS
Java面试题汇总
2015/12/06 面试题
酒店管理专业学生求职信
2013/09/27 职场文书
护理自荐信
2013/10/22 职场文书
生日寿宴答谢词
2014/01/19 职场文书
故宫英文导游词
2015/01/31 职场文书
公司地址变更通知
2015/04/25 职场文书
关于ObjectUtils.isEmpty() 和 null 的区别
2022/02/28 Java/Android