项目需求,需要写一个卡片化层叠的轮播,找了下插件都没有合适的,于是写了一个展示5个卡片的轮播

先看效果图:

卡片化层叠轮播

5个卡片要计算各自的高度,宽度,利用相对定位计算出各自的位置

然后transition过渡来实现动画效果

由于开头卡片和末尾卡片的滑动整体性,我在config5数组开头和末尾加了2个隐藏的样式。使得有个滑出屏幕的效果

下面是我的代码:

上一个

下一个

当前:{{ centerInfo.id }}

export default {

name: 'zt',

data() {

return {

loading: true,

currentIndex: 3, //当前中间imgs数组中index

centerInfo: '', // 当前中间信息

startX: '',

endX: '',

imgs: [

{

id: '莱因哈特1',

index: 0,

cover:

'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1572888260036&di=875bc88905bf4b6923784df1589edb0b&imgtype=0&src=http%3A%2F%2Fi-1.itobike.com%2F2017%2F5%2F26%2Ff6038942-393f-441e-9380-a2f1607c3385.jpg'

},

{

id: '安娜2',

index: 1,

cover:

'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1572888297322&di=9d5d97f952329ccf2277b2033b129d5d&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201803%2F28%2F20180328101238_VHiji.jpeg'

},

{

id: '卢西奥3',

index: 2,

cover:

'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1573483062&di=9d6983ba28c123896b27148e313ada65&imgtype=jpg&er=1&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201608%2F15%2F20160815133037_4YAfh.jpeg'

},

{

id: 'DVA4',

index: 3,

cover:

'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1572888405708&di=3381891cd042db432083ed2446ddf446&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201805%2F06%2F20180506201144_JPTd3.thumb.700_0.jpeg'

},

{

id: '莫伊拉5',

index: 4,

cover:

'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1572888441984&di=47544529365104e11276d639838741c3&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201801%2F06%2F20180106221938_58EGv.thumb.224_0.jpeg'

},

{

id: '裂空6',

index: 5,

cover:

'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1572888482891&di=5416c6abf187547cd329377dc1092fff&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201610%2F20%2F20161020175323_auiK8.thumb.700_0.jpeg'

},

{

id: '麦克雷7',

index: 6,

cover:

'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1572888500984&di=f415feaef2c02b497e9d3801743b8e49&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201711%2F26%2F20171126191812_4x8RV.thumb.700_0.jpeg'

},

{

id: '士兵76 8',

index: 7,

cover:

'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1573056788040&di=dbf1954ad8ba1bee16afd9f47d763512&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201704%2F24%2F20170424202013_hveir.jpeg'

},

{

id: '狂鼠9',

index: 8,

cover:

'http://ztd00.photos.bdimg.com/ztd/w=700;q=50/sign=ea29fa95c13d70cf4cfaa80dc8e7a03d/42166d224f4a20a4d334946b98529822720ed070.jpg'

},

{

id: '死神 10',

index: 9,

cover:

'http://www.agri35.com/UploadFiles/img_2_4163694432_214245738_26.jpg'

},

{

id: '禅雅塔 11',

index: 10,

cover:

'http://pic2.zhimg.com/v2-1c9b73f260ea2652dcdedfc782fde90d_b.jpg'

},

{

id: '黑百合 12',

index: 11,

cover:

'http://b-ssl.duitang.com/uploads/item/201710/14/20171014134122_KmPQy.jpeg'

}

],

previous: 0,

config5: [

{

id: '-A',

position: 'absolute',

width: '22%',

height: '72%',

top: '19.2%',

left: '-22%',

opacity: 0,

zIndex: 0,

transition: '.4s'

},

{

id: 'A',

position: 'absolute',

width: '22%',

height: '72%',

top: '19.2%',

left: '0%',

opacity: 1,

zIndex: 1,

transition: '.4s'

},

{

id: 'B',

position: 'absolute',

width: '28%',

height: '82%',

top: '14%',

left: '13%',

opacity: 1,

zIndex: 2,

transition: '.4s'

},

{

id: 'center',

position: 'absolute',

width: '45%',

height: '100%',

top: '0px',

left: '50%',

marginLeft: '-22.5%',

opacity: 1,

zIndex: 4,

transition: '.4s'

},

{

id: 'D',

position: 'absolute',

width: '28%',

height: '82%',

top: '14%',

left: '61.8%',

opacity: 1,

zIndex: 2,

transition: '.4s'

},

{

id: 'E',

position: 'absolute',

width: '22%',

height: '72%',

top: '19.2%',

left: '78%',

opacity: 1,

zIndex: 1,

transition: '.4s'

},

{

id: 'E+',

position: 'absolute',

width: '22%',

height: '72%',

top: '19.2%',

left: '100%',

opacity: 0,

zIndex: 0,

transition: '.4s'

}

]

};

},

methods: {

// 获取数据

async getData() {

this.$nextTick(() => {

this.loading = false;

});

},

// 滑动上一个

prev(index) {

// this.imgs.unshift(this.imgs.pop());

this.config5.push(this.config5.shift());

this.currentIndex = this.currentIndex - 1;

if (this.currentIndex < 0) {

this.currentIndex = this.imgs.length - 1;

}

this.centerCard();

this.centerIndex('prev');

},

// 滑动下一个

next() {

// this.imgs.push(this.imgs.shift());

this.config5.unshift(this.config5.pop());

this.currentIndex = this.currentIndex + 1;

if (this.currentIndex > this.imgs.length - 1) {

this.currentIndex = 0;

}

this.centerCard();

this.centerIndex('next');

// console.log(this.currentIndex);

},

// 开始移动端滑动屏幕

start(event) {

this.startX = event.changedTouches[0].clientX;

this.startY = event.changedTouches[0].clientY;

},

// 连续滑动

move(event) {

this.endY = event.changedTouches[0].clientY;

this.endX = event.changedTouches[0].clientX;

this.stopDefault(event);

// 如果是滑动,注解(223行到231行)这段。如果是连续滑动,放开(223行到231行)注解

this.interval = this.endX - this.startX;

if (this.interval > 40) {

this.startX = this.endX;

this.prev();

}

if (this.interval < -40) {

this.startX = this.endX;

this.next();

}

},

// 滑动

end(event) {

// 如果是滑动,放开(236行到238行)的注解。如果是连续滑动,注解(236行到238行)

// this.endY = event.changedTouches[0].clientY;

// this.endX = event.changedTouches[0].clientX;

// this.formatSwiper();

},

formatSwiper() {

if (this.startX > this.endX) {

console.log('左边滑动');

if (this.startX > this.endX + 40) {

this.next();

}

} else {

console.log('右边滑动');

if (this.endX > this.startX + 40) {

this.prev();

}

}

},

// 阻止touchmove的横向默认事件(ios快捷操作会关闭页面)

stopDefault(event) {

let differenceY = this.endY - this.startY;

let differenceX = this.endX - this.startX;

if (Math.abs(differenceX) > Math.abs(differenceY)) {

event.preventDefault();

}

},

// 当前imgs在位置上的index(并非img数组的index)

centerIndex(val) {

if (val == 'prev') {

for (let val of this.imgs) {

if (val.index == this.imgs.length - 1) {

val.index = 0;

} else {

val.index = val.index + 1;

}

}

} else {

for (let val of this.imgs) {

if (val.index == 0) {

val.index = this.imgs.length - 1;

} else {

val.index = val.index - 1;

}

}

}

},

// 点击

chooseItem(item, index) {

let cycles = item.index;

if (item.index < 3) {

for (let i = 0; i < 3 - cycles; i++) {

console.log(item.index);

this.prev();

}

} else if (item.index > 3) {

for (let i = -1; i < item.index - 3; i++) {

this.next();

}

} else if (item.index == 3) {

console.log('投票');

}

},

// 计算中间卡片信息

centerCard() {

this.centerInfo = this.imgs[this.currentIndex];

this.$emit('centerInfo', this.centerInfo);

// this.$emit('centerInfo', this.centerInfo);

// console.log(this.imgs[2].id);

},

addCardStyle() {

if (this.imgs.length > 7) {

let addtime = this.imgs.length - 7;

for (let i = 0; i < addtime; i++) {

console.log('add');

this.config5.push({

id: 'center',

position: 'absolute',

width: '45%',

height: '100%',

top: '0px',

left: '50%',

marginLeft: '-22.5%',

opacity: 0,

transition: '.1s'

});

}

}

}

},

created() {

this.getData();

this.centerCard(); // 获取中间卡片信息

this.addCardStyle();// 加入样式位置的index

}

};

.swiper {

width: 100%;

border: 1px red solid;

height: 400px;

position: relative;

overflow: hidden;

div {

opacity: 0;

}

}

关键就在于config5这个对象中,作为动态的css效果,计算好各个卡片位置,然后:style动态获取样式

可以手动调节样式大小,位置。

当然如果需要展示3个卡片或者7个卡片的话,是需要再次计算各个卡片位置的。

android 层叠轮播,vue手写一个卡片化层叠轮播(支持滑动,移动端连续滚动,点击)...相关推荐

  1. vue手写一个卡片化层叠轮播 五张 三张

    项目需求,需要写一个卡片化层叠的轮播,找了下插件都没有合适的,于是写了一个展示5个卡片的轮播 先看效果图: 5个卡片要计算各自的高度,宽度,利用相对定位计算出各自的位置 然后transition过渡来 ...

  2. 基于vue手写一个分屏器,通过鼠标控制屏幕宽度。

    基于vue手写一个分屏器,通过鼠标控制屏幕宽度. 先来看看实现效果: QQ录屏20220403095856 下面是实现代码: <template><section class=&qu ...

  3. vue手写一个计算器

    计算器大家都不陌生 有计算器机器 有手机计算器 网页计算器! 那么好 今天我来给大家手写一个计算器 啥都不说上操作 请听题:vue手写计算器 一个个小方块拼成一个计算器 绿色比较好 可以缓解视力哦 i ...

  4. Vue手写一个日历组件

    工作中遇到一个需求是根据日历查看某一天/某一周/某一月的睡眠报告,但是找了好多日历组件都不是很符合需求,只好自己手写一个日历组件,顺便记录一下. 先来看看设计图是什么样式, 跟其他日历有点不一样,这个 ...

  5. vue 手写一个时间选择器

    最近研究了 DatePicker 的实现原理后做了一个 vue 的 DatePicker 组件,今天带大家一步一步实现 DatePicker 的 vue 组件. 原理 DatePicker 的原理是- ...

  6. 模拟 Vue 手写一个 MVVM

    原文出自:https://www.pandashen.com MVVM 的前世今生 MVVM 设计模式,是由 MVC(最早来源于后端).MVP 等设计模式进化而来,M - 数据模型(Model),VM ...

  7. vue手写一个简单日历demo

    实现效果: 左右拖拽实现切换月份,PC端自行改为左右点击实现切换 v-touch:swipe.left 左右切换,用的插件:vue2-touch-events transition-group 切换动 ...

  8. 使用Vue手写一个简易的键盘

    <!DOCTYPE html> <html><head><meta charset="UTF-8" /><!-- 引入Vue ...

  9. vue @click 赋值_vue 手写一个时间选择器

    vue 手写一个时间选择器 最近研究了 DatePicker 的实现原理后做了一个 vue 的 DatePicker 组件,今天带大家一步一步实现 DatePicker 的 vue 组件. 原理 Da ...

最新文章

  1. xcode 的一些问题
  2. lepus mysql 复制监控_sql_mode=ONLY_FULL_GROUP_BY 导致lepus监控mysql5.7报错
  3. Android setFocusableInTouchMode 方法使用和源码详解
  4. Silverlight Downloads
  5. 面向过程与面向对象编程的区别和优缺点
  6. php提示密码错误的代码_php 实现密码错误三次锁定账号10分钟
  7. C# GC 垃圾回收机制原理
  8. 使用 ServiceStack 构建跨平台 Web 服务
  9. 为什么公司要努力发展数字化战略
  10. Pytho——装饰器五大实例
  11. springboot + mybatis 学英语网、背单词网站
  12. 陈年老调-log4j(分环境配置+动态修改)
  13. 电视浏览器Emotn V1.0.0.2+悟空跨屏电视输入法
  14. 如何将图片合并成一个pdf文件?
  15. 空间句法软件sDNA安装教程及加载到ArcGIS方法
  16. Trunk支持vlan的范围
  17. vtop工具使用分析
  18. find基础命令与提权教程
  19. win7下php 5.6连接mongodb扩展
  20. C#引用interop.taskscheduler.dll

热门文章

  1. C++基础::文件流
  2. 从随机数生成到随机采样的C++实现
  3. python三层for循环_Python基础入门-For循环
  4. sed 插入多行_文本三剑客之sed
  5. python能做什么-python能用来做什么?这3大主要用途你一定要知道!(实用)
  6. 基于python的在线考试系统-Python程序设计考试系统的开发与应用.pdf
  7. python能做什么excel-使用 Python 可以做什么?
  8. python画简便的图-特征锦囊:常用的统计图在Python里怎么画?
  9. python3.6安装步骤-手动安装python3.6的操作过程详解
  10. vue jsx webpack报错_从零开始,使用webpack高效搭建react工作流