iT邦幫忙

2024 iThome 鐵人賽

DAY 27
1
Modern Web

Super Easy CSS,極度簡單 PART 2!寫出漂亮的 CSS系列 第 27

#61 利用 checkbox/ radio 與 CSS grid,做到純 CSS FAQ 開合選單(Collapse 折疊 / Accordion 手風琴效果)

  • 分享至 

  • xImage
  •  

前幾篇我們有提到 CSS transition 的特性:

延伸閱讀:#51 CSS Transition 與一些小技巧:倒帶、影響相鄰的兄弟

transition 是兩個狀態之間的過渡效果,但這個過渡效果只適用於可以計算的數值型屬性。例如,widthheightopacity 等等。所以,像 autodisplay: nonebackground-image 這類非數值型屬性是無法有過渡效果的。

所以,通常要做內容長度不固定的 FAQ 文字摺疊選單,都要使用 JS 去計算文字欄位的總長度,再用這個數字去縮合選單。

不過,之前看了「請網這邊走 This Web」寫的這篇文章:如何用 CSS 做 Accordion 手風琴?不再需要用 JS 計算高度 ,學到原來利用 Grid 的 grid-template-rows,從 0fr1fr 就可以做到 transition 過渡效果,等於說變相實現了從 0auto 的動畫。真神奇!

如果想複習 Grid,可以參考很久以前的這篇:
#19 CSS Grid、Subgrid:網頁排版的神奇格子,來排個照片牆與雞腿便當吧!

所以,我想可以結合「請網這邊走 This Web」教的 Grid 伸縮原理,再加上這幾篇練習用 checkbox / radio 做 toggle 行為,把整個 code 都改為純 CSS,結果是可以的!


DEMO

  • 由於 radio 是單選行為,所以可以做出「Accordion 手風琴效果」,一次固定只能開啟一個內容(然後無法全關)。

  • checkbox 是多選,所以可以一直開開關關都沒問題,是常見的「Collapse 折疊效果」。

DEMO: Pure CSS Collapse/ Accordion FAQ

以下列出控制開關的關鍵部分,其餘的 code 詳見 DEMO。

.faq-text {
    display: grid;
    grid-template-rows: 0fr;
    transition: .4s ease-in-out;
    > * {
        overflow: hidden;
    }
}

/* radio or checkbox */
.faq-toggle {
    display: none;
    &:checked{
        ~ .faq-title{
            padding-bottom: .5rem;
        }
        ~ .faq-title .material-icons:before{
            content: "remove";
        }
        ~ .faq-text{
            grid-template-rows: 1fr;
        }
    }
}

這些 DEMO 是為了解釋基本原理,實際在開發中,排版的細節可能更多,也可能會搭配自己定義的變數或 UI 框架,到時候需要依據自己的需求調整喔!


上一篇
#60 利用 checkbox,做到純 CSS 開關網頁選單、收合側邊欄
下一篇
#62 使用 CSS overflow 自訂捲動範圍
系列文
Super Easy CSS,極度簡單 PART 2!寫出漂亮的 CSS30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言