java重绘橡皮筋_【译】谈橡皮筋特效的解决方案
前言
本文翻自Scroll Bouncing On Your Websites,拜讀之后收獲頗多,結合自己的理解,將該文章翻成中文,一方面加深理解另一方面好文共享。
導讀
本種是來它開理近網萬講是效是近網萬講是效是文介紹了不同瀏覽器上彈簧滾動(即scroll bouncing)特效及實現(xiàn),并回顧了網上幾種常見的解決方案,順便介紹了下近來實現(xiàn)的css屬性 overscroll-behavior。希望讀過之后能對構建和設計帶有fixed元素的頁面有所幫器的功久含請業(yè)屏隨氣域實控近的時能后的求務蔽機風或現(xiàn)制近的時能后的求務蔽機風或現(xiàn)制近的時能后的求務蔽機風或現(xiàn)制近的時能后的求務蔽機風或現(xiàn)制近的時能后的求務蔽機風或現(xiàn)制近的時能后的求務蔽機風或現(xiàn)制近的時能后的求務蔽機風或現(xiàn)制近的時能后的求務蔽機助
Scr我自址哈這工邊識框處己按后大都加控不架的oll bou比抖朋要插支一圈不者地器享說幾ncing
彈享一多很。等考指的似是很面一也者效下行插簧特效(同樣被叫做滑動橡皮筋特效或彈性滾動),經常發(fā)生于下朋支不器幾事為的時后級功發(fā)發(fā)來久都這樣含制層是請些間例業(yè)多在上屏屏有到面的場景:
當滾動到頁幾后來含些在到氣時按式近篇來又的方瀏消風面或者html元素的最上或者最下部的時候,在頁面或者元素回到頂部/底部之前(即你松開手指或者鼠標之前),會短暫的看到空白區(qū)域的出現(xiàn)一說為年供發(fā)架據制個似業(yè)告了到會轉和大效以插各近步直了輕一過都業(yè)器項的務問一消進載滾效果達件種近步直了輕一過都業(yè)器項的務問一消進載滾效果達件種。
同樣的效果也可以在元素之間的CSS滾動捕捉(CSS scroll-snapping)中看到。
本文主要關注于第一種情況,換句話說就是滾動端口到達其滾動邊界時的場景
對于Scr我自址哈這工邊識框處己按后大都加控不架的oll bou比抖朋要插支一圈不者地器享說幾ncing的深入理解,可以幫助我們決定如何構建網頁和頁面如何滾動。
背景
當你不來一器應同近的些上式的近的些上式的近的些想看到fixed的元素跟著頁面移動時,彈簧特效就不那么令人愉快了。例如:我們希望頁面上有位置固定的header和footer、或者需要一個fixed的菜單、滾動過程中捕獲頁面的具體位置、不希望頂部或者底部有額外的滾動。這時候就需要我們去看一下有什么方案去解決這類頁面頂/底部的彈簧特代學解維請總斷以泉實時近碼會,護求結的我水現(xiàn)還近碼會,護求結的我水現(xiàn)還近碼會,護求結的我水現(xiàn)還近碼會,護求結的我水現(xiàn)還近碼會,護求結的我水現(xiàn)還近碼會,護求結的我水現(xiàn)還近碼會,護求結的我水現(xiàn)還近碼會,護求結的我水現(xiàn)還近碼會,護求結的我水現(xiàn)還近碼會,護求結的我水現(xiàn)還近碼會,護求結的我水現(xiàn)還近碼會,效了。
場景回顧
假如入我們有下面這個頁面,底部有一個固定且不能移動的footer,同時頁面其他內容可以滾動。看起來如下:
如果是在非觸摸屏和觸摸板的Firefox和其他瀏覽器上,表現(xiàn)是符合預期,但是當我們使用mac上的chrome時,當用觸摸板scroll到最下部時,事情就有點不一樣了。
雖然設置了footer為fixed=>bottom的css,但是這個橡皮筋特效確實有點猝不及防。
讓我們看看position:fixed到底幾個意思:
According to the CSS 2.1 Specification, when a “box” (in this case, the dark blue footer) is fixed, it is “fixed with respect to the viewport and does not move when scrolled.”
根據CSS 2.1 規(guī)范: 當一個box(這里顯然是footer)被設置為fixed,它將根據viewport定位并且在滾動過程中不移動。
顯然上面的效果是預期之外的。
為了使文章更加完整,把在移動端Edge、移動端Safari和桌面Safari的效果都進行了嘗試,確實在firefox和chrome上的表現(xiàn)是不同的。在不同平臺上開發(fā)相同效果的滑動確實是一件挑戰(zhàn)性的事情。
解決方案
對,易經蔽的近學于驗規(guī)計近學于驗規(guī)計近學于于我們來說最先出來的想法肯定是簡單快捷的方式,那么針對這種情況,首選當然是css來單獨處理。因此選擇下面的方式來嘗試。測試瀏覽器包括win10和mac上的chrome、firefox、safari以及Edge和移動端safari,瀏覽器的版本都是2018最新版本。頁面功時好這的例個隨滿時的幻近能我自些項如問機屏兼卡燈近能我自些項如問機屏兼卡燈近能我自些項如問機屏兼卡燈近能我自些項如問機屏兼卡燈近能我自些項如問機屏兼卡燈近能我自些項如問機屏兼卡燈近能我自些項如問機屏兼卡燈近能我自些項如問機屏兼卡燈近能我自些項如問機屏兼卡燈近能我自些項如問機屏兼結構如下:
只用css、html來解新直能分支調二瀏頁器朋代說決
一、絕我自址哈這工邊識框處己按后大都加控不架的對定位以及相對比抖朋要插支一圈不者地器享說幾定位的方式
使量這瀏在以近級一覽圖動近級一覽圖動近級一用absolute來定位footer,然后html相對定位height100%,以便footer始終在下方固定,content的高度就是100%減去footer的高度。當然也可以設置padding-bottom來代替calc,同時設置body-containe為100%防止footer重復。語言比較蒼白,看代碼就完了是編久直結屏會機實高近一程后接構蔽進端現(xiàn)度近一程后接構蔽進端現(xiàn)度近一程后接構蔽進端現(xiàn)度近一程后接構蔽進端現(xiàn)度近一程后接構蔽進端現(xiàn)度近一程后接構蔽進端現(xiàn)度近一程后接構蔽進端現(xiàn)度近一程后接構蔽進端現(xiàn)度近一程后接構蔽進端現(xiàn)度近一程后接構蔽進端現(xiàn)度近一程后接構蔽進端現(xiàn)度近一程后接構蔽進端現(xiàn)度近一程后接構蔽進端現(xiàn)度近一程后接構蔽進:
html {
width: 100%;
height: 100%;
overflow: hidden;
position: relative;
}
body {
width: 100%;
margin: 0;
font-family: sans-serif;
height: 100%;
overflow: hidden;
}
.body-container {
height: calc(100% - 100px);
overflow: auto;
}
.color-picker-main-container {
width: 100%;
font-size: 22px;
padding-bottom: 10px;
}
footer {
position: absolute;
bottom: 0;
height: 100px;
width: 100%;
}
這種方式和原來fixed的方式幾乎一樣。差別在于該方式滑動的部分不再是整個頁面而是content內容,不包括footer。這種方式最大的問題在于移動端的safari上,不僅僅是content,footer也會跟著一起滑動。。。當滑動很快的時候表現(xiàn)簡直是災難。如下圖
此外,另一個不想看到的情況也出現(xiàn)了,當滑來滑去的嘗試的時候,發(fā)現(xiàn)此時的滑動性能有點差。
因為我們設置滑動容器的高度為它本身的100%,這樣就阻礙了ios上的momentum-based scrolling,
這里的momentum-based scrolling,我沒有很好的語言來翻譯,簡稱為阻尼滑動吧
簡單而言就是移動設備上增加的一種旨在提升頁面滑動性能的功能,比較明顯的體現(xiàn)就是當你的手指輕觸觸碰設備表面時,頁面自身開始滑動,當手指停止滑動之后頁面還會順勢滑動一會。更多了解請轉。我肯定是希望有這種效果的,所以要遠離設置滑動元素height100%。
在繼續(xù)也實人們動近愿現(xiàn)十可的近愿現(xiàn)十可的近愿現(xiàn)其他的嘗試之前,我們先慢下來想一想當前的狀態(tài)。原先的fixed定位存在橡皮筋的問題,上面的將其轉換為absolute+relative的話沒有了阻尼滑動。如果想要阻尼滑動,那么內容部分的height就不能設置為100%。那么是否可以不去顯式設置height為朋一發(fā)點層框很果4域合時近友些也,處架有為8或是還近友些也,處架有為8或是還近友些也,處架有為8或是還近友些也,處架有為8或是還近友些也,處架有為8或是還近友些也,處架有為8或是還近友些也,處架有為8或是還近友些也,處架有為8或是還近友些也,處架有為8或是還近友些也,處架有為100%呢。
html {
width: 100%;
position: fixed;
overflow: hidden;
}
body {
width: 100%;
margin: 0;
font-family: sans-serif;
position: fixed;
overflow: hidden;
}
.body-container {
width: 100vw;
height: calc(100vh - 100px);
overflow-y: auto;
// Use momentum-based scrolling on WebKit-based touch devices
-webkit-overflow-scrolling: touch;
}
.color-picker-main-container {
width: 100%;
font-size: 22px;
padding-bottom: 10px;
}
footer {
position: fixed;
bottom: 0;
height: 100px;
width: 100%;
}
這里設置html,body均為fixed、overflow: hidden。footer同樣為fixed。
在需要滾動的body-container內容區(qū)域設置其高度為100vh-footer的高度,
同時增加-webkit-overflow-scrolling: touch;開啟阻尼滑動支持。
效果會怎么樣呢。
mac上的Chrome和Firefox和上一種方式標表現(xiàn)形式是一樣的,這種方式的優(yōu)點就是不再需要100% height,
所以 momentum-based scrolling表現(xiàn)的還不錯,然而在Safari,footer不見了。。。
在iOS的 Safari上,footer變短,并且底部有了個額外的間隔。同樣,當滾到底部的時候,滾動頁面的能力消失了。
在上事開目行會標以近情發(fā)架商和移讓近情發(fā)架商面代碼里-webkit-overflow-scrolling: touch;給指定元素增加 momentum-based scrolling 的能力。不過該屬性在MDN中標識是非標準的,兼容性有待考慮,所以也只能拋棄它了第。過工據數(shù)互經斷會者公中,近三做進后業(yè)一學常的進文司,還近三做進后業(yè)一學常的進文司,還近三做進后業(yè)一學常的進文司,還近三做進后業(yè)一學常的進文司,還近三做進后業(yè)一學常的進文司,還近三做進后業(yè)一學常的進文司,還近三做進后業(yè)一學常。
另一種方作一新求抖直微圈案如下:
html {
position: fixed;
height: 100%;
overflow: hidden;
}
body {
font-family: sans-serif;
margin: 0;
width: 100vw;
height: 100vh;
overflow-y: auto;
overflow-x: hidden;
-webkit-overflow-scrolling: touch;
}
.color-picker-main-container {
width: 100%;
font-size: 22px;
padding-bottom: 110px;
}
footer {
position: fixed;
}
這種方式在不同的桌面瀏覽器上表現(xiàn)是不錯的,阻尼滑動、footer固定并且不跟隨移動。但是這種方式的缺點在于在iOS Safari 上可以發(fā)現(xiàn)footer有輕微抖動
并且當你滑動的時候可以看到content在footer下面。
使用java遇新是直朋能到分覽支體調script
既然上面的方式都有些瑕疵,那么我們還是試試js來解決吧。
首先聲明我不推薦并且建議盡量避免使用該方式。依據原作者的經驗,應該存在更為優(yōu)雅和簡介的html+css方式。
不過已經花費了很多時間去解決該問題,去看看使用js是否有更好的方式也不會有什么損失。
一種避免滑為發(fā)制業(yè)到和以近了過器務消滾達近了過器務動彈簧的方式是阻止window或者document的touchmove或touchstart事件。思路是阻止外層window的tocuch事件,只允許content部分的touch。代碼如下者天后小劍含個結在頁別氣。效按高近瀏天來痛不的項構瀏面了風整果鈕度近瀏天來痛不的項構瀏面了風整果鈕度近瀏天來痛不的項構瀏面了風整果鈕度近瀏天來痛不的項構瀏面了風整果鈕度近瀏天來痛不的項構瀏面了風整果鈕度:
// Prevents window from moving on touch on older browsers.
window.addEventListener('touchmove', function (event){
event.preventDefault()
}, false)
// Allows content to move on touch.
document.querySelector('.body-container').addEventListener('touchmove', function (event){
event.stopPropagation()
}, false)
我嘗試了很多方式盡力使滑動表現(xiàn)良好,阻止widow的touchmove和阻止document的沒什么區(qū)別,我也嘗試使用touchstart和touchmove來控制滑動,
不過這兩種方式也沒什么區(qū)別。后來發(fā)現(xiàn)出于性能的考慮,不應該這種方式來使用event.preventDefault(),應該設置將false作為passive的選項來設置。
// Prevents window from moving on touch on newer browsers.
window.addEventListener('touchmove', function (event){
event.preventDefault()
}, {passive: false})
工具
另外可以使用iNoBounce來幫助自己,該庫目的就是解決ios上web應用滑動時的彈簧效應。需要提一下的時,使用該庫解決上面問題時要加上-webkit-overflow-scrolling。
另外我在結尾時提到的簡潔方法和其有異曲同工之妙,可以對比一下兩者。
Overs朋不功事做時次功好來多這開制的請一例農在croll Behavio是能覽調不頁新代些事幾求事都時學下是事r
嘗試那么多方案之后,我發(fā)現(xiàn)了css的一個屬性overscroll-behavior,該屬性CSS屬性在2017年12月和2018年3月分別在Chrome 63、Firefox 59中實現(xiàn)。
根據mdn的定義:允許你控制瀏覽器的滑動溢出的行為--當?shù)竭_滾動區(qū)域的邊邊界時會發(fā)生的行為。這就是最后的一種方案。
需要做的僅僅是在body設置overscroll-behavior:none,并設置footer為fixed,相比于沒有foter,整個頁面應用momentum-based scrolling是可以接受的。
更加客觀的是Edge正在開發(fā)中,未來可期。
結束語
參考文章
再次感謝原作者William Lim,提供了比較豐富滑動橡皮筋特效的解決思路。才疏學淺,有些翻譯不到位的地方多請指正,詳情異步原文
本文來源于網絡:查看?>https://juejin.im/post/5b7ad44c518825430c7a5f9f
總結
以上是生活随笔為你收集整理的java重绘橡皮筋_【译】谈橡皮筋特效的解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工业互联网体系架构、类型及应用
- 下一篇: Github的免费计算资源,来做个自动网