剛準備寫的時候想着我 CSS 已經熟練了,隨便寫寫應該就差很少了吧,15分鐘才寫了個半成品,還醜的很,必定是這十來天美譽寫 CSS 的緣由(甩鍋)。css
因此仍是安安分分的按照套路來吧,先寫個 DIV,再把它填充,重複多個……html
感謝 comehope 大佬的 [前端每日實戰]
github.io 瀏覽
https://github.com/shanyuhai1...前端
<div class="timeline"> <h1>文檔時間線</h1> <div class="cards"> <section class="card"></section> </div> </div>
常規樣式初始化:vue
* { margin: 0; padding: 0; box-sizing: border-box; } body { height: 100vh; } h1 { text-align: center; }
card
樣式整體佈局的 timeline
暫時不用考慮,首先完成 card
,以後將多個 card
組合時才須要考慮。git
card
分爲兩部分 header
存放標題,article
存放內容詳情。github
修改 DOM
結構segmentfault
<section class="card"> <header class="card__header"> <div class="header__number"> <span>1</span> </div> <h2 class="header__title"> <span class="title__date">2019-03-09</span> <span class="title__sub">副標題</span> </h2> </header> <article class="card__article"> <p>今天是個好日子</p> </article> </section>
修改 card
樣式佈局
.card { position: relative; width: 400px; height: 200px; display: flex; flex-direction: column; box-shadow: 0px 3px 1px -2px rgba(0,0,0,0.2), 0px 2px 2px 0px rgba(0,0,0,0.14), 0px 1px 5px 0px rgba(0,0,0,0.12); /* 觀測用,待刪除 */ border: 1px dashed darkorange; }
這樣一個基礎的 card
就實現了。flex
card
樣式header 結構spa
.card__header { display: flex; align-items: center; width: 100%; height: 35%; color: #fff; background-color: #134857; overflow: hidden; }
header 內部
.header__number { display: flex; align-items: center; justify-content: center; margin: 0 20px; padding: 6px 14px; font-size: 2rem; background-color: rgba(0,0,0,0.17); } .header__title { display: flex; margin-left: 10px; flex-direction: column; font-size: 0.6rem; } .title__sub { padding-top: 6px; font-size: 1.2rem; }
article 結構
article 初步的想法仍是比較簡單的:
.card__article { width: 100%; height: 65%; background-color: #fff; border: 1px solid rgba(200,200,200,0.5); border-top: none; padding: 10px; }
card
修改 DOM 結構
在 .cards
中增長多個 card
,此處僅顯示 DOM 結構省略了部份內容。
<div class="timeline"> <h1>飛越高山與大洋的魚</h1> <div class="cards"> <section class="card"> <header class="card__header"> <div class="header__number"> <span>1</span> </div> <h2 class="header__title"> <span class="title__date">2019-03-09</span> <span class="title__sub">副標題</span> </h2> </header> <article class="card__article"> <p>今天是個好日子</p> </article> </section> <section class="card"></section> <section class="card"></section> <section class="card"></section> </div> </div>
.cards 時間線
修改 .cards
、.card
大小,並利用僞元素增長中間線:
.cards { position: relative; display: flex; flex-direction: column; width: 100%; height: 100%; /* 觀測用,待刪除 */ border: 1px solid #000; } .cards::after { z-index: 9; content: ""; position: absolute; top: 0; bottom: 0; left: 50%; border-left: 1px solid rgba(200,200,200,0.5); } .card { width: 46%; }
card
分列兩側
.card:nth-child(odd) { align-self: flex-start; } .card:nth-child(even ) { align-self: flex-end; }
增長三角標識
利用 header 的僞元素實現
.card:nth-child(odd) .card__header::after { position: absolute; left: 100%; content: ""; width: 0; height: 0; border-style: solid; border-width: 10px 0 10px 18px; border-color: transparent transparent transparent #134857; } .card:nth-child(even) .card__header::after { position: absolute; right: 100%; content: ""; width: 0; height: 0; border-style: solid; border-width: 10px 18px 10px 0; border-color: transparent #134857 transparent transparent; }
中間線上增長標識點
.card:nth-child(odd) .card__header::before { z-index: 10; position: absolute; left: calc(111.11% - 2.5px); content: ""; width: 10px; height: 10px; border-radius: 10px; background-color: #bdbdbd; box-shadow: 0 0 2px 6px #fff; } .card:nth-child(even) .card__header::before { z-index: 10; position: absolute; right: calc(111.11% - 5px); content: ""; width: 10px; height: 10px; border-radius: 10px; background-color: #bdbdbd; box-shadow: 0 0 2px 6px #fff; }
去除 border 註釋
直接刪除便可。
header 賦予不一樣顏色
設置默認色:
:root { --bg-color: #10aec2; } .card__header { background-color: var(--bg-color); } .card:nth-child(odd) .card__header::after { border-color: transparent transparent transparent var(--bg-color); } .card:nth-child(even) .card__header::after { border-color: transparent var(--bg-color) transparent transparent; }
修改成 4 種顏色循環(若想要循環更多顏色增長 n 便可):
.card:nth-child(4n) { --bg-color: #10aec2; } .card:nth-child(4n+1) { --bg-color: #fbc82f; } .card:nth-child(4n+2) { --bg-color: #74759b; } .card:nth-child(4n+3) { --bg-color: #346c9c; }
修改間隔
h1 { margin-bottom: 10px; } .cards { padding: 10px 16px; }
其實這個只完成了一半,還有進一步適配移動端還未完成,以後會補上。
移動端效果已更新:效果,具體的實現以後補上。