我在PC端项目里同时使用了fullPage.js和wow.js。两个组件的基准冲突了。
原因就是fullPage.js是通过对外容器dowebok的y坐标进行偏移从而进行一屏滚动的,变化的是transitionY的值,如果一屏显示的高度要高于屏幕的高度,fullPage有个附带的slimscroll组件,专门用来控制超出屏幕高度的一屏的滚动,当然滚动控制的方式也是transitionY。
wow.js是一个基于animation.css的组件,它控制动出现、延迟、持续的时间的凭证,都是根据元素的offsetTop,来判断元素现在是否出现在界面上。
这就导致两个组件冲突,因为监控和修改的基准值不同,这个问题网上还是有几种解决方法的【但是都差不多】,我自己也思考了一下,下面是我觉得大概可行的几种方法:
取消dowebok的默认属性,调出浏览器的默认滚动条
方法详述: 网上最认可的一种方法,就是在dowebok的配置中,加上scrollBar:true,可以将浏览器的默认滚动条调出,通过浏览器的默认滚动条,可以实现改变页面的offsetTop的值,从而实现和wow.js一起搭配使用。需要在fullPage的渲染回调afterRender中新建wow对象
问题:
::-webkit-scrollbar { width: 0 !important } //样式代码
修改wow动画的凭证
方法详述: 就是直接把wow动画开始的凭证值offsetTop修改为dowebok的transitionY。
问题: 需要修改wow.js的源码,说起来容易,但是麻烦的要死,这种方法还是尽量不要尝试了。
改用animation.css
方法详述:不用wow了,因为animation.css是可以通过top以外的方式进行调控的,可以在dowebok跳转时,对跳转页面索引index进行监控,给页面中的元素添加animation类。
问题:
不要用fullPage和wow了,用点其他的组件吧,不要吊死在一棵树上。
项目需求详述 :本项目的要求是一屏滚动,每一页的最后一屏是超出屏幕高度需要scrollOverflow的,其他的页面都是贴合全屏,所以为了考虑overflow屏幕的动画,不能使用方法1。打开页面首次滚动到一屏时会加载动画,但是再次回到该屏时动画不再显示,所以单纯的加animation.css样式也不行。
最终解决方法:
将wow和animation混合使用。
有三个需要注意的地方:
function fadeInUp_Load(index, slideIndex, containName) {
if (index == slideIndex) { //进入一屏延时添加动画
$(containName + " .o-hidden").addClass("o-show animated fadeInUp");
setTimeout(function () {
/*
如果一屏中有元素除了上浮特效还有其他特效,
比如slideBox或者superSlide轮播等等
注意延时等待上浮动画创建好之后对动画类进行清除,
否则元素只要进行加载就会再把animated特效演示一遍
*/
$(containName + " .o-hidden").removeClass("animated fadeInUp");
}, 600); //延时时长一般是动画的duration
}
}
function fadeInUp_Leave(index, slideIndex, containName) {
if (index == slideIndex) {
/*
如果只希望动画出现一次,即再次回到该section时不要再加动画,
一种方法是在afterLoad函数中调用闭包函数加类,
另一种方法就如下:在第一次转换出该模块的时候添加一个消除动画样式。
.o-animation-none{
animation-name:none !important;
}
*/
setTimeout(function () {
$(containName + " .o-hidden").addClass("o-animation-none");
}, 200);
}
}
function foot_scroll() {
$(".foot-o-hidden").each(function () {
if ($(this).offset().top < window.innerHeight - 50) { //阈值可以改动
$(this).addClass("o-show animated fadeInUp");
setTimeout(function () {
$(this).addClass("o-animation-none");
}, 600);
}
})
}
function fadeInUp_foot() {
window.addEventListener("wheel", foot_scroll)
setTimeout(function () { //滚动条需要延时监控,否则捕捉不到
$(".slimScrollBar").mousemove(foot_scroll)
}, 1000)
}