Kak*_*kar 6 javascript vue.js vuejs2
假设这是我的模板:
<template>
<div id="Test">
<transition name="fade">
<div class="row" id="RowOne">
<p>Lorem ipsum dolor odit qui sit?</p>
</div>
</transition>
<transition name="fade">
<div class="row" id="RowTwo">
<p>Lorem ipsum dolor sit amet, consectetur.</p>
</div>
</transition>
<transition name="fade">
<div class="row" id="RowThree">
<p>Lorem ipsum dolor sit amet, tenetur!</p>
</div>
</transition>
</div>
</template>
Run Code Online (Sandbox Code Playgroud)
我想RowOne, RowTwo and RowThree分别在视口中显示它时显示和动画.与Laracasts网站一样,当滚动位置到达元素偏移时,元素会显示并生成动画.是否可以使用Vue.js和javascript?
Ikb*_*bel 14
这是你如何做到这一点directive.
Vue.directive('vpshow', {
inViewport (el) {
var rect = el.getBoundingClientRect()
return !(rect.bottom < 0 || rect.right < 0 ||
rect.left > window.innerWidth ||
rect.top > window.innerHeight)
},
bind(el, binding) {
el.classList.add('before-enter')
el.$onScroll = function() {
if (binding.def.inViewport(el)) {
el.classList.add('enter')
el.classList.remove('before-enter')
binding.def.unbind(el, binding)
}
}
document.addEventListener('scroll', el.$onScroll)
},
inserted(el, binding) {
el.$onScroll()
},
unbind(el, binding) {
document.removeEventListener('scroll', el.$onScroll)
delete el.$onScroll
}
})
Run Code Online (Sandbox Code Playgroud)
当您v-vpshow在视口中可见时,您需要为要动画的元素添加指令.
例如:
<div class="row" id="RowOne" v-vpshow>...</div>
Run Code Online (Sandbox Code Playgroud)
该指令使用两个类.
1)before-enter:它默认隐藏元素,并在指令绑定到元素时自动添加.
2)enter:当元素变得可见时,这个应该包含你想要应用的转换.
v-vpshow一旦元素在视口中变得可见(在触发动画之后),将自动解除绑定,从而删除已设置的任何数据和事件侦听器bind.
这是一个有效的例子.
Vue.directive('vpshow', {
inViewport (el) {
var rect = el.getBoundingClientRect()
return !(rect.bottom < 0 || rect.right < 0 ||
rect.left > window.innerWidth ||
rect.top > window.innerHeight)
},
bind(el, binding) {
el.classList.add('before-enter')
el.$onScroll = function() {
if (binding.def.inViewport(el)) {
el.classList.add('enter')
el.classList.remove('before-enter')
binding.def.unbind(el, binding)
}
}
document.addEventListener('scroll', el.$onScroll)
},
inserted(el, binding) {
el.$onScroll()
},
unbind(el, binding) {
document.removeEventListener('scroll', el.$onScroll)
delete el.$onScroll
}
})
new Vue({
el: '#app',
})Run Code Online (Sandbox Code Playgroud)
/* v-vpshow classes */
.before-enter {
opacity: 0;
}
.enter {
transition: opacity 2s ease;
}
/* ---------------- */
.row {
display: flex;
min-height: 500px;
justify-content: center;
font-size: 20px;
font-family: tahoma;
}
#RowOne {
background-color: yellow;
}
#RowTwo {
background-color: #5D576B;
}
#RowThree {
background-color: #F7567C;
}Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.2/vue.min.js"></script>
<div id="app">
<div id="Test">
<div class="row" id="RowOne" v-vpshow>
<p>Lorem ipsum dolor sit amet, consectetur.</p>
</div>
<div class="row" id="RowTwo" v-vpshow>
<p>Lorem ipsum dolor sit amet, consectetur.</p>
</div>
<div class="row" id="RowThree" v-vpshow>
<p>Lorem ipsum dolor sit amet, tenetur!</p>
</div>
</div>
</div>Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4594 次 |
| 最近记录: |