# 純CSS網頁page-transition 嗨嗨各位我是一小的佳勳:D 我選擇的主題是網頁的一個常用的方法 起因是我的主機空間有限,不能架多個網頁,但又想要有分類的內容,最後選擇學習tab切換的寫法 ~~覺得這樣寫超酷的~~ d(・∀・)b --- ### 希望呈現的效果 如下: {%youtube hOYpN73F8c8 %} 讓他在不同的頁面中切換,而不改變主要的網址 我們可以使用很多種方式達成類似的效果 如 * 純CSS * 原生js寫法 * jQery特效 * Vue3等等的 最後我選擇使用純CSS(~~因為我JS太爛了~~) --- ### 開始建置 ``` <a id="one">Section 1</a> <a id="two">Section 2</a> <a id="three">Section 3</a> ``` 先設定我們要使用的tab ``` body, html { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-rendering: optimizeLegibility; text-align: center; height: 100%; overflow: hidden; margin: inherit; } ``` 設定網頁介面的初始值 其中`overflow: hidden`可以讓多出版面外的圖像隱藏,也是這個形成的一個關鍵 ``` <nav> <div class="container"> <ul> <li><a href="#one">Section 1</a></li> <li><a href="#two">Section 2</a></li> <li><a href="#three">Section 3</a></li> </ul> </div> </nav> ``` 標籤`<nav>`可以做為網頁中提供導航欄連結的區域 也可以做成下拉式表單 在nav裡面新增ul、li ul: 標籤用來定義一個無排序的項目清單列表 li: 標籤通常用來顯示個別項目的標籤,可用來顯示文字清單或超連結清單等等 裡面用`<a>`做一個頁內連結 並連結到上面的id ``` nav { position: fixed; top: 0; left: 0; right: 0; z-index: 1; background: #370926; } nav ul li { display: inline-block; } nav ul li a { color: rgba(255, 255, 255, 0.45); font-size: 0.875rem; display: block; text-decoration: none; padding: 6px 15px; } nav ul li a:hover { color: #fff; } ``` 接著將我們的連結欄套上樣式 就是排版上的東東了 其中的`display`和`position`在CSS是非常好用的屬性 前者可以拿來改變物件的基礎特性 後者用來設定「物件定位時所要的參考對像」 學會活用他們會在排版上有很大的幫助 順帶一提`hover`代表當你的滑鼠指向它時 會有其他的反應呦(ノ>ω<)ノ ``` //html <section id="one"> <h1>Section 1</h1> </section> <section id="two"> <h1>Section 2</h1> </section> <section id="three"> <h1>Section 3</h1> </section> //css section { height: 100%; width: 100%; display: table; pointer-events: none; z-index: 0; -webkit-transition: transform 0.45s cubic-bezier(0, 0, 0.21, 1); transition: transform 0.45s cubic-bezier(0, 0, 0.21, 1); } section h1 { display: table-cell; vertical-align: middle; text-align: center; color: #fff; font-weight: lighter; } ``` 還有我們的內文版面 可以使用`transition`做出超蚌的簡易動畫 主要是用於縮放 同為CSS動畫屬性的還有`transform`和`animation` 同時用起來可以做出不少有趣的小動畫喔 --- ### 動畫範例 以下是網上大佬用純CSS做的動畫 orz orz orz <iframe height="300" style="width: 100%;" scrolling="no" title="pure CSS sponge" src="https://codepen.io/blackmusic-josh/embed/poZXeYq?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true"> See the Pen <a href="https://codepen.io/blackmusic-josh/pen/poZXeYq"> pure CSS sponge</a> by blackmusic-josh (<a href="https://codepen.io/blackmusic-josh">@blackmusic-josh</a>) on <a href="https://codepen.io">CodePen</a>. </iframe> --- ### 繼續coding ``` #one { background: #42113C; } #two { background: #618B25; } #three { background: #6BD425; } a[id="one"]:target ~ #one { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } a[id="two"]:target ~ #two { -webkit-transform: translate3d(0, -100%, 0); transform: translate3d(0, -100%, 0); } a[id="three"]:target ~ #three { -webkit-transform: translate3d(0, -200%, 0); transform: translate3d(0, -200%, 0); } ``` 這個是最後的圖層移位,設定背景顏色 `a[id="one"]:target ~ #one`能夠讓我們切換到我們所想要的頁面 點擊後會選取 `~`是同層全體選擇器 實際上有點像是點了之後將版面二移上去,取代版面一,再將其餘的版面隱藏 而`-webkit`這個前綴屬性是用來獲得瀏覽器的支援,實際上沒什麼用,不加也行 --- ### 專案範例 此為本次專案之範例程式 <iframe height="300" style="width: 100%;" scrolling="no" title=" CSS-Page-Transition範例" src="https://codepen.io/blackmusic-josh/embed/mdjZmGj?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true"> See the Pen <a href="https://codepen.io/blackmusic-josh/pen/mdjZmGj"> CSS-Page-Transition範例</a> by blackmusic-josh (<a href="https://codepen.io/blackmusic-josh">@blackmusic-josh</a>) on <a href="https://codepen.io">CodePen</a>. </iframe> 這有點像一個模板 可以將其套用或者在其他專案中活用 將來也會再繼續研究的@_@ --- ### 參考資料 附上參考資料: https://www.webdesigns.com.tw/jquery_tab.asp 使用jQuery特效做出Tab頁籤切換效果 https://ithelp.ithome.com.tw/articles/10276424?sc=iThomeR -超實用!tab頁籤切換:data- https://github.com/Patalin/CSS-Page-Transition CSS-Page-Transition原作者 https://ithelp.ithome.com.tw/articles/10233409 nav補充 https://ithelp.ithome.com.tw/articles/10200365 Transition補充 --- 感謝各位的閱讀啦 如果有說明的錯誤請告訴我:pray:(⁠っ⁠.⁠❛⁠ ⁠ᴗ⁠ ⁠❛⁠.⁠)⁠っ ***2023/2/10***