CSS 專家提示

最簡單的 CSS Reset

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

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

如今,全部的元素都除掉了瀏覽器默認的 marginpaddingbox-sizing 讓你能夠使用 CSS 盒模型管理佈局。html

Demo

若是遵循下面的 繼承 box-sizing, 你能夠選擇不在 CSS Reset 中包含 box-sizinggit

繼承 box-sizing

讓全部元素 box-sizing 繼承自 htmlgithub

html {
  box-sizing: border-box;
}

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

這種方式更容易在一些插件中或其餘組件中改變 box-sizing 的值。web

重置元素的全部屬性,使用 unset

當重置一個元素的全部屬性,並不須要重置它的每一個屬性。瀏覽器

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

你使用簡寫的 all 來指定全部的元素屬性,其值爲 unset 將元素的屬性重置爲最初值。app

button {
  all: unset;
}
複製代碼

兼容性提示:allIE11 內不支持,目前是否在 Edge 中支持也不肯定。ide

使用 :not() 應用於導航

爲了知足導航類樣式的設計,一般的作法是:svg

/* 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;
}
複製代碼

這很簡單

相關文章
相關標籤/搜索