摘要:也嘗試了這個方案,選擇毫秒效果相對最佳。方案繼續(xù)思考一開始的思路為啥出現(xiàn)問題。經(jīng)過老大提醒,并結合千牛之前出現(xiàn)的動畫問題,感覺是動畫結束和控制沒有達到一致。除了過渡有且只有事件,動畫開始,動畫結束事件,動畫重復運動事件。
需求背景
今天運營給了一個需求,要做個引導頁,也就是全屏滾動。考慮到只有3張圖,就自己碼個吧!說干就干。
思路設置一個外層container, 用戶的可見區(qū)域,也就是全屏
container內(nèi)有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是用來滾動內(nèi)容的,所以在頁面進入的時候要獲取用戶區(qū)域
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();邏輯部分
為了防止?jié)L動多次滾動,需要通過一個變量來控制是否滾動,這里的動畫是1s執(zhí)行完,使用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); }
差不多了,大體已經(jīng)完成,在瀏覽器中運行也幾乎完美!但是我們是一家千牛應用,在千牛里面運行,看似不錯,但是鼠標快速移動就會出現(xiàn)閃屏、多滾動問題。
解決問題出現(xiàn)這個問題,第一反應是代碼寫錯了,沒有兼容瀏覽器,但是一想千牛就是chrome內(nèi)核,不需要寫兼容代碼啊!
方案1不采用css動畫,采用jquery動畫。改變top值。
也嘗試了這個方案,選擇800毫秒效果相對最佳。
繼續(xù)思考一開始的思路為啥出現(xiàn)問題。經(jīng)過老大提醒,并結合千牛之前出現(xiàn)的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);
最終結果了滾動出現(xiàn)的問題,再查看每次滾動時間
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/
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87786.html
摘要:的地址首先已經(jīng)更新到版本了,并且從版本摒棄了的依賴,并且之前多種語言對開發(fā)者友好。但是為了兼容不能使用版本,只能使用版本及其以下,雖然說兼容但是實際上并沒有兼容。 fullpage的git地址 首先fullpage 已經(jīng)更新到3.x版本了,并且從3.x版本摒棄了jQuery的依賴,并且之前多種語言對開發(fā)者友好。但是為了兼容ie8不能使用3.x版本,只能使用2.8.9版本及其以下,雖然...
摘要:原生實現(xiàn)全屏滾動點擊箭頭,實現(xiàn)下一頁滾輪事件上滑下滑滾動到對應頁定時器解決函數(shù)連續(xù)執(zhí)行頁面滾動,導航對應變化點擊導航,頁面滾動部分全屏滾動第頁第頁第頁第頁第頁下三角部分容器全屏滾動容器全屏滾動下一頁和部分圖片 原生js實現(xiàn)全屏滾動 fullPage.js function fullPage() { const fullPage = document.getEleme...
摘要:根據(jù)要實現(xiàn)的效果,要做的就是讓緊挨著這一屏不垂直居中到這一屏的時候,再往下的滾動距離就不能是一屏了必須是的高度。 這兩天公司網(wǎng)頁改版用到fullpage.js這個滾屏插件,頁面內(nèi)容整屏的滾動,不成問題,各種設置在網(wǎng)上也都有文檔。而我遇到的問題就是,頁面內(nèi)容不滿屏的時候,和上面的內(nèi)容放一塊就太擠,單獨放一屏就太空,好尷尬的說showImg(https://segmentfault.com...
閱讀 940·2021-09-27 13:36
閱讀 888·2021-09-08 09:35
閱讀 1064·2021-08-12 13:25
閱讀 1437·2019-08-29 16:52
閱讀 2907·2019-08-29 15:12
閱讀 2726·2019-08-29 14:17
閱讀 2606·2019-08-26 13:57
閱讀 1012·2019-08-26 13:51