vue轮播图_用vue实现一个仿简书的轮播图

时间: 2018-04-10阅读: 327标签: vue

先展示最终效果:


解决思路:

Vue的理念是以数据驱动视图,所以拒绝通过改变元素的margin-top来实现滚动效果。写好css样式,只需改变每张图片的class即可实现轮播效果。可以将轮播图看成两个,如图所示:


代码实现:

各个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">
    <div class="main-slide" :style="background: url(${slideConfig[nowIndex].src})"></div>
    <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类型:

import slideConfig from './slideConfig'
const slideLength = slideConfig.length
export default {
    name: 'slider',
    data: function() {
return { slideConfig: slideConfig, slideInterval: null, nowIndex: 0 } }, methods: { resetIndex(i) { return i > slideLength - 1 ? i - slideLength : i }, slideClass(i) { let nowIndex = this.nowIndex 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'] ]) return map.get(i) ? map.get(i) : 'extra-slide-hide' }, start() { this.slideInterval = setInterval(() => { this.nowIndex = this.nowIndex > 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


gitHub传送门:https://github.com/bougieL/jianshuslider
原文地址:http://bougieblog.cn/article/54  


vue2.0之监听属性的使用心得及搭配计算属性的使用

在工作中常常需要监听某一个属性值的变化,这个时候我们就需要用到了监听属性watch,在这里我总结watch属性的三种场景使用希望对你有所帮助

vue路由传参主要的3种方式

vue中路由传参主要的3种方式:query方式(push时使用path来匹配)、params模式(push时使用name来匹配)、location预声明参数模式(push使用path来匹配,但是它跟params模式不同)

解决使用vue.js未渲染前代码显示问题

在使用vue的时候,偶然发现多次刷新或者网络加载缓慢的时候,会一瞬间出现设置的模板的情况。实在很影响美观,可以使用vue现成的指令来解决这个问题:v-cloak

vue之nextTick全面解析

vue是非常流行的框架,他结合了angular和react的优点,从而形成了一个轻量级的易上手的具有双向数据绑定特性的mvvm框架。本人比较喜欢用之。在我们用vue时,我们经常用到一个方法是this.$nextTick

vue中数据更新变化,而页面视图未渲染的解决方案

在使用vue的时候,我们都知道它是双向数据绑定的,但是在使用不熟的情况下,经常会遇到:data中的数据变化了,但是并没有触发页面渲染。下面就整理一些出现这种情况的场景以及解决办法。

Vue组件中prop属性使用说明

props 把数据传给子组件!prop是组件数据的一个字段,期望从父作用域传下来。子组件需要显式地用 props 选项。props的大小写、静态的和动态的 Prop、传入一个数字、传入一个布尔值、Vue的组件中的props属性单向数据流

Vue常用经典开源项目汇总参考-海量

本文主要是收集与整理Vue相关的开源资料,以供需要的朋友参考。主要包含以下几方面的内容:UI组件、开发框架、实用库、服务端、辅助工具、应用实例、Demo示例

vue引用js文件的多种方式

vue引用js文件的多种方式,这里以为引入jquery为例。js引入文件方式包括: vue-cli webpack全局引入jquery、vue组件引用外部js的方法、单vue页面引用内部js方法

vue router的使用_vue路由的相关知识

Vue中的路由根据用户在网页中的点击,将其引导到对应的页面。安装vue-router,路由使用包括:嵌套路由、动态路由、编程式路由、路由重定向

Vue中的scoped及穿透方法

由于scoped看起来很美好,但是含有很多的坑,所以,不推荐不使用scoped属性,而通过在外层dom上添加唯一的class来区分不同组件。这种方法既实现了类似于scoped的效果,又方便修改各种第三方组件的样式,代码看起来也相对舒适