用vue2封装轮播图组件
日常练习
用vue2封装轮播图组件,传入图片信息数组。
实现思想:
图片组添加translate动画,通过轮播到第几张图片作为参数,让图片组整体移动。
Carousel.vue
<template> <div class="carousel"> <div class="carouselList"> <!-- 图片列表 --> <ul class="img"> <li v-for="(item,index) in imageList" :key="index" :style="move"> <img :src="item.src" alt=""> </li> </ul> <!-- 圆点列表 --> <ul class="circle"> <li v-for="(item,index) in imageList.length" :key="index" :style="{'backgroundColor':index==imgStatus?'#ffffffc9':'#ffffff7b'}" @click="circleMove(index)"></li> </ul> <!-- 左箭头 --> <div class="leftArrow" @click="leftMove"><</div> <!-- 右箭头 --> <div class="rightArrow" @click="rightMove">></div> </div> </div> </template> <script> export default { name: 'Carousel', props: ['imageList'], data() { return { imgStatus: 0, //浏览到第几张图片 move: null, //图片translate样式 actionTimer: null, //防抖定时器 beginTime: 0, //节流 autoInterval: null //自动轮播定时器 } }, methods: { leftMove() { clearInterval(this.autoInterval); if (!this.actionTimer) { this.imgStatus -= 1; if (this.imgStatus <= 4 && this.imgStatus >= 0) this.moveFun(); if (this.imgStatus == -1) this.imgStatus = 3; this.moveFun(); this.actionTimer = setTimeout(() => {}, 1000); } else { if (this.actionTimer) clearTimeout(this.actionTimer); this.actionTimer = setTimeout(() => { this.imgStatus -= 1; if (this.imgStatus <= 4 && this.imgStatus >= 0) this.moveFun(); if (this.imgStatus == -1) this.imgStatus = 3; this.moveFun(); }, 1000); }; this.autoMove(); }, rightMove() { clearInterval(this.autoInterval); let now = new Date().getTime() if (now - this.beginTime > 1000) { this.imgStatus += 1; if (this.imgStatus == 4) this.imgStatus = 0; this.moveFun(); this.beginTime = now; }; this.autoMove(); }, circleMove(index) { clearInterval(this.autoInterval); this.imgStatus = index; this.moveFun(); this.autoMove(); }, moveFun() { this.move = `transform:translateX(-${this.imgStatus*490}px)`; }, autoMove() { this.autoInterval = setInterval(() => { if (this.imgStatus >= 0 && this.imgStatus < 3) this.imgStatus += 1; else if (this.imgStatus == 3) this.imgStatus = 0; else if (this.imageList == -1) this.imgStatus = 0; this.moveFun() }, 2000); } }, mounted() { this.autoMove(); } } </script> <style scoped> .carousel { position: relative; width: 490px; background-color: lightblue; display: flex; align-items: center; justify-content: center; } .carouselList { background-color: lightcoral; overflow: hidden; } .carouselList .img { width: 400%; } .carouselList .img li { float: left; height: 290px; transition: transform 0.3s ease-in-out; } .carouselList .circle { position: absolute; bottom: 0; left: 195px; width: 100px; height: 50px; display: flex; justify-content: center; align-items: center; } .carouselList .circle li { width: 15px; height: 15px; border-radius: 50%; background-color: #ffffff7b; float: left; cursor: pointer; } .leftArrow { position: absolute; top: 125px; width: 50px; height: 50px; background-color: #cccccc68; font-size: 40px; display: flex; justify-content: center; align-items: center; cursor: pointer; } .leftArrow:hover { background-color: #ccccccc3; } .rightArrow { position: absolute; top: 125px; right: 0px; width: 50px; height: 50px; background-color: #cccccc68; font-size: 40px; display: flex; justify-content: center; align-items: center; cursor: pointer; } .rightArrow:hover { background-color: #ccccccc3; } </style>
App.vue
<template> <div id="app"> <Carousel :imageList="imageList"></Carousel> </div> </template> <script> import Carousel from './components/Carousel.vue' export default { name: 'App', components: { Carousel }, data() { return { imageList: [{ src: require('./images/1.png') }, { src: require('./images/2.png') }, { src: require('./images/3.png') }, { src: require('./images/4.png') } ], } }, } </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } *{ box-sizing: border-box; margin: 0 auto; padding: 0 ; user-select: none; } li{ list-style: none; } </style>
开发遇到的问题
使用v-for循环图片时,item是图片路径,一开始设置为↓,但是找不到图片资源。
1 | '../images/1.png' |
后来将途径改为↓,生效。
1 | require( '../images/1.png' ) |
原因
vue 项目通过webpack 的 devServer 运行之后,默认的 vue-cli 配置下,图片会被打包成 name.hash 的图片名,在这种情况下,如果我们使用固定的 字符串路径则无法找到该图片,所以需要使用 require 方法来返回 图片的编译路径。
在HTML中可以直接使用普通路径,但在js中需要通过require编译路径。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律