瀏覽器原生「磁吸」效果!Anchor Positioning 錨點(diǎn)定位神器解析
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
從 Chrome 125 開始,支持了一個全新的 CSS 特性 - Anchor Positioning,翻譯過來即是錨點(diǎn)定位。 在之前的文章中,我們較為系統(tǒng)的講述了這個新特性的使用,感興趣的可以翻開一下前文:搶先體驗!超強(qiáng)大的 Anchor Positioning 錨點(diǎn)定位。 在本文中,我們將使用錨點(diǎn)定位,實(shí)現(xiàn)一個簡化版本的 Popover 功能。下面,我們將一起一探究竟。 傳統(tǒng) Popover 功能長話短說,在日常的前端需求開發(fā)中,有這么一種場景,我們需要 hover 某個具體元素,以彈出一個彈出層,像是這樣: 如果我們將彈出層的 DOM 結(jié)構(gòu),寫在某個具體的元素內(nèi)部,譬如放在與被 Hover 元素同級。如果被 Hover 元素的祖先元素的某一層設(shè)置了 為了避免這種情況的發(fā)生,一般情況下,常見的解決方案都是會將彈出層的 DOM,插入到頁面最外層的 核心邏輯如下:
其核心在于,通過 Javascript 動態(tài)計算當(dāng)前 hover 元素的位置,將彈出層定位到當(dāng)前 hover 元素附近合適的位置,并且處理好各種邊界場景,這里很重要一點(diǎn)是強(qiáng)依賴于 Javascript 的計算。 因為傳統(tǒng)的 CSS,是沒有辦法改變元素的定位父元素的能力的。 而有趣的是,全新的 CSS 特性 - Anchor Positioning 錨點(diǎn)定位就是為了解決這個問題的。 快速了解 Anchor Positioning 錨點(diǎn)定位那,到底什么是 Anchor Positioning 錨點(diǎn)定位呢?我們通過一個 DEMO 快速上手。 假設(shè)我們在頁面上有這么三個元素:按鈕A、按鈕B、被定位元素C,其中被 元素C 是一個插入到任意地方,且為絕對定位的元素,核心 CSS 代碼如下:
現(xiàn)在,三個元素屬于同級關(guān)系,且 C 元素是絕對定位,當(dāng)前基于 大致樣式如下: 而錨點(diǎn)定位的屬性的核心作用就是,能夠改變元素定位的基準(zhǔn),增強(qiáng)元素的絕對定位的能力。Anchor Positioning(錨點(diǎn)定位)允許我們基于其它錨點(diǎn)元素的位置和尺寸去定位上下文,而不是傳統(tǒng)意義上的基于父元素去進(jìn)行絕對定位。 下面,我們利用錨點(diǎn)定位去實(shí)現(xiàn),當(dāng)兩個按鈕 A、B 被 Hover 的時候,讓定位元素 C 基于當(dāng)前被 Hover 的按鈕元素進(jìn)行絕對定位,核心 CSS 代碼如下:
核心關(guān)注上面的 如此一來,我們就實(shí)現(xiàn)了動態(tài)改變 C 元素定位基準(zhǔn)的能力,我們看看效果: 簡單而言,我們利用錨點(diǎn)定位的能力,在 hover 按鈕 A\B 的時候,把 C 元素定位在它們正下方。這個就是錨點(diǎn)定位的能力! Anchor Positioning 錨點(diǎn)定位核心 API(1)anchor-name:錨點(diǎn)定義功能:將元素聲明為定位基準(zhǔn)點(diǎn)
(2)position-anchor:錨點(diǎn)綁定功能:建立元素與錨點(diǎn)的定位關(guān)系
(3)anchor():動態(tài)定位功能:根據(jù)錨點(diǎn)位置計算坐標(biāo)
(4)anchor-size():尺寸繼承功能:獲取錨點(diǎn)元素的尺寸值
這里介紹了錨點(diǎn)定位中最為核心的幾個屬性,掌握了這幾個屬性,就可以應(yīng)付大部分場景了。在我之前的一篇入門文章中,對它們也有一些更為詳細(xì)的描述,感興趣的同學(xué),可以翻看:搶先體驗!超強(qiáng)大的 Anchor Positioning 錨點(diǎn)定位 錨點(diǎn)定位的候補(bǔ)位置還有一個非常重要的點(diǎn),傳統(tǒng)的 Popover 組件,一般都會有這么個功能 -- 智能邊界處理。 我們以一個功能比較強(qiáng)大的 Popover 庫 floating-ui 舉例,其官網(wǎng)展示了如下的一個功能,當(dāng)元素在滾動過程中,如果原本 Popover 彈窗被遮擋,會自動進(jìn)行位置移動,將彈窗重新調(diào)整到可視區(qū)域,效果如下: 令人振奮的是,現(xiàn)在,CSS 的 Anchor Positioning 錨點(diǎn)定位同樣支持這種 智能邊界處理,在錨點(diǎn)定位中,我們稱之為候補(bǔ)位置。 這里,我們主要借助兩個錨點(diǎn)定位相關(guān)的屬性完成錨點(diǎn)定位的候補(bǔ)位置 position-try-fallbacks 和 @position-try 規(guī)則。 @position-try 規(guī)則
關(guān)鍵點(diǎn):
position-try-fallbacks 屬性position-try-fallbacks 用于在元素上指定備選定位策略的優(yōu)先級順序。瀏覽器會按順序嘗試這些策略,直到找到第一個可用的位置。
關(guān)鍵點(diǎn):
使用錨點(diǎn)定位實(shí)現(xiàn)候補(bǔ)位置基于上述介紹,我們來實(shí)現(xiàn)一個基于錨點(diǎn)定位的候補(bǔ)位置。 假設(shè)我們?nèi)缦陆Y(jié)構(gòu),當(dāng)前已經(jīng)使用了錨點(diǎn)定位:
核心 CSS 如下:
此時,兩個元素都插入在 此時,我們只需要再借助
核心 CSS 代碼如下:
這樣,我們在滾動頁面的過程中,如果彈窗 popover 有超出視窗,候補(bǔ)規(guī)則會自動生效,看看效果: 仔細(xì)觀察,和上面利用 Javascript 庫實(shí)現(xiàn)的智能定位,效果一致,只是此時,我們僅僅使用了寥寥幾行 CSS 代碼!Amazing! 綜上所述,到今天,我們已經(jīng)可以利用 CSS 錨點(diǎn)定位大致實(shí)現(xiàn)一個極簡版的 Popover 彈窗,并且可以滿足大部分場景。不得不感嘆 CSS 確實(shí)愈發(fā)的強(qiáng)力, 當(dāng)然,本文介紹的關(guān)于錨點(diǎn)定位的功能都是基于實(shí)現(xiàn)一個最小版本的 Popover 展開的,基于錨點(diǎn)定位的 API 和回退候補(bǔ),還有更多有趣的內(nèi)容,感興趣的可以猛戳 MDN 進(jìn)行了解:MDN - Anchor Positioning、MDN-Anchor Positioning @position try。 轉(zhuǎn)自https://www.cnblogs.com/coco1s/p/18739625 該文章在 2025/3/3 9:03:11 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |