這篇文章主要介紹了CSS :focus-within的具體使用的相關資料,具有一定的參考價值,感興趣的小夥伴們可以參考一下
CSS的世界真是一個神奇的世界。可能眾多前端開發人員聽說過 :focus 並未聽說過 :focus-within 。那麼 :focus-within 是什麼鬼。這篇文章,我們就說說 :focus-within 這個東東。
:focus-within是什麼
在CSS中 :focus-within 是一個偽類,現在已經被列入到CSS選取器中(CSS Level 4 selector)。他就像你知道的 :focus 或者 :hover 。 :focus-within 能非常方便處理擷取焦點狀態。當元素本身或其後代元素獲得焦點時, :focus-within 偽類的元素就會有效。
如果文字不好理解,咱們先來看一個簡單的樣本:
<p class="form-group"> <label for="email"> Your email: </label> <input type="email" name="email" id="email" placeholder="Enter your email address"/></p>
上面是一個簡單的表單,有一個 input 表單控制項。
.form-group *:focus { background: yellow; color: #000;}.form-group { padding: 10px; border: 3px solid transparent}.form-group:focus-within { border-color: #000;}
上面的樣本中, .form-group 得到焦點的時候, border-color 顏色換成了 #000 。但這不意味著接收鍵盤的焦點,那是因為 <p> 不一定能得到鍵盤的焦點,沒有設定 tabindex 。或者說 p 中的連結或 input 元素接收焦點,那麼 .form-group 元素將改變邊框顏色。
看到上面的樣本,是不是覺得好神奇。在以前要實作類別似的效果,我們需要藉助JavaScript的指令碼。通過 .form-group 的後代元素的滑鼠或鍵盤事件,然後給其父元素(或祖先元素,添加對應的樣式)。
:focus-within的使用情境
:focus-within 非常強大,主要是由於偽類在它的任何元素擷取到焦點時都將被啟用。當元素包含許多子組件的元素上謹慎使用該偽類。
有了 :focus-within 之後,有一些常見的互動行為就變得非常的簡單,特別是以前需要JavaScript的鍵盤事件的互動行為,我們都可以使用 :focus-within 來替代。
接下來,咱們來看一些 :focus-within 的常見樣本。
表格行的高亮
一個常見的例子,就是表格行高亮的行為,即滑鼠懸浮在表格的行時,顏色變得高亮。這樣的互動樣式可以協助有視力阻礙的使用者能更好的閱讀一個複雜的表格或長表格。因為突出的顯示,可以使用這些使用者更容易地跟蹤他們當前正在閱讀的表格行。以前常常實現的方式是通過 :hover 來改變表格行的樣式,這種方案對於正常的使用者而言是一件易事,但如果你的使用者對於一些操作滑鼠有阻礙的使用者而言,那 :hover 就有點蛋疼了。如果你是追求完美的話,你可能會通過JavaScript的鍵盤事件給表格行添加樣式。
那麼有了 :focus-within 之後,我們就可以和JavaScript說拜拜。我們可以這樣來設定樣式:
上面的樣本展示了如何使用 :focus-within 來突出表格的整個行。如果在特定的表格行中有一個可擷取焦點的可用元素,這裡所指的是通過鍵盤擷取焦點。比如上面這個樣本,表格中有 <a> 元素,你懂的, a 元素是可以通過鍵盤擷取焦點的。
這個時候你只需要在樣式中添加:
tbody tr:focus-within,tbody tr:hover { background: rgba(lightBlue, .4);}
下拉式功能表
下拉式功能表是我們最常的Web組件之一。當我第一次看到 :focus-within 這個偽類時,我想到的第一個使用情境就是下拉式功能表。
上面的樣本中,JavaScript是用來跟蹤使用者鍵盤焦點在一個導航下拉式功能表中的。如果JavaScript檢測到鍵盤焦點在一個連結上,那麼給 .nav__list_drop 添加一個 .has-focus 類。當 li 有了 .has-focus 類時,他的子項目就會顯示出來,也就是下拉式功能表會顯示出來。
這樣的效果,我們可以直接通過 :focus-within 來取代JavaScript指令碼的功能。使用 .nav__list__drop:focus-within 替代 .nav__list__drop.has-focus 。當你操作鍵盤,讓下拉式功能表項獲得焦點時,就會顯示下拉式功能表。
.nav__list a:focus + .nav__list__drop,.has-drop:hover .nav__list__drop,.nav__list__drop:focus-within { opacity: 1; transform: translateY(0px); height: auto; z-index: 1;}
Off-screen Nav
Off-screen Nav是在移動端上常見的一個效果。那麼這個效果我們也可以通過 :focus-within 來實現。詳細代碼可以看下面這個樣本:
瀏覽器安全色性
:focus-within 雖然很有意思,但很多同學擔心它的相容性。通過Caniuse,我們可以看到瀏覽器對其支援度情況:
總結
如果你熟悉 :focus 並不奇怪,但是你知道 :focus-within 的話,說明你在不斷的關注CSS相關的新特性。當然這個屬性再次重新整理了CSS的世界真是奇怪。如果你感興趣的話,不仿自己寫寫Demo。你會喜歡上這個屬性的。