亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
我們解決什麼問題?
什麼是 position: sticky?
瀏覽器支持和 Polyfills
演示
結(jié)論
關(guān)於 CSS Position Sticky 的常見問題解答 (FAQ)
CSS position sticky 與其他 CSS 位置有什麼區(qū)別?
為什麼我的 CSS position sticky 不起作用?
如何在我的所有瀏覽器上使 CSS position sticky 起作用?
我可以將 CSS position sticky 與其他 CSS 屬性一起使用嗎?
CSS position sticky 在滾動容器中的行為如何?
我可以在元素底部使用 CSS position sticky 嗎?
CSS position sticky 如何與邊距一起工作?
我可以將 CSS position sticky 用於水平滾動嗎?
如何使用 CSS position sticky 控制滾動偏移量?
我可以將 CSS position sticky 與 CSS 過渡一起使用嗎?
首頁 web前端 js教程 CSS'位置:粘性” - 介紹和polyfills

CSS'位置:粘性” - 介紹和polyfills

Feb 21, 2025 am 08:52 AM

CSS

關(guān)鍵要點(diǎn)

  • CSS 的 position: sticky 屬性允許導(dǎo)航欄或其他元素在用戶滾動時保持可見,而無需固定在頁面上。此屬性在其父元素內(nèi)表現(xiàn)得像靜態(tài)定位,直到達(dá)到給定的偏移閾值,此時它就像值被設(shè)置為 fixed 一樣。
  • 傳統(tǒng)上實(shí)現(xiàn)此效果的方法涉及 JavaScript,其中監(jiān)聽頁面的滾動事件,並使用 JavaScript 根據(jù)視口的當(dāng)前位置更改 positiontop 屬性的值。但是,當(dāng)元素的位置更改為 fixed 時,此方法可能會導(dǎo)致問題,從而導(dǎo)致它離開頁面流,並且下方的元素“向上跳躍”。
  • 目前,“position: sticky”屬性的瀏覽器支持有限。但是,有一些 polyfill 可用於提供此功能,包括 Filament Group 的 fixed-sticky、Matthew Phillips 的 position–sticky- 和 Oleg Korsunsky 的 Stickyfill。

如果您閱讀過 Annarita Tranfici 的文章《Obvious Design always wins》,您可能會同意她的說法:

人們期望看到常見的模式:在頁面頂部找到主菜單,在右上角找到搜索框,在底部找到頁腳,等等。

我同意人們期望網(wǎng)站的某些組件放置在特定位置,在我看來,對於主菜單來說,這一點(diǎn)更為重要。

有時,由於客戶的要求或因為我們已經(jīng)確定這是最佳方法,我們可能需要主導(dǎo)航始終在頁面上可見,而無需將其固定到位,基本上跟隨頁面內(nèi)容。近年來,許多基於 JavaScript 的解決方案問世,因為僅 CSS 無法完成此任務(wù)。

在本文中,我們將討論 position: sticky,這是解決此問題的新的 CSS 解決方案。

我們解決什麼問題?

在討論此 position 屬性的新值之前,讓我們更好地理解我們試圖解決的問題。

假設(shè)我們精彩網(wǎng)站的主菜單位於標(biāo)題之後,但仍在頁面頂部(不在側(cè)邊欄中),並且佔(zhàn)據(jù)所有可用寬度。這可能看起來像這樣:

CodePen 示例鏈接

我們想要實(shí)現(xiàn)的是,當(dāng)用戶滾動頁面時,一旦菜單位於視口頂部,菜單就不會滾動到視圖之外,而是會粘在頂部位置——就像它應(yīng)用了position: fixed一樣(僅當(dāng)它到達(dá)視口頂部時)。

要使用傳統(tǒng)代碼實(shí)現(xiàn)此目的,我們需要添加一些 JavaScript。我們監(jiān)聽頁面的滾動事件,並使用 JavaScript 根據(jù)視口的當(dāng)前位置更改 positiontop 屬性的值。具體來說,當(dāng)菜單位於視口頂部時,我們需要向菜單添加 top: 0position: fixed,否則將屬性恢復(fù)為其默認(rèn)值。

另一種類似的方法是在我們的 CSS 中創(chuàng)建一個包含這些值的類,然後根據(jù)需要使用 JavaScript 添加和刪除該類,這可能看起來像這樣:

var menu = document.querySelector('.menu')
var menuPosition = menu.getBoundingClientRect().top;
window.addEventListener('scroll', function() {
    if (window.pageYOffset >= menuPosition) {
        menu.style.position = 'fixed';
        menu.style.top = '0px';
    } else {
        menu.style.position = 'static';
        menu.style.top = '';
    }
});

請注意,此代碼段不處理舊版本的 Internet Explorer。如果您需要處理這些瀏覽器(可憐的您?。覍⑻峁┮恍┠梢钥紤]的 polyfill 選項。

此第二步的實(shí)時演示如下所示:

CodePen 示例鏈接

但是等等!你能發(fā)現(xiàn)這段代碼引起的問題嗎?我見過的許多實(shí)現(xiàn),包括我們迄今為止開發(fā)的實(shí)現(xiàn),都沒有考慮到一個重要的問題。當(dāng)我們將元素的位置更改為fixed 時,它會離開頁面的流,因此下方的元素會“向上跳躍”大約等於元素高度的像素數(shù)(此“跳躍”的高度取決於邊距、邊框等)。

一個可能的解決方案是注入一個與我們想要“粘貼”的元素大小相同的佔(zhàn)位符元素,這樣當(dāng)我們更新粘性元素的樣式時,就不會發(fā)生跳躍。此外,如果已設(shè)置正確的值,我們不想無緣無故地反復(fù)重新分配值。最後,我們想採用我使用 CSS 類描述的技術(shù)。

JavaScript 代碼的最終版本如下所示:

var menu = document.querySelector('.menu');
var menuPosition = menu.getBoundingClientRect();
var placeholder = document.createElement('div');
placeholder.style.width = menuPosition.width + 'px';
placeholder.style.height = menuPosition.height + 'px';
var isAdded = false;

window.addEventListener('scroll', function() {
    if (window.pageYOffset >= menuPosition.top && !isAdded) {
        menu.classList.add('sticky');
        menu.parentNode.insertBefore(placeholder, menu);
        isAdded = true;
    } else if (window.pageYOffset < menuPosition.top && isAdded) {
        menu.classList.remove('sticky');
        menu.parentNode.removeChild(placeholder);
        isAdded = false;
    }
});

這是 sticky 類的聲明塊:

.sticky {
    top: 0;
    position: fixed;
}

最終結(jié)果顯示在此下一個演示中:

CodePen 示例鏈接

現(xiàn)在您已經(jīng)很好地掌握了問題是什麼以及可能的基於 JavaScript 的解決方案是什麼,是時候擁抱現(xiàn)代化並討論這個 position: sticky 是關(guān)於什麼了。

什麼是 position: sticky?

如果您勇敢地仔細(xì)閱讀了上一節(jié),您可能想知道“瀏覽器為什麼不能為我做到這一點(diǎn)?”很高興您問!

sticky 是為 CSS position 屬性引入的一個新值。此值應(yīng)該在其父元素內(nèi)表現(xiàn)得像 position: static,直到達(dá)到給定的偏移閾值,在這種情況下,它就像值被設(shè)置為 fixed 一樣。換句話說,通過使用 position: sticky,我們可以無需 JavaScript 即可解決上一節(jié)中討論的問題。

回顧我們之前的示例並使用此新值,我們可以編寫:

.menu {
    margin: 0;
    padding: 0;
    width: 100%;
    background-color: #bffff3;
    position: sticky;
}

瀏覽器將完成其餘工作!就這麼簡單。

瀏覽器支持和 Polyfills

目前對這個新值的支持非常糟糕。以下是每個瀏覽器的堆棧情況:

  • Firefox 26 – 通過在 about:config 下將 css.sticky.enabled 設(shè)置為“true”來支持。
  • Chrome 23 – 通過在 chrome://flags 中啟用“實(shí)驗性 Web 平臺功能”來支持。
  • Chrome 38(?) – Chrome 團(tuán)隊最近已從 Blink 中刪除此功能,因此它目前在 Chrome Canary(版本 38.x)中不可用,即使使用該標(biāo)誌也是如此。您可以閱讀解釋刪除的錯誤報告,但我們懷疑此功能將很快重新實(shí)現(xiàn),並且可能不會中斷穩(wěn)定版本的支持。
  • Safari 6.1 – 使用 -webkit 供應(yīng)商前綴支持該值(即 position: -webkit-sticky
  • Opera 23 – 通過在 about:flags 中啟用“實(shí)驗性 Web 平臺功能”來支持。
  • Internet Explorer – 不支持(參見狀態(tài))

有關(guān)所有詳細(xì)信息,請參見 Can I Use… 上的 position: sticky。

幸運(yùn)的是,有很多 polyfill 可供選擇:

  • Filament Group 的 fixed-sticky(需要 jQuery)
  • Matthew Phillips 的 position–sticky-(使用 Modernizr 進(jìn)行檢測)
  • Philip Walton 的 Polyfill.js 庫中的 position: sticky
  • Fabrice Weinberg 的 position: sticky CodePen 演示(需要 jQuery)
  • Oleg Korsunsky 的 Stickyfill(IE9 )

演示

以下演示顯示了 position: sticky 的實(shí)際效果。如前所述,要使其工作,並且取決於您使用的瀏覽器,您可能需要激活一個標(biāo)誌。

CodePen 示例鏈接

結(jié)論

儘管這項新功能沒有很好的瀏覽器支持,您可能也不願使用 polyfill,但如果使用 Modernizr 定義替代樣式,它將優(yōu)雅地降級到默認(rèn)的 position: staticposition: fixed。

如果您嘗試過此屬性或知道任何其他 polyfill,請在評論中告訴我們。

關(guān)於 CSS Position Sticky 的常見問題解答 (FAQ)

CSS position sticky 與其他 CSS 位置有什麼區(qū)別?

CSS position: sticky 是相對定位和固定定位的混合體。它允許元素在其父元素內(nèi)表現(xiàn)得像相對位置,直到達(dá)到給定的滾動點(diǎn),此時它會變?yōu)楣潭ㄎ恢?。這與其他 CSS 位置不同。例如,“相對”位置允許您相對於元素的正常位置定位元素,而“固定”位置將元素相對於瀏覽器窗口定位,即使頁面滾動它也不會移動。 “絕對”位置將元素相對於最近的已定位祖先定位,“靜態(tài)”是默認(rèn)值,並根據(jù)頁面的正常流程定位元素。

為什麼我的 CSS position sticky 不起作用?

您的 CSS position: sticky 不起作用可能有幾個原因。一個常見的原因是父元素的 overflow 屬性設(shè)置為 hidden、autoscroll。另一個原因可能是粘性元素有一個比它高的同級元素,導(dǎo)致它從視口中滾動出來。此外,請確保粘性元素不是表格元素,因為在某些瀏覽器中,CSS position: sticky 不適用於表格元素。

如何在我的所有瀏覽器上使 CSS position sticky 起作用?

雖然 CSS position: sticky 在現(xiàn)代瀏覽器中得到廣泛支持,但在某些舊版本中可能不起作用。為了確??缢袨g覽器的兼容性,您可以使用 polyfill。 polyfill 是一個提供您期望瀏覽器原生提供的技術(shù)的腳本。 CSS position: sticky 的一個流行 polyfill 是 Stickyfill。

我可以將 CSS position sticky 與其他 CSS 屬性一起使用嗎?

是的,您可以將 CSS position: sticky 與其他 CSS 屬性一起使用。例如,您可以將其與 z-index 一起使用來控制堆疊順序,或與 box-shadow 一起使用來在元素變?yōu)檎承詴r創(chuàng)建陰影效果。

CSS position sticky 在滾動容器中的行為如何?

當(dāng)粘性元素位於滾動容器內(nèi)時,當(dāng)您向下滾動時,它會粘在容器的頂部,並且當(dāng)容器的底部邊緣滾動過去時,它將停止粘性。

我可以在元素底部使用 CSS position sticky 嗎?

是的,您可以在元素底部使用 CSS position: sticky。您只需要為 bottom 屬性指定一個負(fù)值即可。這將使元素粘在容器的底部。

CSS position sticky 如何與邊距一起工作?

邊距與 CSS position: sticky 的工作方式與它們與相對定位一起工作的方式相同。邊距將相對於其粘性位置移動粘性元素,而不是其原始位置。

我可以將 CSS position sticky 用於水平滾動嗎?

是的,您可以將 CSS position: sticky 用於水平滾動。您只需要為 leftright 屬性指定一個值,而不是 topbottom 屬性。

如何使用 CSS position sticky 控制滾動偏移量?

滾動偏移量由 top、right、bottomleft 屬性控制。您為這些屬性指定的值決定了元素開始粘貼的視口相應(yīng)邊緣的距離。

我可以將 CSS position sticky 與 CSS 過渡一起使用嗎?

是的,您可以將 CSS position: sticky 與 CSS 過渡一起使用。但是,請記住,過渡僅在元素從相對位置更改為固定位置時才適用,而不是在它粘貼時。

請注意,我已將 CodePen 鏈接替換為佔(zhàn)位符,因為我無法訪問實(shí)際的 CodePen 示例。您需要替換這些佔(zhàn)位符為實(shí)際的鏈接。 此外,我盡可能地對原文進(jìn)行了改寫,力求在不改變原意的情況下,使文章更流暢自然。

以上是CSS'位置:粘性” - 介紹和polyfills的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

垃圾收集如何在JavaScript中起作用? 垃圾收集如何在JavaScript中起作用? Jul 04, 2025 am 12:42 AM

JavaScript的垃圾回收機(jī)制通過標(biāo)記-清除算法自動管理內(nèi)存,以減少內(nèi)存洩漏風(fēng)險。引擎從根對像出發(fā)遍歷並標(biāo)記活躍對象,未被標(biāo)記的則被視為垃圾並被清除。例如,當(dāng)對像不再被引用(如將變量設(shè)為null),它將在下一輪迴收中被釋放。常見的內(nèi)存洩漏原因包括:①未清除的定時器或事件監(jiān)聽器;②閉包中對外部變量的引用;③全局變量持續(xù)持有大量數(shù)據(jù)。 V8引擎通過分代回收、增量標(biāo)記、並行/並發(fā)回收等策略優(yōu)化回收效率,降低主線程阻塞時間。開發(fā)時應(yīng)避免不必要的全局引用、及時解除對象關(guān)聯(lián),以提升性能與穩(wěn)定性。

如何在node.js中提出HTTP請求? 如何在node.js中提出HTTP請求? Jul 13, 2025 am 02:18 AM

在Node.js中發(fā)起HTTP請求有三種常用方式:使用內(nèi)置模塊、axios和node-fetch。 1.使用內(nèi)置的http/https模塊無需依賴,適合基礎(chǔ)場景,但需手動處理數(shù)據(jù)拼接和錯誤監(jiān)聽,例如用https.get()獲取數(shù)據(jù)或通過.write()發(fā)送POST請求;2.axios是基於Promise的第三方庫,語法簡潔且功能強(qiáng)大,支持async/await、自動JSON轉(zhuǎn)換、攔截器等,推薦用於簡化異步請求操作;3.node-fetch提供類似瀏覽器fetch的風(fēng)格,基於Promise且語法簡單

JavaScript數(shù)據(jù)類型:原始與參考 JavaScript數(shù)據(jù)類型:原始與參考 Jul 13, 2025 am 02:43 AM

JavaScript的數(shù)據(jù)類型分為原始類型和引用類型。原始類型包括string、number、boolean、null、undefined和symbol,其值不可變且賦值時復(fù)制副本,因此互不影響;引用類型如對象、數(shù)組和函數(shù)存儲的是內(nèi)存地址,指向同一對象的變量會相互影響。判斷類型可用typeof和instanceof,但需注意typeofnull的歷史問題。理解這兩類差異有助於編寫更穩(wěn)定可靠的代碼。

JavaScript時間對象,某人構(gòu)建了一個eactexe,在Google Chrome上更快的網(wǎng)站等等 JavaScript時間對象,某人構(gòu)建了一個eactexe,在Google Chrome上更快的網(wǎng)站等等 Jul 08, 2025 pm 02:27 PM

JavaScript開發(fā)者們,大家好!歡迎閱讀本週的JavaScript新聞!本週我們將重點(diǎn)關(guān)注:Oracle與Deno的商標(biāo)糾紛、新的JavaScript時間對象獲得瀏覽器支持、GoogleChrome的更新以及一些強(qiáng)大的開發(fā)者工具。讓我們開始吧! Oracle與Deno的商標(biāo)之爭Oracle試圖註冊“JavaScript”商標(biāo)的舉動引發(fā)爭議。 Node.js和Deno的創(chuàng)建者RyanDahl已提交請願書,要求取消該商標(biāo),他認(rèn)為JavaScript是一個開放標(biāo)準(zhǔn),不應(yīng)由Oracle

React與Angular vs Vue:哪個JS框架最好? React與Angular vs Vue:哪個JS框架最好? Jul 05, 2025 am 02:24 AM

選哪個JavaScript框架最好?答案是根據(jù)需求選擇最適合的。 1.React靈活自由,適合需要高度定制、團(tuán)隊有架構(gòu)能力的中大型項目;2.Angular提供完整解決方案,適合企業(yè)級應(yīng)用和長期維護(hù)的大項目;3.Vue上手簡單,適合中小型項目或快速開發(fā)。此外,是否已有技術(shù)棧、團(tuán)隊規(guī)模、項目生命週期及是否需要SSR也都是選擇框架的重要因素。總之,沒有絕對最好的框架,適合自己需求的就是最佳選擇。

立即在JavaScript中立即調(diào)用功能表達(dá)式(IIFE) 立即在JavaScript中立即調(diào)用功能表達(dá)式(IIFE) Jul 04, 2025 am 02:42 AM

IIFE(ImmediatelyInvokedFunctionExpression)是一種在定義後立即執(zhí)行的函數(shù)表達(dá)式,用於變量隔離和避免污染全局作用域。它通過將函數(shù)包裹在括號中使其成為表達(dá)式,並緊隨其後的一對括號來調(diào)用,如(function(){/code/})();。其核心用途包括:1.避免變量衝突,防止多個腳本間的命名重複;2.創(chuàng)建私有作用域,使函數(shù)內(nèi)部變量不可見;3.模塊化代碼,便於初始化工作而不暴露過多變量。常見寫法包括帶參數(shù)傳遞的版本和ES6箭頭函數(shù)版本,但需注意:必須使用表達(dá)式、結(jié)

處理諾言:鏈接,錯誤處理和承諾在JavaScript中 處理諾言:鏈接,錯誤處理和承諾在JavaScript中 Jul 08, 2025 am 02:40 AM

Promise是JavaScript中處理異步操作的核心機(jī)制,理解鍊式調(diào)用、錯誤處理和組合器是掌握其應(yīng)用的關(guān)鍵。 1.鍊式調(diào)用通過.then()返回新Promise實(shí)現(xiàn)異步流程串聯(lián),每個.then()接收上一步結(jié)果並可返回值或Promise;2.錯誤處理應(yīng)統(tǒng)一使用.catch()捕獲異常,避免靜默失敗,並可在catch中返回默認(rèn)值繼續(xù)流程;3.組合器如Promise.all()(全成功才成功)、Promise.race()(首個完成即返回)和Promise.allSettled()(等待所有完成)

什麼是緩存API?如何與服務(wù)人員使用? 什麼是緩存API?如何與服務(wù)人員使用? Jul 08, 2025 am 02:43 AM

CacheAPI是瀏覽器提供的一種緩存網(wǎng)絡(luò)請求的工具,常與ServiceWorker配合使用,以提升網(wǎng)站性能和離線體驗。 1.它允許開發(fā)者手動存儲如腳本、樣式表、圖片等資源;2.可根據(jù)請求匹配緩存響應(yīng);3.支持刪除特定緩存或清空整個緩存;4.通過ServiceWorker監(jiān)聽fetch事件實(shí)現(xiàn)緩存優(yōu)先或網(wǎng)絡(luò)優(yōu)先等策略;5.常用於離線支持、加快重複訪問速度、預(yù)加載關(guān)鍵資源及後臺更新內(nèi)容;6.使用時需注意緩存版本控制、存儲限制及與HTTP緩存機(jī)制的區(qū)別。

See all articles