CSS 技巧:使你的 CSS 更加專業

bbtvking 7年前發布 | 11K 次閱讀 CSS 前端技術

CSS 專業的技巧

提示的收集,以幫助提升你的CSS技巧。

目錄

專業的技巧

  1. 使用 :not() 選擇器來決定表單是否顯示邊框
  2. 使用負的 nth-child 來選擇元素
  3. 使用 “形似貓頭鷹” 的選擇器
  4. 使用 max-height 來建立純 CSS 的滑塊
  5. 利用 Flexbox 去除多余的外邊距
  6. 利用屬性選擇器來選擇空鏈接
  7. 給 “預設” 鏈接定義樣式
  8. 用 rem 來調整全局大小;用 em 來調整局部大小
  9. 隱藏沒有靜音、自動播放的影片
  10. 使用選擇器 :root 來控制字體彈性
  11. 將 font-size 關于表單元素為更好的移動體驗

使用CSS復位

CSS重置幫助實施用干凈的石板為造型元素在不同的瀏覽器風格的一致性。您可以使用CSS復位庫像 Normalize 等,也可以使用一個更簡化的復位方法:

* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

現在的元素將被剝離利潤率和填充和 box-sizing ,您可以管理與CSS盒模型布局。

演示

注意:如果按照尖下面你可能會選擇不包含在你的CSS復位 box-sizing 財產。

繼承 box-sizing

從 html 元素繼承 box-sizing 就好:

html {
  box-sizing: border-box;
}

, :before, :after { box-sizing: inherit; }</code></pre>

如此在插件或其它組件里改變 box-sizing 變得簡單。

使用 :not() 選擇器來決定表單是否顯示邊框

與其加上邊框……

/ 添加邊框 /
.nav li {
  border-right: 1px solid #666;
}</code></pre> 
  

……然后去掉最后一個元素的邊框……

/ 去掉邊框 /
.nav li:last-child {
  border-right: none;
}</code></pre> 
  

……不如使用 :not() 偽類來達成同樣的效果:

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

當然,也可以使用 .nav li + li 或者 .nav li:first-child ~ li 來達成,但是 :not() 選擇器的方式更清晰明了,一目了然。

演示

為 body 元素添加行高

不必為每一個 <p> , <h> ,等元素逐一添加 line-height ,為 body 元素添加就好了:</p>

body {
  line-height: 1.5;
}

文本元素可以很自然地繼承 body 的樣式。

演示

垂直居中任何元素

這不是黑魔法,真的可以垂直居中任何元素:

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

body { -webkit-align-items: center;
-ms-flex-align: center;
align-items: center; display: -webkit-flex; display: flex; }</code></pre>

這還不夠?垂直方向,水平方向……任何元素,任何時間,任何地方?CSS-Tricks 有篇好文 講到了各種居中的技巧。

注意:IE11 對 flexbox 的支持 有點 bug 。

演示

逗號分隔的列表

列表的每項都由逗號分隔:

ul > li:not(:last-child)::after {
  content: ",";
}

使用了 :not() 偽類,因此最后一項沒加逗號。

注意:這一技巧對于無障礙,屏幕閱讀器而言并不理想,需要注意。

使用負的 nth-child 來選擇元素

使用負的 nth-child 可以選擇 1 至 n 個元素。

li {
  display: none;
}

/ 選擇第 1 至第 3 個元素并顯示出來 / li:nth-child(-n+3) { display: block; }</code></pre>

或許你已經掌握了,試下這個:

/* 選擇第 1 至第 3 個元素并顯示出來 */
li:not(:nth-child(-n+3)) {
  display: none;
}

就是這么簡單。

演示

使用 SVG 圖標

沒有理由不使用 SVG 圖標:

.logo {
  background: url("logo.svg");
}

SVG 在所有分辨率下都可以良好縮放,IE9+ 及其它所有瀏覽器都支持,丟掉你的 .png, .jpg, 或 .gif-jif-whatev 文件吧。

注意:針對僅有圖標的按鈕,如果 SVG 沒有加載成功的話,以下樣式對無障礙有所幫助:

.no-svg .icon-only:after {
  content: attr(aria-label);
}

使用 “形似貓頭鷹” 的選擇器

這個名字可能比較陌生,不過全局選擇器 ( * ) 和 相鄰兄弟選擇器 ( + ) 一起使用,效果非凡:

* + * {
  margin-top: 1.5em;
}

在此示例中,遵循其他元素的文檔流中的所有元素將都接收上邊距 margin-top: 1.5em 的樣式。

更多 “形似貓頭鷹” 的選擇器,可參考 A List Apart 上面 Heydon Pickering 的文章

演示

使用 max-height 來建立純 CSS 的滑塊

max-height 與 overflow hidden 一起來建立純 CSS 的滑塊:

.slider {
  max-height: 200px;
  overflow-y: hidden;
  width: 300px;
}

.slider:hover { max-height: 600px; overflow-y: scroll; }</code></pre>

移入滑塊元素時增大它的 max-height 的值,便可以顯示溢出部分。

創造格子等寬的表格

table-layout: fixed 可以讓每個格子保持等寬:

.calendar {
  table-layout: fixed;
}

無痛的 table 布局。

演示

利用 Flexbox 去除多余的外邊距

與其使用 nth- , first- , 和 last-child 去除列之間多余的間隙,不如使用 flexbox 的 space-between 屬性:

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

.list .person { flex-basis: 23%; }</code></pre>

列之間的間隙相等,并且首尾沒有多余的間隙。

利用屬性選擇器來選擇空鏈接

當 <a> 元素沒有文本內容,但是有 href 屬性的時候,可以顯示它的 href 鏈接:

a[href^="http"]:empty::before {
  content: attr(href);
}

相當簡便。

演示

給 “預設” 鏈接定義樣式

給 “預設” 鏈接定義樣式:

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%; }</code></pre>

使用20%的填充使得框等于其寬度的20%的高度。不管視口的寬度,子元素的div將保持其寬高比(100%/ 20%= 5:1)。

演示

為破碎圖象定義樣式

只要一點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; }</code></pre>

了解更多關于這類樣式的技巧 Ire Aderinokun 的 原帖 .

用 rem 來調整全局大小;用 em 來調整局部大小

在根設置基本字體大小后 ( html { font-size: 100%; } ), 請設置為文本元素的字體大小 em :

h2 { 
  font-size: 2em;
}

p { font-size: 1em; }</code></pre>

然后設置字體大小的模塊 rem :

article {
  font-size: 1.25rem;
}

aside .module { font-size: .9rem; }</code></pre>

現在,每個模塊變得條塊分割,更容易、靈活的樣式,以便于維護。

隱藏沒有靜音、自動播放的影片

這是一個自定義的使用者樣式表一個偉大的把戲。避免在加載頁面時自動播放。如果沒有靜音,則不顯示視頻:

video[autoplay]:not([muted]) {
  display: none;
}

再次,我們趁著使用的偽類。

使用選擇器 :root 來控制字體彈性

在響應式布局的類型字體大小應能與每個視區進行調整。你可以計算的基礎上視區高度的字體大小和寬度,使用 :root :

:root {
  font-size: calc(1vw + 1vh + .5vmin);
}

現在,您可以利用基于計算的值 root em 單位: root :

body {
  font: 1rem/1.6 sans-serif;
}

演示

將 font-size 關于表單元素為更好的移動體驗

為了避免在HTML表單元素縮放移動瀏覽器(Safari瀏覽器的iOS, et AL 。)當一個 <選擇> 下拉被竊聽,加上 字體size 的選擇規則:

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

:dancer:

支持情況

這些技巧適用于最新版的 Chrome, Firefox, Safari, Opera, Edge, 以及 IE11。

 

 本文由用戶 bbtvking 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!