用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 相关文章推荐
指定js可访问其它域名的cookie的方法
Sep 18 Javascript
javascript function调用时的参数检测常用办法
Feb 26 Javascript
页面调用单个swf文件,嵌套出多个方法。
Nov 21 Javascript
js兼容的placeholder属性详解
Aug 18 Javascript
js函数调用的方式
May 06 Javascript
js实现一个链接打开两个链接地址的方法
May 12 Javascript
JavaScript严格模式下关于this的几种指向详解
Jul 12 Javascript
使用JavaScript实现node.js中的path.join方法
Aug 12 Javascript
vue-rx的初步使用教程
Sep 21 Javascript
vue使用v-if v-show页面闪烁,div闪现的解决方法
Oct 12 Javascript
OpenLayer3自定义测量控件MeasureTool
Sep 28 Javascript
JS实现选项卡插件的两种写法(jQuery和class)
Dec 30 jQuery
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结合redis高并发下发帖、发微博的实现方法
2016/12/15 PHP
PHP7新功能总结
2019/04/14 PHP
laradock环境docker-compose操作详解
2019/07/29 PHP
Safari5中alert的无限循环BUG
2011/04/07 Javascript
基于Jquery插件开发之图片放大镜效果(仿淘宝)
2011/11/19 Javascript
caller和callee的区别介绍及演示结果
2013/03/10 Javascript
Node.js中使用mongoskin操作mongoDB实例
2014/09/28 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
2015/12/01 Javascript
Angular脚手架开发的实现步骤
2019/04/09 Javascript
[32:26]EG vs IG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python根据区号生成手机号码的方法
2015/07/08 Python
使用python实现生成用户信息
2017/03/20 Python
Python元组操作实例分析【创建、赋值、更新、删除等】
2017/07/24 Python
python实现下载pop3邮件保存到本地
2018/06/19 Python
win8下python3.4安装和环境配置图文教程
2018/07/31 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
2018/08/01 Python
numpy添加新的维度:newaxis的方法
2018/08/02 Python
使用pandas实现csv/excel sheet互相转换的方法
2018/12/10 Python
Python3实现获取图片文字里中文的方法分析
2018/12/13 Python
Python实现的拉格朗日插值法示例
2019/01/08 Python
Python之lambda匿名函数及map和filter的用法
2019/03/05 Python
Python中顺序表原理与实现方法详解
2019/12/03 Python
为你的html5网页添加音效示例
2014/04/03 HTML / CSS
美国非常受欢迎的Spa品牌:Bliss必列斯
2018/04/10 全球购物
美国高档帽子网上商店:Hats.com
2018/08/09 全球购物
英国在线滑雪板和冲浪商店:The Board Basement
2020/01/11 全球购物
sleep()方法和wait()方法的区别是什么
2012/11/17 面试题
运动会广播稿300字
2014/01/10 职场文书
数控技校生自我鉴定
2014/03/02 职场文书
合作意向书
2014/07/30 职场文书
高中生期中考试失利检讨书
2014/10/23 职场文书
家属慰问信
2015/02/14 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
《桂花雨》教学反思
2016/02/19 职场文书
2016简单的租房合同范本
2016/03/18 职场文书
JavaScript实例 ODO List分析
2022/01/22 Javascript