Fork me on GitHub

vue动画效果和vue组件——day03

vue动画效果和vue组件——day03

1.动画实现的三种方式:

1.使用过渡类名:
  1. HTML结构:
<div id="app">
<input type="button" value="跑起来" @click="flag=!flag">
<transition>
<h3 v-if="flag">这是使用过渡类名进行得动画效果~</h3>
</transition>
</div>
  1. VM 实例:
 <script>
var vm = new Vue({
el:'#app',
data:{
flag:false
},
methods:{

}
})
</script>
  1. 定义两组类样式:
<style>
.v-enter,
.v-leave-to {
opacity: 0;
transform: translateX(150px);
}
.v-enter-active,
.v-leave-active{
transition: all 0.8s ease;
}
</style>

v-enter 【这是一个时间点】 是进入之前,元素的起始状态,此时还没有开始进入 v-leave-to 【这是一个时间点】 是动画离开之后,离开的终止状态,此时,元素 动画已经结束了

v-enter-active 【入场动画的时间段】 v-leave-active 【离场动画的时间段】

1.2自定义过渡的类名:

自定义过渡类名,在transition标签内添加一个name属性

1.HTML结构

 <transition name="one">
<h1 v-if="flag">这是一个H1</h1>
</transition>

2.样式结构

<style>
.one-enter,
.one-leave-to {
opacity: 0;
transform: translateY(150px);
}
.one-enter-active,
.one-leave-active{
transition: all 0.8s ease;
}
</style>
2.使用第三方库

animate.css:是一款强大的预设css3动画库http://www.jq22.com/yanshi819

1.导入第三方库

<link rel="stylesheet" type="text/css" href="./lib/animate.css">

2.定义transition属性

  <transition 
enter-active-class="flipInY"
leave-active-class="flipOutX"
:duration="{ enter: 200, leave: 400 }">
<h3 v-if="flag" class="animated">使用第三方库进行动画效果</h3>
</transition>
3.使用钩子函数

上面的两个例子动画是全场动画,而做不到半场动画的效果,使用钩子函数可以做到半场动画效果

1.html结构

 <div id="app">
<input type="button" value="加入购物车" @click="flag=!flag">
<transition @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter">
<div class="ball" v-show="flag"></div>
</transition>
</div>

2.style样式

  <style>
.ball {
background-color: aquamarine;
width: 50px;
height: 50px;
border-radius: 50%;
}
</style>

3.vm实例定义三个methods钩子方法:

methods: {
beforeEnter(el) { // 动画进入之前的回调
el.style.transform = "translate(0, 0)"
},
enter(el, done) { // 动画进入完成时候的回调
//可以认为 el.offsetWidth 会强制动画刷新
el.offsetWidth;
el.style.transform = 'translateX(0px)';

// 这里的 done, 起始就是 afterEnter 这个函数,也就是说:done 是 afterEnter 函数的引用
done();
},
afterEnter(el) { // 动画进入完成之后的回调
this.isshow = !this.isshow;
}
}

注意: 动画钩子函数的第一个参数:el,表示 要执行动画的那个DOM元素,是个原生的 JS DOM对象, 大家可以认为 , el 是通过 document.getElementById('') 方式获取到的原生JS DOM对象

4.列表过渡

使用transition-group标签

1.html

 <transition-group appear tag="ul">
<li v-for="(item, i) in list" :key="item.id" @click="del(i)">
{{item.id}} --- {{item.name}}
</li>
</transition-group>

2.vm实例

<script>
var vm = new Vue({
el: '#app',
data: {
id: '',
name: '',
list: [
{ id: 1, name: '小一' },
{ id: 2, name: '小二' },
{ id: 3, name: '小三' }
]
},
methods: {
add() {
this.list.push({id:this.id,name:this.name})
this.id = this.name = ''
},
del(i) {
this.list.splice(i, 1)
}
}
})
</script>

3.style样式

<style>
li {
border: 1px dashed rgb(187, 3, 233);
margin: 5px;
line-height: 35px;
padding-left: 5px;
font-size: 12px;
width: 100%;
}

li:hover {
background-color: rgb(32, 226, 7);
transition: all 0.8s ease;
}

.v-enter,
.v-leave-to {
opacity: 0;
transform: translateY(80px);
}

.v-enter-active,
.v-leave-active {
transition: all 0.6s ease;
}

/* 下面的 .v-move 和 .v-leave-active 配合使用,能够实现列表后续的元素,渐渐地漂上来的效果 */
.v-move {
transition: all 0.6s ease;
}
.v-leave-active{
position: absolute;
}
</style>

2.vue组件

什么是组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可; 组件化和模块化的不同:

  • 模块化: 是从代码逻辑的角度进行划分的;方便代码分层开发,保证每个功能模块的职能单一;
  • 组件化: 是从UI界面的角度进行划分的;前端的组件化,方便UI组件的重用
1.使用 Vue.extend 配合 Vue.component 方法:

通过 template 属性,指定了组件要展示的HTML结构

var login = Vue.extend({
template: '<h1>这是使用 Vue.extend 创建的组件</h1>'
});
2.直接使用 Vue.component 方法:

使用 Vue.component('组件的名称', 创建出来的组件模板对象)

如果使用 Vue.component 定义全局组件的时候,组件名称使用了 驼峰命名,则在引用组件的时候,需要把 大写的驼峰改为小写的字母,同时,两个单词之前,使用 - 链接;

如果不使用驼峰,则直接拿名称来使用即可;

Vue.component('register', {
template: '<h1>这是直接使用 Vue.component 创建出来的组件</h1>'
});
3.将模板字符串,定义到script标签:
<!-- 在 被控制的 #app 外面,使用 template 元素,定义组件的HTML模板结构  -->
<template id="tmpl">
<div>
<h1>这是通过 template 元素,在外部定义的组件结构,这个方式,有代码的只能提示和高亮</h1>
<h4>好用,不错!</h4>
</div>
</template>
<div id="app2">
<mycom3></mycom3>
<login></login>
</div>
Vue.component('mycom3', {
template: '#tmpl'
})

注意: 组件中的DOM结构,有且只能有唯一的根元素(Root Element)来进行包裹!

posted @ 2020-03-14 12:12  清酒一杯  阅读(425)  评论(0)    收藏  举报