CSS 這些你冷落的性能,其實(shí)很好用能極大提升效率!
一個(gè)成功的Web App必須有良好的用戶體驗(yàn)。當(dāng)我們談及改善用戶體驗(yàn)時(shí),你會(huì)想到什么?
其實(shí),有一點(diǎn)是很容易被開(kāi)發(fā)者忽視的,那就是CSS。我們可以使用一些CSS技巧來(lái)改善網(wǎng)頁(yè)的表現(xiàn)形式、交互細(xì)節(jié)和可訪問(wèn)性。
而且這些技巧不需要花費(fèi)太多時(shí)間,也不需要消耗服務(wù)器資源。你只需要花兩個(gè)小時(shí)學(xué)習(xí),然后就可以把它應(yīng)用到你所有的項(xiàng)目中,并永遠(yuǎn)改善用戶體驗(yàn)。
可點(diǎn)擊區(qū)域有時(shí)你的按鈕很小,這可能導(dǎo)致用戶無(wú)法準(zhǔn)確點(diǎn)擊按鈕。這種現(xiàn)象經(jīng)常發(fā)生在移動(dòng)端上。如果用戶點(diǎn)擊次數(shù)太多,沒(méi)有點(diǎn)擊他們想要的按鈕,或者點(diǎn)擊錯(cuò)誤的按鈕,會(huì)讓他們感到非常沮喪。
那么,如何解決這個(gè)問(wèn)題呢?有些開(kāi)發(fā)者可能會(huì)說(shuō):把按鈕做大點(diǎn)。
但網(wǎng)頁(yè)中元素的大小往往是固定的,我們不能輕易調(diào)整一個(gè)元素的大小。而且如果按鈕太大,感覺(jué)很奇怪。
一個(gè)更好的解決方案是在不改變按鈕原始尺寸的情況下增加其可點(diǎn)擊區(qū)域。具體來(lái)說(shuō):我們可以使用偽元素來(lái)增加一個(gè)元素的可點(diǎn)擊區(qū)域。
例如,這里有一個(gè)按鈕。
<button id="btn">btn</button>
然后我們可以為它添加一個(gè)偽類。
#btn::before {
content: "";
position: absolute;
top: -20px;
right: -20px;
bottom: -20px;
left: -20px;
}
這時(shí),如果我們點(diǎn)擊按鈕周圍的區(qū)域,我們?nèi)匀豢梢杂|發(fā)按鈕的點(diǎn)擊事件。
事例地址:
??https://codepen.io/bytefishmedium/pen/rNYNoRX??
平滑滾動(dòng)
當(dāng)頁(yè)面被#鏈接滾動(dòng)時(shí),默認(rèn)效果是這樣的。
這種突然的跳躍會(huì)讓人感到不舒服。為了解決這個(gè)問(wèn)題,我們可以使用這個(gè)CSS樣式:sroll-behavior: smooth。
事例地址:https://codepen.io/bytefishmedium/pen/NWwWoKL
選擇所有文本
我們的網(wǎng)頁(yè)經(jīng)常需要提供一些內(nèi)容供用戶選擇,如電話號(hào)碼、地址、標(biāo)題等。而這些文字應(yīng)該是一個(gè)整體,我們希望當(dāng)用戶點(diǎn)擊部分文字時(shí),剩余的文字會(huì)被自動(dòng)選擇。
要實(shí)現(xiàn)這種效果非常簡(jiǎn)單,只需使用這個(gè)CSS樣式:user-select: all 。用戶選擇的CSS屬性控制用戶是否可以選擇文本。如果它的值是 all,意味著一個(gè)元素的所有內(nèi)容都將被原子化地選擇。
事例地址:https://codepen.io/bytefishmedium/pen/xxPxMZO
如果你想在文本被選中后添加一些額外的樣式,你可以使用::selection 。::selection CSS偽元素將樣式應(yīng)用于文檔中被用戶突出顯示的部分(比如在文本上點(diǎn)擊和拖動(dòng)鼠標(biāo))。
但要記住。只有某些CSS屬性可以和::selection一起使用。
- color
- background-color
- text-decoration 及其相關(guān)屬性
- text-shadow
- stroke-color, fill-color 和 stroke-width
事例地址:https://codepen.io/bytefishmedium/pen/gOXOqMz
Cursor
在不同的場(chǎng)景下使用不同的鼠標(biāo)樣式可以幫助讀者感知頁(yè)面的當(dāng)前狀態(tài),從而改善用戶的互動(dòng)體驗(yàn)。
cursor CSS屬性設(shè)置鼠標(biāo)指針在一個(gè)元素上時(shí)要顯示的鼠標(biāo)指針(如果有的話)。
光標(biāo)設(shè)置應(yīng)該告知用戶在當(dāng)前位置可以進(jìn)行的鼠標(biāo)操作,包括文本選擇、激活幫助或上下文菜單、復(fù)制內(nèi)容、調(diào)整表格大小,等等。你可以用一個(gè)關(guān)鍵詞來(lái)指定光標(biāo)的類型,或者加載一個(gè)特定的圖標(biāo)來(lái)使用(有可選的回退圖像和強(qiáng)制性的關(guān)鍵詞作為最后的回退)。
例如:
事例地址:https://codepen.io/bytefishmedium/pen/bGYGzRz
有很多光標(biāo)樣式,你可以在MDN文檔中找到它們。
Text Overflow
現(xiàn)在我們來(lái)看看 text-overflow 的問(wèn)題。如果一個(gè)文本容器的內(nèi)容是從服務(wù)器返回的,或者是由用戶輸入的,那么就很難預(yù)測(cè)這個(gè)文本會(huì)有多長(zhǎng)。
如果沒(méi)有任何預(yù)防措施,你可能會(huì)寫(xiě)出這樣的代碼。
<head>
<style>
.container{
border: 2px solid red;
width: 200px;
height: 60px;
}
</style>
</head>
<body>
<div class="container">
<div class="username">bytefish</div>
<p class="profile">FE, UX Designer</p>
</div>
</body>
這個(gè)容器有一個(gè)固定的寬度和高度,包裹著名字和介紹。
但如果有些用戶的簡(jiǎn)介太長(zhǎng),就會(huì)導(dǎo)致文本溢出容器,使頁(yè)面看起來(lái)很糟糕。
在這一點(diǎn)上,我們可以將溢出的文本折疊起來(lái)。做到這一點(diǎn)就像添加三行CSS樣式一樣簡(jiǎn)單。
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap; 可以使文本不被包起來(lái)。然后我們使用overflow: hidden來(lái)隱藏溢出的文本。最后,我們使用 text-overflow: ellipsis在文本的末尾添加一個(gè)圓點(diǎn),向用戶表明有一些隱藏的文本。
事例地址:https://codepen.io/bytefishmedium/pen/VwrwgdQ
Image
現(xiàn)在我們來(lái)討論一下圖片的風(fēng)格。網(wǎng)絡(luò)應(yīng)用中使用的圖片一般由后端提供。你可能已經(jīng)與后端開(kāi)發(fā)者達(dá)成協(xié)議,將圖片保持在一個(gè)固定的尺寸。然后你寫(xiě)下這樣的代碼。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.img-list {
display: flex;
flex-direction: row;
list-style: none;
}
</style>
</head>
<body>
<ul class="img-list">
<li>
<img src="https://miro.medium.com/fit/c/128/128/1*TyRLQdZO7NdPATwSeut8gg.png">
</li>
<li>
<img src="https://miro.medium.com/fit/c/128/128/1*pKOfOAOvx-fWzfITATgGRg.jpeg">
</li>
<li>
<img src="https://miro.medium.com/fit/c/128/128/1*mXOVdfMwS0IEcjPXiikJkg.png">
</li>
</ul>
</body>
</html>
而網(wǎng)頁(yè)看起來(lái)是這樣的。
圖片的排列與我們所期望的一樣。
通常情況下是沒(méi)有問(wèn)題的。但是當(dāng)我們寫(xiě)代碼時(shí),我們不能假設(shè)一切都會(huì)按照我們的預(yù)期發(fā)展。我們需要做好充分的準(zhǔn)備。如果后端返回的圖片不正常,不符合預(yù)期的尺寸,可能大也可能小,那么布局就會(huì)被打亂。
你可以用這個(gè)替換其中一張圖片的鏈接。
https://miro.medium.com/max/1400/0*zQaS0awtSTOO-JYa.jpg
你會(huì)發(fā)現(xiàn),頁(yè)面突然變得雜亂無(wú)章。
為了防止這個(gè)問(wèn)題,使我們的頁(yè)面更加健壯,我們可以設(shè)置圖片的寬度和高度。這樣,我們就不必?fù)?dān)心后端返回的圖片的大小。
img {
width: 128px;
height: 128px;
}
但上述寫(xiě)法有一個(gè)缺點(diǎn):如果圖像本身的長(zhǎng)寬比與我們?cè)O(shè)定的長(zhǎng)寬比不一致,圖像將被壓縮或拉伸。
為了保持圖像的原始長(zhǎng)寬比,我們可以使用 object-fit: cover 。
img {
width: 128px;
height: 128px;
object-fit: cover;
}
object-fit 的CSS屬性設(shè)置一個(gè)被替換的元素的內(nèi)容,如或,應(yīng)該如何調(diào)整大小以適合其容器。
如果該值是 cover,那么被替換的內(nèi)容的大小將保持其長(zhǎng)寬比,同時(shí)填充元素的整個(gè)內(nèi)容框。如果對(duì)象的長(zhǎng)寬比與它的盒子的長(zhǎng)寬比不一致,那么該對(duì)象將被剪掉以適配。
無(wú)圖片
我們之前討論的情況都是建立在我們能夠得到圖片的前提下。但是,在實(shí)際應(yīng)用中,可能由于后端服務(wù)的不穩(wěn)定,或者用戶自身的網(wǎng)絡(luò)信號(hào)不好,我們的網(wǎng)頁(yè)可能無(wú)法正確加載圖片。
當(dāng)圖片缺失時(shí),瀏覽器的默認(rèn)樣式是不優(yōu)雅的,這里我們可以優(yōu)化它。
我們可以給 img元素添加一個(gè) onerror 事件。如果在加載圖片時(shí)出現(xiàn)了錯(cuò)誤,那么我們可以通過(guò)onerror事件給該元素添加一個(gè)樣式,并使用404圖片。
img 元素:
<img src="https://miro.medium.com/xxx.jpg" alt='fireworks picture' onerror="this.classList.add('error');">
假設(shè)這就是我們的404圖像:
https://cdn-images-1.medium.com/max/1600/1*we8wfyztsdo12e2Cww6oVA.jpeg
下面是 css 代碼
img.error {
display: inline-block;
transform: scale(1);
content: '';
color: transparent;
}
img.error::before {
content: '';
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
background: #f5f5f5 url('https://cdn-images-1.medium.com/max/1600/1*we8wfyztsdo12e2Cww6oVA.jpeg') no-repeat center / 100% 100%;
}
這樣,當(dāng) img 元素中的圖片鏈接無(wú)法加載圖片時(shí),我們的404圖片將被使用。
這里還有一點(diǎn)需要優(yōu)化。在這種情況下,如果原始圖片沒(méi)有被正確加載,用戶就不知道這個(gè)圖片應(yīng)該是什么。為了方便用戶理解,我們可以將 img 元素的 alt 屬性顯示在頁(yè)面上。
img.error::after {
content: attr(alt);
position: absolute;
left: 0;
bottom: 0;
width: 100%;
line-height: 2;
background-color: rgba(0, 0, 0, .5);
color: white;
font-size: 12px;
text-align: center;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
假設(shè)img的 alt 屬性是這樣的。
事例地址:https://codepen.io/bytefishmedium/pen/vYWYMxG
色彩對(duì)比度
當(dāng)你在設(shè)計(jì)顏色組合時(shí),你是否考慮過(guò)頁(yè)面的顏色對(duì)比?
你需要知道,世界上有很多色盲和色弱用戶。如果你的頁(yè)面的對(duì)比度低,可能會(huì)導(dǎo)致他們無(wú)法正常使用你的產(chǎn)品。無(wú)論是出于人文關(guān)懷,還是出于留住客戶的考慮,你都應(yīng)該設(shè)計(jì)出合適的對(duì)比度。
WCAG AA規(guī)范指出,所有重要的內(nèi)容需要有4.5:1以上的色彩對(duì)比度。
這里有一個(gè)對(duì)比度檢查器的工具。
??https://webaim.org/resources/contrastchecker/??
事例:
我們也可以使用Chrome DevTool來(lái)檢查一個(gè)元素的顏色對(duì)比。然后我們可以發(fā)現(xiàn),Medium的網(wǎng)頁(yè)也在實(shí)踐這一原則。
總結(jié)俗話說(shuō)得好,細(xì)節(jié)決定成敗。如果你的項(xiàng)目有很多可以改善用戶體驗(yàn)的細(xì)節(jié),你就可以讓用戶感到舒服,你就有更高的成功概率。
~完,我是刷碗智,新的一年我們一起刷刷刷!
作者:Shadeed 譯者:前端小智 來(lái)源:medium
原文:https://betterprogramming.pub/10-css-tricks-that-greatly-improve-user-experience-5ee52886ca4b
本文轉(zhuǎn)載自微信公眾號(hào)「大遷世界」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系大遷世界公眾號(hào)。