/Users/lucy/IT技术教程课件/开课吧前端教程/全栈课程/2 vue/<br>05课 vue电商项目实战第二节 (2019.5.14)<br>/vue-mart(1)/src/components/CartAnim.vue:<br><br><transition <br><br><b> @before-enter="beforeEnter" <br><br> @enter="enter" <br><br> @afterEnter="afterEnter"</b>><br><br> <div class="ball" v-show="show" :style="pos"><br><br> <div class="inner"><br><br> <div class="cubeic-add"></div><br><br> </div><br><br> </div><br><br> </transition><br>
这里用了<b><font color="#16884a"> flip 动画的思想</font></b>:<br><b>小球的初始位置是最终目的地</b>,即购物车;<br><b>beforeEnter 钩子中将小球移动到点击事件发生的添加物品的图标位置;<br>enter 钩子中再将小球复原;<br>afterEnter 中做清理工作</b>
start
<b>start(el) {<br> // 启动动画接口,传递点击按钮元素<br> this.el = el;<br><span style="font-size: inherit;">//<font color="#16884a"> </font></span><span style="font-size: inherit;"><font color="#16884a">使.ball显示,激活动画钩子</font></span><br> this.show = true;<br> },</b><br>
start 函数很简单,<font color="#16884a">只是将 show 赋值为 true,这样就能触发动画钩子了,<br>动画逻辑都是在动画钩子函数中进行的</font><br>
beforeEnter
<b><font color="#16884a">beforeEnter(el)</font> </b>{<br> //<b> 把小球移动到点击的dom元素所在位置</b><br> const rect = this.el.getBoundingClientRect();<br><br> // 转换为用于绝对定位的坐标<br> const x = rect.left - window.innerWidth / 2;<br> const y = -(window.innerHeight - rect.top - 10 - 20);<br> <br> //<font color="#924517"> <b>ball只移动y</b></font><br><font color="#924517"> el.style.transform = `translate3d(0, ${y}px, 0)`;</font><br><br> //<b><font color="#924517"> inner只移动x</font></b><br> const inner = el.querySelector(".inner");<br><font color="#924517"> inner.style.transform = `translate3d(${x}px,0,0)`;</font><br> },<br>
enter
<font color="#16884a"><b>enter(el, done)</b></font> {<br> // <b>获取offsetHeight触发重绘 </b><br>//<font color="#c41230"> 经过实验,这里的确必须加这么一句话,并且还只能加在这个位置</font><br>// 为什么一定要触发重绘的<font color="#c41230">原因还未弄清楚??</font><br> document.body.offsetHeight;<br><br> // <b>将内外层元素的位置通过 transform 属性的 translate3d 函数放到</b><font color="#924517"><b>动画结束位置,</b><br><b>// 即此元素的初始位置 </b></font><font color="#924517"><b>translate3d(0, 0, 0)</b></font><br><font color="#924517"> el.style.transform = `translate3d(0, 0, 0)`;</font><br> const inner = el.querySelector(".inner");<br><font color="#924517"> inner.style.transform = `translate3d(0,0,0)`;</font><br><b> el.addEventListener("transitionend", done);</b><br> },<br>
afterEnter
<b><font color="#16884a">afterEnter(el)</font> </b>{<br> // <b>动画结束,开始清理工作</b><br><b> this.show = false;<br> el.style.display = "none";</b><br><b><font color="#16884a"> this.$emit("transitionend");</font></b><br> }<br>