溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

移動(dòng)端如何實(shí)現(xiàn)內(nèi)滾動(dòng)

發(fā)布時(shí)間:2021-07-07 10:13:39 來源:億速云 閱讀:137 作者:小新 欄目:移動(dòng)開發(fā)

這篇文章主要為大家展示了“移動(dòng)端如何實(shí)現(xiàn)內(nèi)滾動(dòng)”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“移動(dòng)端如何實(shí)現(xiàn)內(nèi)滾動(dòng)”這篇文章吧。

發(fā)現(xiàn)需求

如果在一個(gè)區(qū)域內(nèi)只允許部分區(qū)域產(chǎn)生滾動(dòng)的效果,而其余部分不能移動(dòng),你會(huì)采用什么方法呢?

首先我們可以把這個(gè)需求分解為兩個(gè)小的問題來解決。

  • 部分區(qū)域固定

  • 其余區(qū)域滾動(dòng)

部分區(qū)域固定

  1. 為頁面的body部分設(shè)置height: 100%以及overflow: hidden,即禁用頁面原生的滾動(dòng),保證只會(huì)顯示一屏的內(nèi)容。

  2. 固定區(qū)域采用絕對(duì)定位。

其余區(qū)域滾動(dòng)

核心屬性overflow-y

mdn對(duì)于overflow-y的定義

The overflow-y property specifies whether to clip content, render a scroll bar, or display overflow content of a block-level element, when it overflows at the top and bottom edges.
overflow-y屬性指定或是裁剪內(nèi)容并且渲染一個(gè)滾動(dòng)條,或是當(dāng)塊級(jí)元素在其頂部或底部溢出時(shí)顯示溢出的內(nèi)容。

簡(jiǎn)單來說,overflow-y屬性在垂直方向上存在溢出的時(shí)候,通過設(shè)置不同的值會(huì)產(chǎn)生不同的表現(xiàn)。為了實(shí)現(xiàn)滾動(dòng)功能我們需要將該屬性設(shè)置為scroll,之后,無論塊級(jí)元素的內(nèi)容是否溢出,瀏覽器都會(huì)生成一個(gè)滾動(dòng)條并且隱藏容器中內(nèi)容溢出的部分,只有在滾動(dòng)之后才會(huì)顯示。

舉個(gè)例子:

.test{
  width: 200px;
  /* 關(guān)鍵樣式 */
  height: 200px;
  overflow-y: scroll;
  /* 以下無關(guān)樣式 */
  background: #f14c5c;
  color: #fff;
}
<div class="test">
  這里面只是一段測(cè)試的內(nèi)容這里面只是一段測(cè)試的內(nèi)容這里面只是一段測(cè)試的內(nèi)容
  這里面只是一段測(cè)試的內(nèi)容這里面只是一段測(cè)試的內(nèi)容這里面只是一段測(cè)試的內(nèi)容
  這里面只是一段測(cè)試的內(nèi)容這里面只是一段測(cè)試的內(nèi)容這里面只是一段測(cè)試的內(nèi)容
  這里面只是一段測(cè)試的內(nèi)容這里面只是一段測(cè)試的內(nèi)容這里面只是一段測(cè)試的內(nèi)容
</div>

效果圖如下:

移動(dòng)端如何實(shí)現(xiàn)內(nèi)滾動(dòng)

通過剛才的例子我們可以得出結(jié)論,只要限制塊級(jí)元素的高度,自然就可以實(shí)現(xiàn)只有該元素的內(nèi)容可滾動(dòng)而不影響其它內(nèi)容。但是在實(shí)現(xiàn)過程中遇到了新的問題,如何實(shí)現(xiàn)對(duì)設(shè)計(jì)圖的精確還原?

設(shè)計(jì)圖如下:

移動(dòng)端如何實(shí)現(xiàn)內(nèi)滾動(dòng)

整個(gè)彈出框高度是隨頁面高度自適應(yīng)的,標(biāo)題部分和底部按鈕部分位置是固定的,中間列表需要占滿剩余高度,并且內(nèi)容可滾動(dòng)。整個(gè)彈窗被最外層div包裹,底部按鈕相對(duì)于它進(jìn)行定位。經(jīng)過思考后,嘗試了四種方案,分享給大家。

方案說明

我們需要確定的核心問題就是中間內(nèi)容的高度,也即是height在不同尺寸屏幕下的精確高度。

vh

相對(duì)于視口的高度,視口被均分為100單位,即1vh等于視口高度的1%。

移動(dòng)端如何實(shí)現(xiàn)內(nèi)滾動(dòng)

但是vh單位對(duì)低版本安卓和ios支持不夠好,微信瀏覽器X5內(nèi)核不支持,雖然已經(jīng)升級(jí)到blink內(nèi)核,但是為了確保萬無一失,放棄采用這種方案。另外也無法精確控制和底部按鈕邊距。

height百分比

和vh類似,無法精確控制和底部按鈕的邊距,自適應(yīng)效果不好。

calc

對(duì)于以上兩種方案的存在的問題,calc計(jì)算屬性可以很好的解決,只需要設(shè)置height:calc(100% - 60px),就可以精準(zhǔn)的占滿中間部分,并且保持和底部按鈕的邊距。

移動(dòng)端如何實(shí)現(xiàn)內(nèi)滾動(dòng)

可惜的是對(duì)于低版本的安卓瀏覽器、ios瀏覽器包括微信瀏覽器在內(nèi)的主流瀏覽器支持都不好,依然只能棄用。
如果兼容性再好一點(diǎn)的話,calc方案應(yīng)該是最好用且最優(yōu)雅的一種實(shí)現(xiàn)方式。

js

單純的使用css無法實(shí)現(xiàn),就只能借助js來動(dòng)態(tài)計(jì)算內(nèi)容所需要的高度來進(jìn)行設(shè)置。同時(shí)這種方法也幾乎不會(huì)遇到兼容性的問題,是對(duì)優(yōu)雅降級(jí)的一種實(shí)踐。

題外話

隱藏難看的滾動(dòng)條。

移動(dòng)端如何實(shí)現(xiàn)內(nèi)滾動(dòng)

如果直接設(shè)置overflow-y:scroll在ios下始終會(huì)出現(xiàn)很丑的滾動(dòng)條,我們可以對(duì)該元素設(shè)置以下屬性:

margin-right: -20px;
padding-right: 20px;

對(duì)滾動(dòng)條進(jìn)行一個(gè)小小的hack,它就再也不會(huì)出現(xiàn)了,用戶交互時(shí)會(huì)有和原生滾動(dòng)一樣的感覺,體驗(yàn)更佳。

@prototype 經(jīng)大大提醒,設(shè)置webkit瀏覽器的私有屬性::-webkit-scrollbar能更靈活的控制滾動(dòng)條,在此感謝。如果只需要隱藏,如下代碼即可:

::-webkit-scrollbar{
  display: none
}

雖然移動(dòng)端的瀏覽器webkit內(nèi)核居多,不過還是要在真機(jī)測(cè)試后再得出結(jié)論,如果有些瀏覽器不支持這個(gè)屬性的話,依然可以使用上面的小hack。

-webkit-overflow-scrolling: touch

在ios設(shè)備中,利用overflow來模擬滾動(dòng)會(huì)出現(xiàn)卡頓的情況,可以通過設(shè)置-webkit-overflow-scrolling: touch來解決,原因是設(shè)置后ios會(huì)為其創(chuàng)建一個(gè)UIScrollView,利用硬件來加速渲染。

這個(gè)問題本身并不復(fù)雜,甚至需求更改后,實(shí)現(xiàn)變的非常簡(jiǎn)單。但是希望能通過這個(gè)小例子能讓每一個(gè)前端人在思考需求時(shí)都能夠盡可能的去想更多樣的方法來解決問題,即使因?yàn)榧嫒菪曰蚱渌驎簳r(shí)無法實(shí)現(xiàn),在這個(gè)過程中獲得的成長(zhǎng)也是非常有益的。

以上是“移動(dòng)端如何實(shí)現(xiàn)內(nèi)滾動(dòng)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI