<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          震驚!純 CSS 的導(dǎo)航欄切換方案

          共 6112字,需瀏覽 13分鐘

           ·

          2021-04-04 02:04

          本文是非常有意思的一篇文章,介紹了 CSS 中,非常強大的一個知識點:

          如何通過點擊某個元素,控制其他元素~

          不用 Javascript,使用純 CSS 方案,實現(xiàn)類似下圖的導(dǎo)航欄切換:

          CSS 的強大之處有的時候超乎我們的想象,Tab 切換,常規(guī)而言確實需要用到一定的腳本才能實現(xiàn)。下面看看如何使用 CSS 完成同樣的事情。

          實現(xiàn) Tab 切換的難點在于如何使用 CSS 接收到用戶的點擊事情并對相關(guān)的節(jié)點進行操作。即是:

          1. 如何接收點擊事件
          2. 如何操作相關(guān)DOM

          下面看看如何使用兩種不同的方法實現(xiàn)需求:

          法一::target 偽類選擇器

          首先,我們要解決的問題是如何接收點擊事件,這里第一種方法我們采用 :target 偽類接收。

          :target 是 CSS3 新增的一個偽類,可用于選取當(dāng)前活動的目標(biāo)元素。當(dāng)然 URL 末尾帶有錨名稱 #,就可以指向文檔內(nèi)某個具體的元素。這個被鏈接的元素就是目標(biāo)元素(target element)。它需要一個 id 去匹配文檔中的 target 。

          解釋很難理解,看看實際的使用情況,假設(shè)我們的 HTML 代碼如下:

          <ul class='nav'>
              <li>列表1</li>
              <li>列表2</li>
          </ul>
          <div>列表1內(nèi)容:123456</div>
          <div>列表2內(nèi)容:abcdefgkijkl</div>

          由于要使用 :target,需要 HTML 錨點,以及錨點對應(yīng)的 HTML 片段。所以上面的結(jié)構(gòu)要變成:

          <ul class='nav'>
              <li><a href="#content1">列表1</a></li>
              <li><a href="#content2">列表2</a></li>
          </ul>
          <div id="content1">列表1內(nèi)容:123456</div>
          <div id="content2">列表2內(nèi)容:abcdefgkijkl</div>

          這樣,上面 <a href="#content1"> 中的錨點 #content1 就對應(yīng)了列表1 <div id="content1"> 。錨點2與之相同對應(yīng)列表2。

          接下來,我們就可以使用 :target 接受到點擊事件,并操作對應(yīng)的 DOM 了:

          #content1,
          #content2{
              display:none;
          }

          #content1:target,
          #content2:target{
              display:block;
          }

          上面的 CSS 代碼,一開始頁面中的 #content1#content2 都是隱藏的,當(dāng)點擊列表1觸發(fā) href="#content1" 時,頁面的 URL 會發(fā)生變化:

          1. www.example.com 變成 www.example.com#content1
          2. 接下來會觸發(fā) #content1:target{ } 這條 CSS 規(guī)則,#content1 元素由 display:none 變成 display:block ,點擊列表2亦是如此。

          如此即達到了 Tab 切換。當(dāng)然除了 content1 content2 的切換,我們的 li 元素樣式也要不斷變化,這個時候,就需要我們在 DOM 結(jié)構(gòu)布局的時候多留心,在 #content1:target 觸發(fā)的時候可以同時去修改 li 的樣式。

          在上面 HTML 的基礎(chǔ)上,再修改一下,變成如下結(jié)構(gòu):

          <div id="content1">列表1內(nèi)容:123456</div>
          <div id="content2">列表2內(nèi)容:abcdefgkijkl</div>
          <ul class='nav'>
              <li><a href="#content1">列表1</a></li>
              <li><a href="#content2">列表2</a></li>
          </ul>

          仔細(xì)對比一下與上面結(jié)構(gòu)的異同,這里我只是將 ul 從兩個 content 上面挪到了下面,為什么要這樣做呢?

          因為這里需要使用兄弟選擇符 ~ 。

          E~F{ cssRules } ,CSS3 兄弟選擇符(E~F) ,選擇 E 元素后面的所有兄弟元素 F。

          注意這里,最重要的一句話是 E~F 只能選擇 E 元素 之后 的 F 元素,所以順序就顯得很重要了。

          在這樣調(diào)換位置之后,通過兄弟選擇符 ~ 可以操作整個 .nav 的樣式。

          #content1:target ~ .nav li{
              // 改變li元素的背景色和字體顏色
              &:first-child{
                  background:#ff7300;
                  color:#fff;
              }
          }

          #content2:target ~ .nav li{
              // 改變li元素的背景色和字體顏色
              &:last-child{
                  background:#ff7300;
                  color:#fff;
              }
          }

          上面的 CSS 規(guī)則中,我們使用 ~ 選擇符,在 #content1:target#content2:target 觸發(fā)的時候分別去控制兩個導(dǎo)航 li 元素的樣式。

          至此兩個問題,1. 如何接收點擊事件2. 如何操作相關(guān)DOM 都已經(jīng)解決,剩下的是一些小樣式的修補工作。

          Demo戳我:純CSS導(dǎo)航切換(:target偽類實現(xiàn))[1]

          法二:<input type="radio"> && <label for="">

          上面的方法通過添加 <a> 標(biāo)簽添加頁面錨點的方式接收點擊事件。

          這里還有一種方式能夠接收到點擊事件,就是擁有 checked 屬性的表單元素, <input type="radio"> 或者  <input type="checkbox"> 。

          假設(shè)有這樣的結(jié)構(gòu):

          <input class="nav1" type="radio">

          <ul class='nav'>
              <li>列表1</li>
          </ul>

          對于上面的結(jié)構(gòu),當(dāng)我們點擊 <input class="nav1" type="radio"> 單選框表單元素的時候,使用 :checked 是可以捕獲到點擊事件的。

          .nav1:checked ~ .nav li {
            // 進行樣式操作
          }

          同樣用到了兄弟選擇符 ~

          這樣,當(dāng)接收到表單元素的點擊事件時,可以通過兄弟選擇符 ~ 操作它的兄弟元素的樣式。

          但是,這里有個問題 我們的 Tab 切換,要點擊的是<li>元素,而不是表單元素,所以這里很重要的一點是,使用 <label for=""> 綁定表單元素??纯慈缦陆Y(jié)構(gòu):

          <input class="nav1" id="li1" type="radio">

          <ul class='nav'>
              <li><label for="li1">列表1</label></li>
          </ul>

          通過使用 <label> 包裹一個 <li> 元素,而 <label> 有一個屬性 for 可以綁定一個表單元素。

          上面的 <li> 中,有一層 <label for="li"> ,里面的 for="li1" 意思是綁定 id 為li1 的表單元素。

          label 標(biāo)簽中的 for 定義:for 屬性規(guī)定 label 與哪個表單元素綁定。

          這樣改造之后,當(dāng)我們點擊 <li> 元素的時候,相當(dāng)于點擊了 <input class="nav1" id="li1" type="radio"> 這個單選框表單元素,而這個表單元素被點擊選中的時候,又可以被 :checked 偽類捕獲到。

          這個時候,我們就可以將頁面上的表單元素隱藏,做到點擊 <li> 相當(dāng)于點擊表單:

          input {
              display:none;
          }

          這樣,應(yīng)用到本題目,我們應(yīng)該建立如下 DOM 結(jié)構(gòu)及核心 CSS 樣式:

          <div class="container">
              <input class="nav1" id="li1" type="radio" name="nav">
              <input class="nav2" id="li2" type="radio" name="nav">
              <ul class='nav'>
                  <li class='active'><label for="li1">列表1</label></li>
                  <li><label for="li2">列表2</label></li>
              </ul>
              <div class="content">
                  <div class="content1">列表1內(nèi)容:123456</div>
                  <div class="content1">列表2內(nèi)容:abcdefgkijkl</div>
              </div>
          </div>
          input {
           display: none;
          }

          .nav1:checked ~ .content > div {
           display: none;

           &:first-child {
            display: block;
           }
          }
          .nav2:checked ~ .content > div {
           display: none;

           &:last-child {
            display: block;
           }
          }

          使用兩個單選框,分別對應(yīng)兩個導(dǎo)航選項,運用上面介紹的 label 綁定表單,:checked 接收點擊事件,可以得到第二解法。

          看看最后的結(jié)果:

          Demo戳我:純CSS導(dǎo)航切換(label 綁定 input:radio && ~) [2]

          最后

          我們在網(wǎng)上能夠看到的所有的關(guān)乎于純 CSS 導(dǎo)航,純 CSS Tab 切換,純 CSS 按鈕點擊控制其他元素的一些顯示、隱藏,動效的觸發(fā),其原理基本都是運用到了上述兩種方案。

          好了,本文到此結(jié)束,希望對你有幫助 :)

          參考資料

          [1]

          Demo戳我:純CSS導(dǎo)航切換(:target偽類實現(xiàn)): http://codepen.io/Chokcoco/pen/mAxQBv

          [2]

          Demo戳我:純CSS導(dǎo)航切換(label 綁定 input:radio && ~) : https://codepen.io/Chokcoco/pen/VKXXEq

          [3]

          Github -- iCSS: https://github.com/chokcoco/iCSS



          瀏覽 39
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  少妇一级婬片60分钟一 | 欧美色逼综合 | 黑人大屌在线 | 成人黄片在线免费观看 | 成人久久91久久 |