用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实现上传图片预览的方法
Feb 09 Javascript
JQuery点击行tr实现checkBox选中的简单实例
May 26 Javascript
jQuery插件EasyUI实现Layout框架页面中弹出窗体到最顶层效果(穿越iframe)
Aug 05 Javascript
jQuery判断是否存在滚动条的简单方法
Sep 17 Javascript
react.js 翻页插件实例代码
Jan 19 Javascript
bootstrap select插件封装成Vue2.0组件
Apr 17 Javascript
微信小程序实战之自定义模态弹窗(8)
Apr 18 Javascript
vue-ajax小封装实例
Sep 18 Javascript
通过jQuery学习js类型判断的技巧
May 27 jQuery
基于Node.js搭建hexo博客过程详解
Jun 25 Javascript
js中位数不足自动补位扩展padLeft、padRight实现代码
Apr 06 Javascript
从0搭建vue-cli4脚手架
Jun 17 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
sony ICF-2010 拆解与改装
2021/03/02 无线电
一个很不错的PHP翻页类
2009/06/01 PHP
比较简单实用的PHP无限分类源码分享(思路不错)
2011/10/13 PHP
PHP判断浏览器、判断语言代码分享
2015/03/05 PHP
基于Jquery的实现回车键Enter切换焦点
2010/09/14 Javascript
js解析与序列化json数据(二)序列化探讨
2013/02/01 Javascript
jtable列中自定义button示例代码
2013/11/21 Javascript
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
2013/12/08 Javascript
javascript分页代码实例分享(js分页)
2013/12/13 Javascript
javascript设计模式之解释器模式详解
2014/06/05 Javascript
Javascript获取当前时间函数和时间操作小结
2014/10/01 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
深入分析javascript中console命令
2016/08/14 Javascript
手机注册发送验证码倒计时的简单实例
2017/11/15 Javascript
vuex 使用文档小结篇
2018/01/11 Javascript
详解Angularjs 自定义指令中的数据绑定
2018/07/19 Javascript
JavaScript实现构造json数组的方法分析
2018/08/17 Javascript
Vue render函数实战之实现tabs选项卡组件
2019/04/22 Javascript
详解JavaScript作用域 闭包
2020/07/29 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
详解Python的collections模块中的deque双端队列结构
2016/07/07 Python
Python入门必须知道的11个知识点
2018/03/21 Python
Python企业编码生成系统之主程序模块设计详解
2019/07/26 Python
Pandas 缺失数据处理的实现
2019/11/04 Python
使用Python串口实时显示数据并绘图的例子
2019/12/26 Python
详解PyQt5信号与槽的几种高级玩法
2020/03/24 Python
Keras 中Leaky ReLU等高级激活函数的用法
2020/07/05 Python
英国团购网站:Groupon英国
2017/11/28 全球购物
Currentbody澳大利亚:美容仪专家
2019/11/11 全球购物
美国一家著名的手表在线折扣网站:Discount Watch Store
2020/02/24 全球购物
下列程序在32位linux或unix中的结果是什么
2015/01/26 面试题
幼儿园国庆节活动方案
2014/02/01 职场文书
土木工程求职信
2014/05/29 职场文书
导游词范文之颐和园/重庆/云台山
2019/09/10 职场文书
golang生成vcf通讯录格式文件详情
2022/03/25 Golang
Windows10安装Apache2.4的方法步骤
2022/06/25 Servers