學習重點
HTML 架構
這次的 HTML 的架構很重要,有兩個區塊,有圖示+名字,對話框,並有本地用戶與遠端用戶,雖然對話框會產生很多,但結構都是一樣,所以先把一組做出來後,後續 JS 帶入文字訊息即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <div class="dialogue"> <div class="user remote"> <div class="avatar"> <div class="pic"> <img src="https://picsum.photos/100/100?random=12" /> </div> <div class="name">You</div> </div> <div class="text">這是妳的對話文字</div> </div> <div class="user local"> <div class="avatar"> <div class="pic"> <img src="https://picsum.photos/100/100?random=16" /> </div> <div class="name">Me</div> </div> <div class="text">這是我的對話文字</div> </div> </div>
|
CSS 樣式
這次 CSS 比較複雜,分別記錄。
dialogue 主架構樣式
就一般的外觀設定,不贅述。
1 2 3 4 5 6 7
| .dialogue { width: 500px; padding: 20px; box-shadow: 0 0 10px #000; background-color: #f4f5f7; border-radius: 20px; }
|
user 結構樣式
- 使 .user 的元素橫排並靠左對齊,往下推擠 20px。
- 大頭照樣式設定,因 flex 會自動收縮,所以使域 flex-shrink:0,取消其自動縮放的特性。
- 使圖片為圓形,並佔滿空間。
- 文字區域設定。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| .user { display: flex; align-items: flex-start; margin-bottom: 20px; .avatar { width: 60px; text-align: center; flex-shrink: 0; } .pic { border-radius: 50%; overflow: hidden; img { width: 100%; vertical-align: middle; } } .name { color: #333; } .text { background-color: #aaa; padding: 16px; border-radius: 10px; position: relative; } }
|
remote 與 local 架構樣式
這兩者基本上架構相同,只是方向不同。
remote 用戶端樣式
- 因
.user
已經設定靠左對齊,所以這邊不再重複設定。
- 文字區域重要的地方是偽元素的設定,是三角形本體的顏色與位置。
1 2 3 4 5 6 7 8 9 10 11 12
| .remote { .text { margin-left: 20px; margin-right: 80px; color: #eee; background-color: #4179f1; &::before { border-right: 10px solid #4179f1; left: -10px; } } }
|
local 本地端樣式
- 使本地用戶靠右對齊。
- 文字區域重要的地方式偽元素的設定,是三角形本體的顏色與位置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| .local { justify-content: flex-end; .text { margin-right: 20px; margin-left: 80px; order: -1; background-color: #fff; color: #333; &::before { border-left: 10px solid #fff; right: -10px; } } }
|
共同使用樣式 - 三角形
三角形怎麼寫可以看CSS 筆記 - 三角形演進史。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| .remote, .local { & .text::before { content: ""; position: absolute; top: 20px; border-top: 10px solid transparent; border-bottom: 10px solid transparent; } .text { font-weight: 300; box-shadow: 0 0 10px #888; } }
|
這樣就完成囉!!
CodePen https://codepen.io/hnzxewqw/full/xxZedag
參考資料