Vue图片轮播组件实例代码

灰太狼 2023-01-13 05:54 193阅读 0赞

必备知识:http://github.crmeb.net/u/defu

写轮播页面:HTML+CSS
vue-cli:创建项目
Vue基础:模板语法、计算属性、侦听器、渲染方式(条件渲染、列表渲染)、组件
深入组件:组件注册、父子组件的交互方式、自定义事件
vue过渡:进入、离开过渡
CSS动画:CSS3 transfrom 属性
效果图:
在这里插入图片描述

组件构成:

利用Html 和 CSS 写一个基本的图片轮播页面
这部分很简单吧,常规的显示图片及轮播数字下标。CSS按照自己喜欢的样式随便调整。(最后面会给出我写的完整的CSS样式)

  1. <!-- 布局 -->
  2. <template>
  3. <div class="slide-show">
  4. <div class="slide-img" >
  5. <a href="" >
  6. <img src="" alt="">
  7. </a>
  8. </div>
  9. <h3>{ { title }}</h3>
  10. <ul class="slide-page" >
  11. <li><</li>
  12. <li>
  13. <a href="">1</a>
  14. <a href="">2</a>
  15. <a href="">3</a>
  16. </li>
  17. <li>></li>
  18. </ul>
  19. </div>
  20. </template>

加入响应式的数据驱动
(1)引入数据:

我这里轮播了三张图,需要多一点轮播的,直接加在data中。将轮播的三组数据放在sildes数组中。

我们父组件中的数据:

Tips: 这里加载图片的路径必须使用require引入,方便webpack打包。

  1. data(){
  2. return{
  3. slides:[
  4. {
  5. src:require('../assets/slide1.jpg'),
  6. title:"男人帮特色",
  7. href:'detail/****'
  8. },
  9. {
  10. src:require('../assets/slide2.jpg'),
  11. title:"女神养成计划",
  12. href:'detail/###'
  13. },
  14. {
  15. src:require('../assets/slide3.jpg'),
  16. title:"有腔调的品味",
  17. href:'detail/###'
  18. }
  19. ]
  20. }

(2)数据驱动

依据slide数组,利用v-for列表渲染,v-bind绑定img的src等

随着nowIndex的动态变化显示不同的图片,在nowIndex初始化为0
在这里插入图片描述

(3)添加点击翻页等事件:左右箭头点击上下翻页、点击数字切换到相应的图片

在methods中定义跳转方法goto(index),跳转到index索引图片页

  1. goto(index){
  2. this.nowIndex = index
  3. }

所以 上翻页只需要修改传入的参为preIndex,依据当前的index决定上翻页的Index,(第一页的上翻页为最后一页,考虑循环),所以这里利用计算属性computed;同理,下翻页。
在这里插入图片描述

  1. computed:{
  2. preIndex(){
  3. if(this.nowIndex == 0){
  4. return this.slides.length-1
  5. }else{
  6. return this.nowIndex - 1
  7. }
  8. },
  9. nextIndex(){
  10. if(this.nowIndex == this.slides.length-1){
  11. return 0
  12. }else{
  13. return this.nowIndex + 1
  14. }
  15. }
  16. }

(4)图片自动轮播

使用javascript的setInterval方法实现间隔10ms自动轮播 。指定的时间间隔重复执行代码。(鼠标放在图片上,需要停止动画效果,所以需要利用clearInterval()清除效果)

事件间隔在父级组件指定(v-bind绑定),利用props接收来自父级的数据

runInv需要在加载后调用,利用生命周期中的mounted实现调用

mounted:在模板渲染成html后调用,通常是初始化页面完成后,再对html的dom节点进行一些需要的操作。

  1. props:{
  2. slides:{
  3. type:Array,
  4. default:[]//初始值为空
  5. },
  6. inv:{ //父级传递
  7. type:Number,
  8. default:1000
  9. }
  10. },
  11. methods:{
  12. //幻灯片自动切换
  13. runInv(){
  14. this.invId = setInterval(()=>{
  15. this.goto(this.nextIndex)
  16. },this.inv)
  17. },
  18. clearInv(){
  19. clearInterval(this.invId)
  20. }
  21. },
  22. mounted(){
  23. this.runInv()
  24. }

定义动画
上面的轮播有点生硬,所以我们加上vue过渡效果。

有某一时刻是同时存在两张照片的(CSS中利用overflow:hidden隐藏溢出的图片),所以有两个标签,利用v-if条件渲染让只有一个图片出现

  1. <transition name="slide-trans">
  2. <img v-if="isShow" :src="slides[nowIndex].src" alt="slides[nowIndex].title">
  3. </transition>
  4. <transition name="slide-trans-old">
  5. <img v-if="!isShow" :src="slides[nowIndex].src" alt="slides[nowIndex].title">
  6. </transition>
  7. .slide-trans-enter-active{
  8. transition: all 1s;
  9. }
  10. .slide-trans-enter{
  11. transform: translateX(1200px);
  12. }
  13. .slide-trans-old-leave-active{
  14. transition: all 1s;
  15. transform: translateX(-1200px);
  16. }

vue组件完整代码:

  1. <!-- 布局 -->
  2. <template>
  3. <div class="slide-show" @mouseover="clearInv" @mouseout="runInv">
  4. <!-- v-for="item in slides" -->
  5. <div class="slide-img" >
  6. <a :href="slides[nowIndex].href" >
  7. <!-- 动画 -->
  8. <transition name="slide-trans">
  9. <img v-if="isShow" :src="slides[nowIndex].src" alt="slides[nowIndex].title">
  10. </transition>
  11. <transition name="slide-trans-old">
  12. <img v-if="!isShow" :src="slides[nowIndex].src" alt="slides[nowIndex].title">
  13. </transition>
  14. </a>
  15. </div>
  16. <h3>{ { slides[nowIndex].title }}</h3>
  17. <ul class="slide-page" >
  18. <li @click="goto(preIndex)"><</li>
  19. <li v-for="(item,index) in slides" @click="goto(index)">
  20. <a href="" :class="{on:index == nowIndex}">{ { index + 1}}</a>
  21. </li>
  22. <li @click="goto(nextIndex)">></li>
  23. </ul>
  24. </div>
  25. </template>
  26. <script>
  27. export default {
  28. // props:子组件接受的什么属性
  29. props:{
  30. slides:{
  31. type:Array,
  32. default:[]//初始值为空
  33. },
  34. inv:{ //父级传递
  35. type:Number,
  36. default:1000
  37. }
  38. },
  39. data(){
  40. return{
  41. nowIndex:1,
  42. isShow:true
  43. }
  44. },
  45. computed:{
  46. preIndex(){
  47. if(this.nowIndex == 0){
  48. return this.slides.length-1
  49. }else{
  50. return this.nowIndex - 1
  51. }
  52. },
  53. nextIndex(){
  54. if(this.nowIndex == this.slides.length-1){
  55. return 0
  56. }else{
  57. return this.nowIndex + 1
  58. }
  59. }
  60. },
  61. methods:{
  62. goto(index){
  63. this.isShow = false
  64. setTimeout(()=>{
  65. this.isShow = true
  66. this.nowIndex = index
  67. //index传给父组件,实现交互
  68. // this.$emit('onchange',index)
  69. //
  70. },10)
  71. },
  72. //幻灯片自动切换
  73. runInv(){
  74. this.invId = setInterval(()=>{
  75. this.goto(this.nextIndex)
  76. },this.inv)
  77. },
  78. clearInv(){
  79. clearInterval(this.invId)
  80. }
  81. },
  82. mounted(){
  83. this.runInv()
  84. }
  85. }
  86. </script>
  87. <style scoped>
  88. .slide-trans-enter-active{
  89. transition: all 1s;
  90. }
  91. .slide-trans-enter{
  92. transform: translateX(1200px);
  93. }
  94. .slide-trans-old-leave-active{
  95. transition: all 1s;
  96. transform: translateX(-1200px);
  97. }
  98. /* 淘宝css初始化 */
  99. body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset, legend, button,
  100. input, textarea, th, td { margin:0; padding:0; }
  101. body, button, input, select, textarea { font:12px/1.5tahoma, arial, \5b8b\4f53; }
  102. h1, h2, h3, h4, h5, h6{ font-size:100%; }
  103. address, cite, dfn, em, var { font-style:normal; }
  104. code, kbd, pre, samp { font-family:couriernew, courier, monospace; }
  105. small{ font-size:12px; }
  106. ul, ol { list-style:none; }
  107. a { text-decoration:none; }
  108. a:hover { text-decoration:underline; }
  109. sup { vertical-align:text-top; }
  110. sub{ vertical-align:text-bottom; }
  111. legend { color:#000; }
  112. fieldset, img { border:0; }
  113. button, input, select, textarea { font-size:100%; }
  114. table { border-collapse:collapse; border-spacing:0; }
  115. .slide-show{
  116. height: 400px;
  117. width: 1200px;
  118. position: relative;
  119. overflow: hidden;
  120. }
  121. .slide-show h3{
  122. width: 100%;
  123. position: absolute;
  124. color: #fff;
  125. background-color: #000;
  126. opacity: 0.7;
  127. bottom: 0px;
  128. padding: 10px 0px;
  129. text-indent: 20px;
  130. font-weight: 500;
  131. }
  132. .slide-img img{
  133. width: 1200px;
  134. position: absolute;
  135. top: 0;
  136. }
  137. .slide-page{
  138. right: 15px;
  139. bottom: 0px;
  140. position: absolute;
  141. }
  142. .slide-page .on{
  143. text-decoration: underline;
  144. }
  145. .slide-page li{
  146. list-style: none;
  147. float: left;
  148. display: inline-block;
  149. padding: 0 10px;
  150. cursor: pointer;
  151. color: #fff;
  152. font-size: 14px;
  153. height: 32px;
  154. }
  155. .slide-page li a{
  156. display: block;
  157. float:left;
  158. color: #fff;
  159. text-decoration: none;
  160. }
  161. .slide-page li:hover{
  162. color: #1fdd88;
  163. }
  164. .slide-page a:hover{
  165. color: #1fdd88;
  166. }
  167. </style>

发表评论

表情:
评论列表 (有 0 条评论,193人围观)

还没有评论,来说两句吧...

相关阅读

    相关 vue组件

    写轮播组件的思路: 1、确定传入的参数:轮播图的数据(图片地址,跳转href,图片ID,标题等基础数据)、轮询时间 2、写好轮播图的基本样式,父组件传入参数,动态加载进

    相关 Vue——图片组件

    Notices: 这是我一个项目中的一个子组件,要展示的数据、图片地址等的都在父组件data中。所以后面的讲述都是基于从父组件获取的参数进行处理。(如需将这个SlideShow