Javascript は必要ありません。純粋な 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='nav'>
<li>列表1</li>
<li>列表2</li>
</ul>
<div>列表1内容:123456</div>
<div>列表2内容:abcdefgkijkl</div></span>
このように、上記 のアンカー ポイント #content1 はリスト 1
に対応します。アンカー 2 はリスト 2 と同じです。次に、:target を使用してクリック イベントを受け取り、対応する DOM を操作できます: 仔细对比一下与上面结构的异同,这里我只是将 ul 从两个 content 上面挪到了下面,为什么要这样做呢? 因为这里需要使用兄弟选择符 ~ 。 E~F{ cssRules } ,CSS3 兄弟选择符(E~F) ,选择 E 元素后面的所有兄弟元素 F。 注意这里,最重要的一句话是 E~F 只能选择 E 元素 之后 的 F 元素,所以顺序就显得很重要了。 在这样调换位置之后,通过兄弟选择符 ~ 可以操作整个 .nav 的样式。 上面的 CSS 规则中,我们使用 ~ 选择符,在 #content1:target 和 #content2:target 触发的时候分别去控制两个导航 li 元素的样式。 至此两个问题,1. 如何接收点击事件 与 2. 如何操作相关DOM 都已经解决,剩下的是一些小样式的修补工作。 法二: && 上面的方法通过添加 标签添加页面锚点的方式接收点击事件。 这里还有一种方式能够接收到点击事件,就是拥有 checked 属性的表单元素, 或者 。 假设有这样的结构: 对于上面的结构,当我们点击 单选框表单元素的时候,使用 :checked是可以捕获到点击事件的。 同样用到了兄弟选择符 ~ 这样,当接收到表单元素的点击事件时,可以通过兄弟选择符 ~ 操作它的兄弟元素的样式。 但是,这里有个问题 我们的 Tab 切换,要点击的是<span style="font-family: verdana, geneva;"><ul class='nav'>
<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>
<span style="font-family: verdana, geneva;"><div id="content1">列表1内容:123456</div>
<div id="content2">列表2内容:abcdefgkijkl</div>
<ul class='nav'>
<li><a href="#content1">列表1</a></li>
<li><a href="#content2">列表2</a></li>
</ul></span>
<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>
<input class="nav1" type="radio">
<ul class='nav'>
<li>列表1</li>
</ul>
.nav1:checked ~ .nav li {
// 进行样式操作
}