摘要:的偽類選擇器和偽元素選擇器,讓有了更為強(qiáng)大的功能。劃重點(diǎn),它或它的后代獲得焦點(diǎn)。另外,劃重點(diǎn),這個(gè)偽類是仍處于實(shí)驗(yàn)室的方案。最后感謝耐心讀完。
CSS 的偽類選擇器和偽元素選擇器,讓 CSS 有了更為強(qiáng)大的功能。
偽類大家聽的多了,偽元素可能聽到的不是那么頻繁,其實(shí) CSS 對(duì)這兩個(gè)是有區(qū)分的。
有個(gè)錯(cuò)誤有必要每次講到偽類都提一下,有時(shí)你會(huì)發(fā)現(xiàn)偽類元素使用了兩個(gè)冒號(hào) (::) 而不是一個(gè)冒號(hào) (:),這是 CSS3 規(guī)范中的一部分要求,目的是為了區(qū)分偽類和偽元素,大多數(shù)瀏覽器都支持下面這兩種表示方式。
通常而言,
#id:after{ ... } #id::after{ ... }
符合標(biāo)準(zhǔn)而言,單冒號(hào)(:)用于 CSS3 偽類,雙冒號(hào)(::)用于 CSS3 偽元素。
當(dāng)然,也有例外,對(duì)于 CSS2 中已經(jīng)有的偽元素,例如 :before,單冒號(hào)和雙冒號(hào)的寫法 ::before 作用是一樣的。
所以,如果你的網(wǎng)站只需要兼容 webkit、firefox、opera 等瀏覽器或者是移動(dòng)端頁面,建議對(duì)于偽元素采用雙冒號(hào)的寫法,如果不得不兼容低版本 IE 瀏覽器,還是用 CSS2 的單冒號(hào)寫法比較安全。
?
:focus-within
言歸正傳,今天要說的就是:focus-within
?偽類選擇器。
它表示一個(gè)元素獲得焦點(diǎn),或,該元素的后代元素獲得焦點(diǎn)。劃重點(diǎn),它或它的后代獲得焦點(diǎn)。
這也就意味著,它或它的后代獲得焦點(diǎn),都可以觸發(fā)?:focus-within
。
:focus-within
?的冒泡性這個(gè)屬性有點(diǎn)類似 Javascript 的事件冒泡,從可獲焦元素開始一直冒泡到根元素?html
,都可以接收觸發(fā)?:focus-within
?事件,類似下面這個(gè)簡(jiǎn)單的例子這樣:
html, body, .g-father, .g-children { padding: 30px; border:1px solid #999; } input { ... &:focus { background: #00bcd4; } } html:focus-within { background: #e91e63; } body:focus-within { background: #ff5722; } .g-father:focus-within { background: #ffeb3b; } .g-children:focus-within { background: #4caf50; }
就是這樣:
CodePen Demo -- :focus-within 冒泡觸發(fā)
這個(gè)選擇器的存在,讓 CSS 有了進(jìn)一步的讓元素持久停留在一種新狀態(tài)的的能力。
下面幾個(gè)例子,看看?:focus-within
?可以提供什么能力,做些什么事情。
?
它或它的后代獲得焦點(diǎn),這一點(diǎn)使得讓感知獲焦區(qū)域變得更大,所以,最常規(guī)的用法就是使用?:focus-within
?感應(yīng)用戶操作聚焦區(qū)域,高亮提醒。
下面的效果沒有任何 JS 代碼:
這里是什么意思呢?:focus-within
?做了什么呢?
:focus
?偽類,而是可以給需要的父元素設(shè)置,這樣當(dāng)元素獲焦時(shí),我可以一并控制它的父元素的樣式核心思想用 CSS 代碼表達(dá)出來大概是這樣:
.g-container:focus-within { ... input { .... } }
DEMO -- CSS focus-within INPUT
運(yùn)用上面思想,我們可以把效果做的更炫一點(diǎn)點(diǎn),在某些場(chǎng)景制作一些增強(qiáng)用戶體驗(yàn)的效果:
DEMO -- PURE CSS FOCUS By :focus-within
?
在之前的一篇文章里,介紹了兩種純 CSS 實(shí)現(xiàn)的 TAB 導(dǎo)航欄切換方法:
純CSS的導(dǎo)航欄Tab切換方案
現(xiàn)在又多了一種方式,利用了?:focus-within
?可以在父節(jié)點(diǎn)獲取元素獲得焦點(diǎn)的特性,實(shí)現(xiàn)的TAB導(dǎo)航切換:
DEMO -- focus-within switch tab
主要的思路就是通過獲焦態(tài)來控制其他選擇器,以及最重要的是利用了父級(jí)的?:not(:focus-within)
?來設(shè)置默認(rèn)樣式:
.nav-box:not(:focus-within) { // 默認(rèn)樣式 } .nav-A:focus-within ~ .content-box .content-A { display: block; } .nav-B:focus-within ~ .content-box .content-B { display: block; }
?
:placeholder-shown
?偽類實(shí)現(xiàn)表單效果:focus-within
?一個(gè)人能力有限,通常也會(huì)配合其他偽類實(shí)現(xiàn)一些不錯(cuò)的效果。這里要再簡(jiǎn)單介紹的是另外一個(gè)有意思的偽類?:placeholder-shown
。
:placeholder-shown
:The :placeholder-shown CSS pseudo-class represents any or
另外,劃重點(diǎn),這個(gè)偽類是仍處于實(shí)驗(yàn)室的方案。也就是未納入標(biāo)準(zhǔn),當(dāng)然我們的目的是探尋有意思的 CSS 。
意思大概就是,當(dāng)?input
?類型標(biāo)簽使用了 placeholder 屬性有了默認(rèn)占位的文字,會(huì)觸發(fā)此偽類樣式。配合:not()
偽類,可以再改變當(dāng)默認(rèn)文字消失后的樣式,再配合本文的主角,我們可以實(shí)現(xiàn)表單的一系列效果。
CSS 代碼大概呈現(xiàn)成這樣:
.g-container { width: 500px; height: 60px; input { height: 100%; width: 100%; &:not(:placeholder-shown) { ... } &:placeholder-shown { ... } } &:focus-within { ... } }
實(shí)際效果如下:
可以看到,上面的效果沒有用到任何 JS,可以實(shí)現(xiàn):
CodePen Demo -- :placeholder-shown && :focus-within
?
這個(gè)是其他很多文章都有提到過的一個(gè)功能,利用?focus-within
?便捷的實(shí)現(xiàn)離屏導(dǎo)航,可以說將這個(gè)屬性的功能發(fā)揮的淋漓盡致,這里我直接貼一個(gè) codepen 上?Dannie Vinther?對(duì)這個(gè)效果的實(shí)現(xiàn)方案:
CodePen Demo -- Off-screen nav with :focus-within [PURE CSS]
?
juejin.im是我很喜歡的一個(gè)博客網(wǎng)站,它的登錄有一個(gè)小彩蛋,最上面的熊貓?jiān)谀爿斎霂ぬ?hào)密碼的時(shí)候會(huì)有不同的狀態(tài),效果如下:
利用本文所講的?focus-within
?,可以不借助任何 Javascript,實(shí)現(xiàn)這個(gè)動(dòng)效:
感興趣的可以戳這里看看完整的Demo代碼:
CodePen Demo -- 掘金登錄效果純CSS實(shí)現(xiàn)
?
好了,例子舉例的也差不多了,下面到了殺人誅心的兼容性時(shí)刻,按照慣例,這種屬性大概率是一片紅色,看看 CANIUSE,截圖日期(2018/08/02),其實(shí)也還不算特別慘淡。
?
感謝耐心讀完。本文只是拋磚引玉,期待發(fā)掘?focus-within
?更多有意義的用法。
更多精彩 CSS 技術(shù)文章匯總在我的?Github -- iCSS?,持續(xù)更新,歡迎點(diǎn)個(gè) star 訂閱收藏。
好了,本文到此結(jié)束,希望對(duì)你有幫助 :)
如果還有什么疑問或者建議,可以多多交流,原創(chuàng)文章,文筆有限,才疏學(xué)淺,文中若有不正之處,萬望告知。
?
?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/1961.html
摘要:接著只要在中使用就能搞定自適應(yīng)。代碼如下標(biāo)題標(biāo)題標(biāo)題標(biāo)題標(biāo)題在上述點(diǎn)功能中,可以用變量解決,比如實(shí)現(xiàn)了寬度,高度圓點(diǎn)大小直徑的控件。 未完待續(xù) 背景 如今css3越來越發(fā)達(dá),focus-within等屬性也已經(jīng)開始在Chrome得到支持。如果有出色的css功底,一點(diǎn)點(diǎn)ps技能,你也能用css3配合原生html標(biāo)簽寫出優(yōu)秀的框架。通過對(duì)css3的實(shí)踐,我發(fā)現(xiàn)自定義原生控件并不是什么難事,...
摘要:接著只要在中使用就能搞定自適應(yīng)。代碼如下標(biāo)題標(biāo)題標(biāo)題標(biāo)題標(biāo)題在上述點(diǎn)功能中,可以用變量解決,比如實(shí)現(xiàn)了寬度,高度圓點(diǎn)大小直徑的控件。 未完待續(xù) 背景 如今css3越來越發(fā)達(dá),focus-within等屬性也已經(jīng)開始在Chrome得到支持。如果有出色的css功底,一點(diǎn)點(diǎn)ps技能,你也能用css3配合原生html標(biāo)簽寫出優(yōu)秀的框架。通過對(duì)css3的實(shí)踐,我發(fā)現(xiàn)自定義原生控件并不是什么難事,...
摘要:接著只要在中使用就能搞定自適應(yīng)。代碼如下標(biāo)題標(biāo)題標(biāo)題標(biāo)題標(biāo)題在上述點(diǎn)功能中,可以用變量解決,比如實(shí)現(xiàn)了寬度,高度圓點(diǎn)大小直徑的控件。 未完待續(xù) 背景 如今css3越來越發(fā)達(dá),focus-within等屬性也已經(jīng)開始在Chrome得到支持。如果有出色的css功底,一點(diǎn)點(diǎn)ps技能,你也能用css3配合原生html標(biāo)簽寫出優(yōu)秀的框架。通過對(duì)css3的實(shí)踐,我發(fā)現(xiàn)自定義原生控件并不是什么難事,...
摘要:如何檢測(cè)瀏覽器是否支持某個(gè)偽類例如錯(cuò)誤方法此法檢測(cè)的是瀏覽器是否支持一個(gè)名為的屬性,且值可以為,當(dāng)然不支持。。。正確方法原理如果解析器不認(rèn)識(shí)某個(gè)偽類,會(huì)認(rèn)為其整條規(guī)則都不合法,并將其忽略。 如何檢測(cè)瀏覽器是否支持某個(gè) CSS 偽類(例如 :focus-within) 錯(cuò)誤方法 @supports (div:focus-within) {} CSS.supports(div:focus-...
閱讀 4063·2023-04-26 02:13
閱讀 2280·2021-11-08 13:13
閱讀 2775·2021-10-11 10:59
閱讀 1769·2021-09-03 00:23
閱讀 1335·2019-08-30 15:53
閱讀 2326·2019-08-28 18:22
閱讀 3080·2019-08-26 10:45
閱讀 765·2019-08-23 17:58