用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 相关文章推荐
在线编辑器中换行与内容自动提取
Apr 24 Javascript
jQuery EasyUI API 中文文档 - ProgressBar 进度条
Sep 29 Javascript
基于javascript的JSON格式页面展示美化方法
Jul 02 Javascript
JS 清除字符串数组中,重复元素的实现方法
May 24 Javascript
AngularJs自定义服务之实现签名和加密
Aug 02 Javascript
jQuery实现web页面樱花坠落的特效
Jun 01 jQuery
node使用UEditor富文本编辑器的方法实例
Jul 11 Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
Feb 05 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
Oct 08 Javascript
一些你可能不熟悉的JS知识点总结
Mar 15 Javascript
javascript-hashchange事件和历史状态管理实例分析
Apr 18 Javascript
vue使用element-ui实现表单验证
Dec 13 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 字符串分割和比较
2009/10/06 PHP
php设置允许大文件上传示例代码
2014/03/10 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
原生JS绑定滑轮滚动事件兼容常见浏览器
2014/06/30 Javascript
浅谈JavaScript中null和undefined
2015/07/09 Javascript
浅谈JS中逗号运算符的用法
2016/06/12 Javascript
JS提示:Uncaught SyntaxError:Unexpected token ) 错误的解决方法
2016/08/19 Javascript
javascript创建对象的3种方法
2016/11/02 Javascript
浅谈JavaScript的自动垃圾收集机制
2016/12/15 Javascript
jquery代码规范让代码越来越好看
2017/02/03 Javascript
微信小程序后台解密用户数据实例详解
2017/06/28 Javascript
jQuery 开发之EasyUI 添加数据的实例
2017/09/26 jQuery
Vue-Router基础学习笔记(小结)
2018/10/15 Javascript
Node.js console控制台简单用法分析
2019/01/04 Javascript
js中怎么判断两个字符串相等的实例
2019/01/17 Javascript
使用js在layui中实现上传图片压缩
2019/06/18 Javascript
js实现的格式化数字和金额功能简单示例
2019/07/30 Javascript
微信小程序调用wx.getImageInfo遇到的坑解决
2020/05/31 Javascript
[25:45]2018DOTA2亚洲邀请赛4.5SOLO赛 Sylar vs Paparazi
2018/04/06 DOTA
python调用动态链接库的基本过程详解
2019/06/19 Python
python实现键盘输入的实操方法
2019/07/16 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
Python 实现一个计时器
2020/07/28 Python
激光脱毛、蓝光和护肤:Tria Beauty
2019/03/28 全球购物
微软加拿大官方网站:Microsoft Canada
2019/04/28 全球购物
国外软件测试工程师面试题
2016/12/09 面试题
员工自我鉴定
2013/10/09 职场文书
安全标准化实施方案
2014/02/20 职场文书
汽车技术服务与贸易专业求职信
2014/07/20 职场文书
介绍信样本
2015/01/31 职场文书
营业员岗位职责范本
2015/04/14 职场文书
2015选调生工作总结
2015/07/24 职场文书
生日宴会祝酒词
2015/08/10 职场文书
Python识别花卉种类鉴定网络热门植物并自动整理分类
2022/04/08 Python
让JavaScript代码更加精简的方法技巧
2022/06/01 Javascript
win11怎么消除图标小盾牌?win11消除图标小盾牌解决方法
2022/08/05 数码科技