ホームページ  >  記事  >  ウェブフロントエンド  >  Pure CSS ナビゲーション バー タブ切り替えソリューション

Pure CSS ナビゲーション バー タブ切り替えソリューション

高洛峰
高洛峰オリジナル
2016-10-13 13:46:341416ブラウズ

Javascript は必要ありません。純粋な CSS ソリューションを使用して、下の図のようなナビゲーション バーの切り替えを実現します。

Pure CSS ナビゲーション バー タブ切り替えソリューション

CSS のパワーは、日常的であり、言語の想像を超えている場合があります。特定のスクリプトを実装する必要があります。 CSS を使用して同じことを実現する方法を見てみましょう。

タブ切り替えの実装で難しいのは、CSS を使用してユーザーのクリック イベントを受け取り、関連するノードを操作する方法です。つまり:

クリック イベントの受信方法

​​ 関連する DOM の操作方法

要件を達成するために 2 つの異なる方法を使用する方法を見てみましょう:

方法 1: :target pseudo-class selector

まず、解決する必要があります。問題は、クリック イベントを受信する方法です。最初の方法は、:target 疑似クラスを使用して受信することです。

:target は、現在アクティブなターゲット要素を選択するために使用できる CSS3 の新しい疑似クラスです。もちろん、URL の末尾にあるアンカー名 # は、ドキュメント内の特定の要素を指すことができます。リンクされた要素がターゲット要素です。ドキュメント内のターゲットと一致するには ID が必要です。

説明がわかりにくいので、実際の使い方を見てみましょう。 HTML コードが次のとおりであるとします。 :target を使用したいので、HTML アンカー ポイントとアンカーに対応する HTML フラグメントが必要です。ポイント。したがって、上記の構造は次のようになります:

<span style="font-family: verdana, geneva;"><ul class=&#39;nav&#39;>
    <li>列表1</li>
    <li>列表2</li>
</ul>
<div>列表1内容:123456</div>
<div>列表2内容:abcdefgkijkl</div></span>

このように、上記 のアンカー ポイント #content1 はリスト 1

に対応します。アンカー 2 はリスト 2 と同じです。

次に、:target を使用してクリック イベントを受け取り、対応する DOM を操作できます:

<span style="font-family: verdana, geneva;"><ul class=&#39;nav&#39;>
    <li><a href="#content1">列表1</a></li>
    <li><a href="#content2">列表2</a></li>
</ul>
<div id="content1">列表1内容:123456</div>
<div id="content2">列表2内容:abcdefgkijkl</div></span>
上記の CSS コードでは、リスト 1 がクリックされたとき、ページ内の #content1 と #content2 が最初に非表示になります。 ="#content1" がトリガーされると、ページの URL が変更されます:

1. www.example.com から www.example.com#content1

2. 次に、#content1:target{ } がトリガーされます。ルールにより、 #content1 要素は display:none から display:block に変更され、クリック リスト 2 にも同じことが当てはまります。

これがタブ切り替えの仕組みです。もちろん、content1 content2 の切り替えに加えて、li 要素のスタイルも常に変化する必要があります。このとき、#content1:target がトリガーされるときに DOM 構造をレイアウトするときにさらに注意を払う必要があります。 li のスタイルも同時に変更できます。

上記のHTMLを元に、以下の構造になるように修正します。

<span style="font-family: verdana, geneva;"><div id="content1">列表1内容:123456</div>
<div id="content2">列表2内容:abcdefgkijkl</div>
<ul class=&#39;nav&#39;>
    <li><a href="#content1">列表1</a></li>
    <li><a href="#content2">列表2</a></li>
</ul></span>

仔细对比一下与上面结构的异同,这里我只是将 ul 从两个 content 上面挪到了下面,为什么要这样做呢?

因为这里需要使用兄弟选择符 ~ 。

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

注意这里,最重要的一句话是 E~F 只能选择 E 元素 之后 的 F 元素,所以顺序就显得很重要了。

在这样调换位置之后,通过兄弟选择符 ~ 可以操作整个 .nav 的样式。

<span style="font-family: verdana, geneva;">#content1:target ~ .nav li{
    // 改变li元素的背景色和字体颜色
    &:first-child{
        background:#ff7300;
        color:#fff;
    }
}
#content2:target ~ .nav li{
    // 改变li元素的背景色和字体颜色
    &:last-child{
        background:#ff7300;
        color:#fff;
    }
}</span>

上面的 CSS 规则中,我们使用 ~ 选择符,在 #content1:target 和 #content2:target 触发的时候分别去控制两个导航 li 元素的样式。

至此两个问题,1. 如何接收点击事件 与 2. 如何操作相关DOM 都已经解决,剩下的是一些小样式的修补工作。

法二: && 

上面的方法通过添加  标签添加页面锚点的方式接收点击事件。

这里还有一种方式能够接收到点击事件,就是拥有 checked 属性的表单元素,  或者 。

假设有这样的结构:

<input class="nav1" type="radio">
 
<ul class=&#39;nav&#39;>
    <li>列表1</li>
</ul>

对于上面的结构,当我们点击  单选框表单元素的时候,使用 :checked是可以捕获到点击事件的。

.nav1:checked ~ .nav li {
  // 进行样式操作
}

同样用到了兄弟选择符 ~

这样,当接收到表单元素的点击事件时,可以通过兄弟选择符 ~ 操作它的兄弟元素的样式。

但是,这里有个问题 我们的 Tab 切换,要点击的是

  • 元素,而不是表单元素,所以这里很重要的一点是,使用 
  •  元素,而 
  • 上面的 

  •  中,有一层 
  •  元素的时候,相当于点击了 这个单选框表单元素,而这个表单元素被点击选中的时候,又可以被 :checked 伪类捕获到。

    这个时候,我们就可以将页面上的表单元素隐藏,做到点击 

  •  相当于点击表单:
    input{
        display:none;
    }

    这样,应用到本题目,我们应该建立如下 DOM 结构:

    <div class="container">
        <input class="nav1" id="li1" type="radio" name="nav">
        <input class="nav2" id="li2" type="radio" name="nav">
        <ul class=&#39;nav&#39;>
            <li class=&#39;active&#39;><label for="li1">列表1</label></li>
            <li><label for="li2">列表2</label></li>
        </ul>
        <div class="content">
            <div class="content1">列表1内容:123456</div>
            <div class="content1">列表2内容:abcdefgkijkl</div>
        </div>
    </div>

    使用两个单选框,分别对应两个导航选项,运用上面介绍的 label 绑定表单,:checked 接收点击事件,可以得到第二解法。

  • 声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。