用 CSS :target 製作頁籤、手風琴功能

/

本篇要解決的問題

最近看到 CSS 有一個選擇器--「:target」,他可以針對錨點連結做樣式的改變。在 W3Schools 上的範例是做成頁籤(tabbed menu)、燈箱(modal),不過比較陽春,也沒有預設開啟的設計。

本篇算是對 :target 選擇器的小練習,是真的可以不用寫 JavaScript 就做出頁籤、手風琴這二個功能,但 August 在寫完後,還是覺得用 JS 會比較好,因為有些小地方只靠 CSS 似乎還是無法做到,比方後面會講到的預設只能開啟最後一個而無法預設開啟第一個。

本篇最後完成的 Demo 在這:https://codepen.io/letswrite/pen/poEEYVZ


頁籤 Tab

頁籤分為二部份:頁籤標題、對應的內容區塊。

因為頁籤標題必須要能提示使用者目前開啟的是哪一個,原本 August 是寫成這樣:

// 頁籤標題
a(href="#tab1") Tab1
a(href="#tab2") Tab2
a(href="#tab3") Tab3
// 內容區塊
#tab1.tab__content
#tab2.tab__content
#tab3.tab__content

但這樣能用 :target 寫到的樣式就只有內容區塊,寫不到標題,後來改成這樣:

// 頁籤標題
#tab1.tab__title
  a(href="#tab1") Tab1
#tab2.tab__title
  a(href="#tab2") Tab2
#tab3.tab__title
  a(href="#tab3") Tab3
// 內容區塊
#tab1.tab__content
#tab2.tab__content
#tab3.tab__content

但很悲摧的是,id 是唯一值,不能重複,因此最後是改成這樣:

// 頁籤標題
#tab1.tab__title
  a(href="#tab1") Tab1
#tab2.tab__title
  a(href="#tab2") Tab2
#tab3.tab__title
  a(href="#tab3") Tab3
// 內容區塊
.tab__content(data-id="tab1")
.tab__content(data-id="tab2")
.tab__content(data-id="tab3")

主要就是把內容區塊的 id 改成 data-id="xxx",這樣之後寫 CSS 時就可以寫成這樣:

#tab1:target ~ [data-id="tab1"],
#tab2:target ~ [data-id="tab2"],
#tab3:target ~ [data-id="tab3"]
  color: white

對,因為只能用 CSS 選擇器,不能用 JS,因此有幾組 Tab 就都要各自寫出來,當然,也可以用 Sass 的 @for 來寫。

這是廣告,點擊一下可以幫本站多個一點點的廣告收入,謝謝

~ 這個選擇器,就是選「同一層」,a ~ b 就是代表要選擇跟 a 同一層的 b

但它只能往後選,不能往前選,比方我們有一段 HTML 是這樣:

p.box.box1
p.ya.box2
p.box.box3

如果我們寫 .ya ~ .box,能選到的只有 .box3,選不到 .box1

因為這個特性,所以我們寫 Tab 預設打開某一塊內容時,就只能開啟最後一塊,而不能開啟第一塊。

最後,本篇 Demo 頁籤功能的 HTML 如下:

Sass 如下:


手風琴 Collapse

跟頁籤比起來,手風琴要來得比較簡單。

但因為要預設開啟內容區塊一樣是用 ~ 選擇器,所以也只能開啟最後一個。

本篇 Demo 手風琴功能的 HTML 如下:

這是廣告,點擊一下可以幫本站多個一點點的廣告收入,謝謝

Sass 如下:

Summary
用 CSS :target 製作頁籤、手風琴功能
Article Name
用 CSS :target 製作頁籤、手風琴功能
Description
本篇大綱:本篇要解決的問題。頁籤 Tab。手風琴 Collapse。本篇算是對 :target 選擇器的小練習,是真的可以不用寫 JavaScript 就做出頁籤、手風琴這二個功能。
Augustus
Let's Write
Let's Write
https://letswrite.tw/wp-content/uploads/2020/08/logo_512.jpg

隨選筆記文

Forms Google

Google 表單,提交後系統自動寄送回覆通知 email

Front-End

用 JavaScript 將 JSON 轉為 CSV 檔下載

Google Sheets

用 Google Sheets 紀錄表單資料

Front-End

File API 客製上傳檔案按鈕 / input file

Vue

D3.js、Vue 畫一個台灣地圖

Front-End

表單驗證:中文姓名、身分證、手機條碼、生日、信箱、手機、選擇縣市

Analytics Google

GA4 事件:GA3 事件轉移,及如何查看完整事件報表

API

GitHub API:建立 Issue、Comment – API、Personal access tokens

Google Sheets

用 Google Sheets 取得電子報中點擊回覆結果

API

Video.js 使用筆記:中文介面、取值、事件、改樣式

以下是留言,但關於留言的部份必需先讓你們知道:

本站的文章都是 August 因為覺得有趣,才會實作並整理成筆記文而後進行發表。

如果留言是希望把 Demo 改成「你想要」的樣子,或是把功能改成「符合你需求」的樣子,

Sorry~ 除非那修改是 August 也有興趣的,不然不會幫你們寫程式去面對工作或是交作業。

未來這類的留言不會再主動回覆。😎

另外,公開信箱是為了讓金流驗證用,

因為之前遇過幾次回信協助解決問題後,對方卻一聲謝謝也沒有,就這樣拿去幫工作交差。

因此決定不再回覆信件,有疑問就利用留言功能囉。