摘要:也尝试了这个方案,选择毫秒效果相对最佳。方案继续思考一开始的思路为啥出现问题。经过老大提醒,并结合千牛之前出现的动画问题,感觉是动画结束和控制没有达到一致。除了过渡有且只有事件,动画开始,动画结束事件,动画重复运动事件。
需求背景
今天运营给了一个需求,要做个引导页,也就是全屏滚动。考虑到只有3张图,就自己码个吧!说干就干。
思路设置一个外层container, 用户的可见区域,也就是全屏
container内有3个层次,每个层次大小都跟container一样大小
每次滚动时候通过css的transform属性进行偏移,并结合transition过渡一下效果
*{ margin: 0; padding: 0; } .container{ position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 99999; overflow: hidden; } .scrollContainer{ display: none; transition: all ease 1s; } .slide1{ background-color: rgb(27, 188, 155); } .slide2{ background-color: rgb(255, 153, 0); } .slide3{ background-color: rgb(123, 170, 190); }
scrollContainer是用来滚动内容的,所以在页面进入的时候要获取用户区域
var $container = $(".container"); var $scroll = $container.find(".scrollContainer"); var height = $container.height(); var len = 3; var current = 1; $container.find(".slide").css("height", height + "px"); $scroll.show();逻辑部分
为了防止滚动多次滚动,需要通过一个变量来控制是否滚动,这里的动画是1s执行完,使用setTimeout延迟1s后解锁,这样大体逻辑差不多
// page控制器 var len = 3; var current = 1; var page = { isScrolling: false, next: function() { if((current + 1) <= len) { current += 1; page.move(current); } }, pre: function() { if(current -1 > 0) { current -= 1; page.move(current); } }, move: function(index) { page.isScrolling = true; var di = -(index-1)*height + "px"; page.start = +new Date(); $scroll.css("transform", "translateY("+di+")"); setTimeout(function(){ page.isScrolling = false; }, 1010); } }; // 滚动事件绑定 function bindMouseWheel (page) { var type = "mousewheel"; var deltaY = 0; function mouseWheelHandle (event) { if (page.isScrolling) {// 加锁部分 return false; } var e = event.originalEvent || event; deltaY = e.deltaY; if (deltaY > 0) { page.next(); } else if (deltaY < 0) { page.pre(); } } $(document).on("mousewheel", mouseWheelHandle); }
差不多了,大体已经完成,在浏览器中运行也几乎完美!但是我们是一家千牛应用,在千牛里面运行,看似不错,但是鼠标快速移动就会出现闪屏、多滚动问题。
解决问题出现这个问题,第一反应是代码写错了,没有兼容浏览器,但是一想千牛就是chrome内核,不需要写兼容代码啊!
方案1不采用css动画,采用jquery动画。改变top值。
也尝试了这个方案,选择800毫秒效果相对最佳。
继续思考一开始的思路为啥出现问题。经过老大提醒,并结合千牛之前出现的css动画问题,感觉是动画结束和js控制没有达到一致。为了验证这个假设,去除setTimeout延迟,添加webkitTransitionEnd事件,并打印出每次滚动时间。
// page控制更改 move: function(index) { page.isScrolling = true; var di = -(index-1)*height + "px"; page.start = +new Date(); $scroll.css("transform", "translateY("+di+")"); }, // 添加了滚动结束控制 moveEnd: function() { page.end = +new Date(); console.log("end", (page.end - page.start)/1000); page.isScrolling = false; } // 给添加滚动结束事件 $scroll.on("webkitTransitionEnd", page.moveEnd);
最终结果了滚动出现的问题,再查看每次滚动时间
end 1.022 end 1.055 end 2.344 end 2.273
在chrome里面查看滚动时间
end 0.999 end 0.994 end 1.006 end 1.023 end 0.991 end 0.997 end 1.005 end 1.046结论
从结果来看在chrome里面css动画几乎没有延迟的跟设定1s过渡时间基本吻合,但是在千牛应用里面能够看出css动画会受其他条件影响,比如上面所遇到的鼠标滚动过快等因素。
所以在css动画这方面就应该用css动画事件来控制。除了过渡有且只有webkitTransitionEnd事件,动画开始webkitAnimationStart,动画结束事件webkitAnimationEnd,动画重复运动事件 webkitAnimationIteration。后面再玩玩
演示地址
本文原地址http://xiaoqiang730730.github.io/2016/06/03/fullpage/
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/87786.html
摘要:的地址首先已经更新到版本了,并且从版本摒弃了的依赖,并且之前多种语言对开发者友好。但是为了兼容不能使用版本,只能使用版本及其以下,虽然说兼容但是实际上并没有兼容。 fullpage的git地址 首先fullpage 已经更新到3.x版本了,并且从3.x版本摒弃了jQuery的依赖,并且之前多种语言对开发者友好。但是为了兼容ie8不能使用3.x版本,只能使用2.8.9版本及其以下,虽然...
摘要:原生实现全屏滚动点击箭头,实现下一页滚轮事件上滑下滑滚动到对应页定时器解决函数连续执行页面滚动,导航对应变化点击导航,页面滚动部分全屏滚动第页第页第页第页第页下三角部分容器全屏滚动容器全屏滚动下一页和部分图片 原生js实现全屏滚动 fullPage.js function fullPage() { const fullPage = document.getEleme...
摘要:根据要实现的效果,要做的就是让紧挨着这一屏不垂直居中到这一屏的时候,再往下的滚动距离就不能是一屏了必须是的高度。 这两天公司网页改版用到fullpage.js这个滚屏插件,页面内容整屏的滚动,不成问题,各种设置在网上也都有文档。而我遇到的问题就是,页面内容不满屏的时候,和上面的内容放一块就太挤,单独放一屏就太空,好尴尬的说showImg(https://segmentfault.com...
阅读 939·2021-09-27 13:36
阅读 885·2021-09-08 09:35
阅读 1063·2021-08-12 13:25
阅读 1436·2019-08-29 16:52
阅读 2906·2019-08-29 15:12
阅读 2725·2019-08-29 14:17
阅读 2605·2019-08-26 13:57
阅读 1011·2019-08-26 13:51