1/26 用vue.js简单实现轮播图
花了两天点时间,入门vue.js,学习相关概念,
(花了三块软妹币买了一个某dn的教程,入门了vue.js)
在今天终于把这个轮播给撸出来了,人都傻了
首先整理一下关于vue.js的入门要点,就是我自己觉得的简单结构(给自己写的,大佬高抬贵手)
1 <script> 2 var xxx = new Vue({ 3 // 首先就是挂载的地方,就是你要针对的某个id,或者class 4 el:"#xxx", 5 // 数据仓库,用来放这个html(现阶段是html)里面你要用的数据 6 // 为什么不直接data:{}呢,这个是因为那个相当于死的,如果有组件的,你这就没得副本,就老火了 7 data(){ 8 return{ 9 text1: 1, 10 text2: [{xxx:1},{xxx:2}], 11 ... 12 } 13 } 14 // methods 我们要用的方法 15 methods:{ 16 function1(val){}, 17 function2(val){}, 18 ... 19 }, 20 // 还有watch , created 一些奇奇怪怪的东西 21 22 }) 23 </script>
然后是思路,以前我做轮播图的时候,就是靠原生的js来硬尻,我人傻掉,而且当初只是仿照别的网站上的轮播图来写,根本没有
想到,对于后端这么用,有几个泡泡(按钮)或者是图片,就把弄好的第一个盒子直接ctrl+c ctrl+v ,每一个还要重新弄数据,真的是
麻烦到极点,这也是我为什么想要学vue.js的原因,想要自己生成html,之前学过jsp,有<c:foreach> 但是对于现在前后端分离的
情况下,哪个来学jsp,除非是毕业论文的需要与后端的东西加一起了方便比如jsp+SSM+MySQL
好了,话说回来,思路其实有两点
1.首先是这个图片我要怎么来放
我是这样想的,我们先弄一个大盒子pics,里面有一个很多个小盒子pic,这个[ pic ]是由vue.js里面的v-for生成的,通过 子绝父相 的定位,
让这些图片重起来,入下图
然后是html部分,通过v-for实现从 data里面的 pic_src数组 里面造多少个[ pic ]
2.其次是图片怎么动
我个人认为,问题的处理方式越傻白甜越好,我的脑子不太适合复杂问题,但就是不知道这样处理会不会有一些问题
首先,我们得理清楚这个MVVM这个东西,我是刚入门的小白,但是我觉得这个MVVM很重要,vue.js的特性的嘛
我记得不是很清楚了,我那某dn的课链接挂掉了
主要是MVVM(Model-View-ViewModel)如果熟悉SpringMVC的朋友,应该对ModelAndView这个东西不会陌生,我当初可是弄吐了的
我的个人理解就是
Model 就是传给页面的数据
View 就是展现的视图,是基于Model来展现的
由于一些操作比如input,你可以写一些数据,让前端暂时保留并提交
所以有了这个图
这个时候我记得vue.js就是对这个图改一下,vue.js作为ViewModel来当上了中间人
我的理解就是,有了这个中间人,对model的修改可以直接显示在视图上,而不是过去的一来一回
具体可以参考vue.js的v-model
我又扯了这么多
其实,就是为了给自己再深化一下,MVVM的东西,话回来,说了这么多,其实最重要的东西,我自己给自己总结一下
其实就是 Vue里面 data里的变量,可以直接在view的某个地方改变
这个东西是有好处的,就按照这个轮播来说(仔细想了想好像联系不是很紧密,嘶,管他的),这个图片怎么动,其实我们设计一个
index变量就好了,
0 表示 图片1
1 表示 图片2
2 表示 图片3
...
我们对图片的操作,其实 归根结底 就是对图片的象征 index 的操作
这个时候,我们只需要加上一个watch侦听‘index' 的改变,然后通过handler function对 [ pic ] 的操作 就可以实现了( 当初我也这么以为,但是会出现小Bug )
出现下面bug的前提是我加了对watch里面,加了immediate:true,去掉以后就没了下面的bug,但是这个bug让我明白了,
可能是我的index没有发生改变,然后报错,去掉了immediate后,没有报错,但是还是一样 页面显示不对,是这个样子的
也就是说,第一张图片pic_src[0]的这张图片是没有的,我怀疑可能是index没有改变,所以变不出来,但是加了immediate又还是哪个报错,根本没意义呀
于是
曲线救命
不是有created的吗
开头data里面写一个奇怪的index,随便怎么都行
然后created里面加这个
于是终于出来了(详细百度 vue生命周期),接着就是轮播的东西了,其实轮播来说还比较简单,就是对index操作,有一个setInterval一直都存在的计时器,不和setTimeout一样
里面对index操作,具体不放图片了,放一下效果图
代码
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8" /> 5 <link rel="stylesheet" type="text/css" href="./css/pic.css"/> 6 <title></title> 7 <script src="js/vue.js" type="text/javascript" charset="utf-8"></script> 8 </head> 9 <body> 10 11 <div id="pic_container"> 12 <!-- 这个就是展示图片 --> 13 <!-- <img id="pic" :src="pic_src[index]" ref="pic"> 这个样子的,只改变img的src不好过渡 --> 14 <div id="pics" > 15 <img id="pic" v-for="(item,i) in pic_src" @mouseover="mouseOver()" @mouseout="mouseOut()" :src="item" ref="pic"> 16 </div> 17 18 <!-- 这个是下面的点,用v-for生成的点,用pic_src的大小确定的点,并且要知道这个点的index --> 19 <div id="dots" @mouseover="mouseOver()" @mouseout="mouseOut()"> 20 <div v-for="(count,i) in pic_src.length" @click="index = i" :class="i === index ? 'focus' : '' "></div> 21 </div> 22 23 <div class="arrow_left" @click="onLeft" @mouseover="mouseOver()" @mouseout="mouseOut()"><div></div></div> 24 <div class="arrow_right" @click="onRight" @mouseover="mouseOver()" @mouseout="mouseOut()"><div></div></div> 25 </div> 26 27 </body> 28 29 30 <script> 31 var pic = new Vue({ 32 el:"#pic_container", 33 data(){ 34 return{ 35 timer:null, 36 index: 1, // 作为指示的数值,其最大数值和pic_src.length,即为数组的大小挂钩(因为我想之后的后端传数据可能是json字符串,经过处理到pic_src这里,是个对象数组 37 pic_src:[ 38 "./img/mandalorain.jpg", 39 "./img/wallhaven-5we787.jpg", 40 "./img/wallhaven-oxkjgm.jpg", 41 "./img/IMG_3964.png" 42 ], 43 } 44 }, 45 created(){ 46 this.index = 0, 47 console.log(this.index), 48 this.mouseOut() 49 }, 50 51 methods:{ 52 mouseOut(){ 53 let that = this; 54 this.timer = setInterval( function(){ 55 that.index = (that.index + 1) % that.pic_src.length, 56 console.log(that.index) 57 },3000) 58 }, 59 mouseOver(){ 60 if (this.timer) clearInterval(this.timer); 61 }, 62 // 左箭头 63 onLeft(){ 64 // 左箭头其实就是减少1,我们通过 判断是否大于零,大于零 就是index - 1 ,小于零就用 图片数组的长度减去 65 // index - 1的绝对值 再进行取余 得到最终的index 66 this.index =( this.index - 1) >= 0 ? (this.index - 1) % this.pic_src.length : this.pic_src.length - 67 Math.abs((this.index - 1)) % this.pic_src.length, 68 console.log(this.index) 69 }, 70 onRight(){ 71 this.index = (this.index + 1) % this.pic_src.length, 72 console.log(this.index) 73 }, 74 75 trans(){ 76 // this.$refs.pic[this.index].style.opacity = '1'; 77 for(let i = 0; i < this.pic_src.length; i++){ 78 this.$refs.pic[i].style.opacity = (i === this.index ? '1' : '0') 79 } 80 } 81 }, 82 83 watch:{ 84 'index':{ 85 // immediate:true, 86 handler:function(newValue,oldValue){ 87 // console.log(''+newValue+' '+oldValue+' '+this.index) 88 this.trans() 89 } 90 } 91 }, 92 93 beforeDestroy() { 94 clearInterval(this.timer); 95 this.timer = null; 96 } 97 }) 98 </script> 99 </html>
1 body{ 2 background-color: lightpink; 3 } 4 5 #pic_container { 6 margin: 20px auto; 7 width: 600px; 8 text-align: center; 9 /* overflow: hidden; */ 10 position: relative; 11 } 12 13 #pic{ 14 width: 600px; 15 height: 340px; 16 display: block; 17 box-shadow: 1.5px -1px 3px rgba(0,0,0,0.5); 18 position: absolute; 19 opacity: 0; 20 transition: all 0.5s; 21 } 22 23 #pics{ 24 width: 600px; 25 height: 340px; */ 26 overflow: hidden; 27 position: relative; 28 } 29 30 31 #dots >div { 32 margin: 12px 2px 12px 2px ; 33 width: 15px; 34 height: 9px; 35 border-radius: 2.3px; 36 transition: background-color 0.2s; 37 background-color: hsla(202,60%,100%,0.3); 38 cursor: pointer; 39 display: inline-block; 40 } 41 #dots { 42 margin:0 auto; 43 bottom: 10px; 44 right: auto; 45 left: auto; 46 47 } 48 49 #dots div:hover{ 50 background-color: hsla(202,60%,100%,0.8); 51 } 52 53 54 #dots .focus { 55 background-color:hsla(202,60%,100%,0.8); 56 57 } 58 59 .arrow_left,.arrow_right{ 60 display:block; 61 width:45px; 62 height:108px; 63 position:absolute; 64 top:35%; 65 cursor: pointer; 66 right:-20%; 67 background:linear-gradient( to left, rgba( 0, 0, 0, 0.3) 5%,rgba( 0, 0, 0, 0) 95%); 68 transition: all .5s; 69 } 70 71 .arrow_left{ 72 73 /*//左边距离父盒子边框*/ 74 left:-45px; 75 background: linear-gradient( to right, rgba( 0, 0, 0, 0.3) 5%,rgba( 0, 0, 0, 0) 95%); 76 } 77 .arrow_right{ 78 /*//右边距离父盒子边框*/ 79 right:-45px; 80 background: linear-gradient( to left, rgba( 0, 0, 0, 0.3) 5%,rgba( 0, 0, 0, 0) 95%); 81 } 82 .arrow_right:hover{ 83 background: linear-gradient( to left, rgba( 171, 218, 244, 0.3) 5%,rgba( 171, 218, 244, 0) 95%); 84 } 85 .arrow_left:hover{ 86 background: linear-gradient( to right, rgba( 171, 218, 244, 0.3) 5%,rgba( 171, 218, 244, 0) 95%); 87 } 88 89 .arrow_right div{ 90 display:block; 91 background-image:url(../img/arrow.png); 92 background-repeat: no-repeat; 93 height:36px; 94 width:23px; 95 margin:36px auto; 96 } 97 .arrow_left div{ 98 display:block; 99 background-image:url(../img/arrow.png); 100 background-repeat: no-repeat; 101 height:36px; 102 width:23px; 103 margin:36px auto; 104 } 105 .arrow_left div{ 106 background-position: -23px 0px; 107 } 108 .arrow_right div{ 109 background-position: 0px 0px; 110 }
总结
vue.js应该是入门了,但是我js真的没怎么学,不知道是不是眼高手低,只是碰巧把东西做出来了,总之慢慢跟着官网学,如果有想法就敲想法
1/26