CSS 專家提示

小可嗒嗒發表於2018-05-19

最簡單的 CSS Reset

CSS Resets 強化跨瀏覽器的一致性,並提供元素以乾淨的層疊樣式。你可以使用諸如 Normalize 的 CSS reset 庫。或者使用一種更為簡單的方式:

* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}
複製程式碼

現在,所有的元素都除掉了瀏覽器預設的 marginpaddingbox-sizing 讓你可以使用 CSS 盒模型管理佈局。

Demo

如果遵循下面的 繼承 box-sizing, 你可以選擇不在 CSS Reset 中包含 box-sizing

繼承 box-sizing

讓所有元素 box-sizing 繼承自 html

html {
  box-sizing: border-box;
}

*, *::before, *::after {
  box-sizing: inherit;
}
複製程式碼

這種方式更容易在一些外掛中或其他元件中改變 box-sizing 的值。

重置元素的所有屬性,使用 unset

當重置一個元素的所有屬性,並不需要重置它的每個屬性。

button {
  background: none;
  border: none;
  color: inherit;
  font: inherit;
  outline: none;
  padding: 0;
}
複製程式碼

你使用簡寫的 all 來指定所有的元素屬性,其值為 unset 將元素的屬性重置為最初值。

button {
  all: unset;
}
複製程式碼

相容性提示:allIE11 內不支援,目前是否在 Edge 中支援也不確定。

使用 :not() 應用於導航

為了滿足導航類樣式的設計,通常的做法是:

/* add border */
.nav li {
  border-right: 1px solid #666;
}
複製程式碼

然後將 border 從最後一個元素去除。

.nav li:last-child {
  border-right: none;
}
複製程式碼

使用偽類 :not() 作用於你想要的元素。

.nav li:not(:last-child) {
  border-right: 1px solid #666;
}
複製程式碼

你當然可以使用 .nav li + li,但是 :not() 有表述更清晰,更符合我們描述的方式。

Demo

往 body 中新增 line-height

你不需要為每個 <p><h*> 等元素新增 line-height。相反,把它新增到 body 元素。

body {
  line-height: 1.5;
}
複製程式碼

這樣,文字元素就可以輕鬆地從 body 元素進行繼承。

Demo

垂直居中任何內容

這並不是什麼黑魔法,但非常有效:

html, body {
  height: 100%;
  margin: 0;
}

body {
  -webkit-align-items: center;
  -ms-flex-align: center;
  align-items: center;
  display: -webkit-flex;
  display: flex;
}
複製程式碼

想要在任意情況任何地方垂直或水平居中元素內容,CSS-Tricks 網站上有一篇非常好的文章

譯者注: 該文章已被譯者翻譯,CSS 居中的完整教程

注意,flex 盒在豬隊友 IE11 上有一些怪異的問題

逗號分隔的列表

讓列表項看起來像一個真的逗號分隔的列表。

ul > li:not(:last-child)::after {
  content: ",";
}
複製程式碼

使用 :not() 偽類,讓最後一個列表項不新增逗號。

注意:這個提示對於使用者的可訪問性並不是理想的,尤其是視訊閱讀的使用者。而且,在瀏覽器裡進行的複製、拷貝操作對於 CSS 生成的內容並不會有效果。謹慎使用。

使用負值的 nth-child 選擇項

使用負的 nth-child 選擇 1 到 n 的專案。

li {
  display: none;
}

/* 選擇排序 1 到 3 專案, 並且展示它們*/
li:nth-child(-n+3) {
  display: block;
}
複製程式碼

既然瞭解了 :not(),嘗試:

/* 選擇除了前三個的所有項,並且展示它們 */
li:not(:nth-child(-n+3)) {
  display: none;
}
複製程式碼

Demo

使用 SVG 圖示

沒有理由不使用 SVG 圖示。

.logo {
  background: url("logo.svg");
}
複製程式碼

SVG 對所有解析度裝置都要很好的適配性,並且適配 IE9 及以上的所有瀏覽器。拋棄 .png.jpg.gif 等檔案型別吧。

注意:如果你有對視力障礙使用者專用的 SVG 按鈕,但載入失敗。下面的樣式可以提升可訪問性。

.no-svg .icon-only::after {
  content: attr(aria-label);
}
複製程式碼

使用 “遲鈍的貓頭鷹” 選擇器

這可能是個奇怪的名字,但是使用通用選擇器(*) 結合兄弟選擇器(+)可以提供強大的 CSS 能力。

* + * {
  margin-top: 1.5em;
}
複製程式碼

這個例子中,文件流中的緊接著一個元素之後的所有元素都會收到一個 margin-top: 1.5rem

更多參考,請閱讀 Heydon Pickering's post

為純 CSS 滑塊使用 max-height

為單純採用 CSS 實現的滑塊採用 max-heightoverflow: hidden

.slider {
  max-height: 200px;
  overflow-y: hidden;
  width: 300px;
}
.slider:hover {
  max-height: 600px;
  overflow-y: scroll;
}
複製程式碼

元素 hover 時延展到 max-height 值,由於設定了 overflow,滑塊就出現了。

等寬單元格

處理表格非常痛苦。嘗試使用 table-layout: fixed 來保持單元格等寬。

.calendar {
  table-layout: fixed;
}
複製程式碼

“無痛的” 表格佈局。

Demo

“逃脫”彈性盒外邊距的 Hacks

當處理列的多餘空間時,丟棄 nth-first-last-child 等 Hack 技術,使用彈性盒的 space-between

.list {
  display: flex;
  justify-content: space-between;
}

.list .person {
  flex-basis: 23%;
}
複製程式碼

現在,列的多餘空間會被均勻分配。

使用屬性選擇器處理“空的”連結

<a> 元素沒有文字值但 href 屬性有連結時,直接展示連結的方法:

a[href^="http"]:empty::before {
  content: attr(href);
}
複製程式碼

這非常方便。

Demo

為 “預設” 連結新增樣式

為 “預設” 的連結新增樣式:

a[href]:not([class]) {
  color: #008000;
  text-decoration: underline;
}
複製程式碼

通過 CMS 插入的連結通常沒有 class 屬性,上述方法可以不影響其他元素的情況下突出連結。

統一的垂直結構

在一個元素內使用通用選擇器(*)來建立一致的垂直結構:

.intro > * {
  margin-bottom: 1.25rem;
}
複製程式碼

一致的垂直結構讓內容更為已讀,極具審美。

內部比例盒

為了建立一個內部比例盒,所需要的僅僅是為一個 div 增加一個上內邊距或下內邊距。

.container
  height: 0;
  padding-bottom: 20%;
  position: relative;
}

.container div {
  border: 2px dashed #ddd;
  height: 100%;
  left: 0;
  position: absolute;
  top: 0;
  width: 100%;
}
複製程式碼

使用 20% 使得盒子的高度等於其寬度的 20%。無論視口的寬度是多少,子 div 會保持 5:1 (100% / 20%) 的比例。

為載入失敗的圖片新增樣式

使用一丁點的 CSS 讓載入失敗的圖片更美觀一點。

img {
  display: block;
  font-family: Helvetica, Arial, sans-serif;
  font-weight: 300;
  height: auto;
  line-height: 2;
  position: relative;
  text-align: center;
  width: 100%;
}
複製程式碼

然後,新增偽元素規則來展示使用者資訊和載入失敗的圖片的 url。

img::before {
  content: "We're sorry, the image below is broken :(";
  display: block;
  margin-bottom: 10px;
}

img::after {
  content: "(url: " attr(src) ")";
  display: block;
  font-size: 12px;
}
複製程式碼

Ire Aderinokun原文中瞭解更多。

全域性大小使用 rem,區域性大小使用 em

在根節點(html { font-size: 100% })設定了基本的 font-size 後,使用 em 為其他文字元素設定 font-size

h2 {
  font-size: 2em;
}
p {
  font-size: 1em;
}
複製程式碼

然後使用 rem 為模組設定 font-size

article {
  font-size: 1.25rem;
}

aside .module {
  font-size: .9rem;
}
複製程式碼

現在,每個模組都變得條塊分明,更容易書寫樣式,更易維護,更靈活。

隱藏非靜音的、自動播放的 video

這是個使用者自定義樣式的小技巧。避免了當頁面載入時,自動播放有聲音的 video 來干擾使用者。如果是非靜音的,就不顯示 video:

video[autoplay]:not([muted]) {
  display: none;
}
複製程式碼

再嘮叨一次,我們很好地利用了 :not() 這個偽類。

為靈活的型別使用 :root

在響應式設計中,型別的 font-size 應該隨視口大小進行調整。你可以使用 :root 並根據視口高度和寬度計算型別的 font-size

:root {
  font-size: calc(1vw + 1vh + .5vmin);
}
複製程式碼

之後,你可以根據 :root 計算出來的值使用 rootem 單元。

body {
  font: 1rem/1.6 sans-serif;
}
複製程式碼

Demo

為了更好的移動端體驗,為表單元素使用 font-size

當點選 <select> 下拉框時,為了避免移動瀏覽器在表單元素上進行的縮放,為表單選擇器定義 font-size 規則:

input[type="text"],
input[type="number"],
select,
textarea {
  font-size: 16px;
}
複製程式碼

使用指標事件來控制滑鼠事件

當點選一個元素時,Pointer events 允許自定義滑鼠的行為。舉個例子,為了 disabled 掉一個 button 的 Pointer events:

.button-disabled {
  opacity: .5;
  pointer-events: none;
}
複製程式碼

這很簡單

相關文章