上一篇 一些有趣的 CSS 魔法和佈局(上) 中,咱們聊了一些有趣且實用的佈局。今天,將呈現一些 CSS 帶來的魔法特效,有部分特效能夠幫咱們省去很多工做量。前端
在之前遇到這個需求的時候,咱們可能會想到用 JS 來操做內容的顯式與否。如今,CSS3 的 transition
能夠幫咱們更簡單地實現。chrome
<ul> <li style="padding-bottom: 20px;"> <div class="head"> 列表1 </div> <div class="body"> 列表內容<br> 內容列表內容<br> 內容列表內容<br> 內容 </div> </li> <li> <div class="head"> 列表2 </div> <div class="body"> 列表內容<br> 內容列表內容<br> 內容列表內容<br> 內容 </div> </li> </ul>
.body { max-height: 0; overflow: hidden; transition: all 1s ease-out; } li:hover .body { max-height: 300px; transition-timing-function: ease-in; }
transition: all 1s ease-out;
這是一種簡寫,transition 有 4 個過渡屬性:transition-property
、transition-duration
、transition-timing-function
、transition-delay
。transition-timing-function
規定了速度效果的速度曲線,它有如下幾種約定的屬性。element-ui
transition-timing-function: linear|ease|ease-in|ease-out|ease-in-out|cubic-bezier(n,n,n,n);
有一些特殊的時段,好比須要降半旗,在大環境下,各大網站爲了表示默哀,會把顏色鮮豔的圖片變灰變暗,過了這段時間後再恢復本來的顏色。segmentfault
過去,會讓 UI 同窗臨時趕工改圖,而後再上傳更新,過程麻煩,還會形成存儲空間的浪費。如今,CSS3 的 filter
(濾鏡) 屬性能夠更快地實現該需求。UI 同窗改的,其實也是源圖片的濾鏡。因此,能夠這樣實現:微信
.header { background: no-repeat center center; background-color: #ccc; background-attachment: scroll; background-size: cover; margin-bottom: 0; background-image: url(xxx.jpg); filter: grayscale(100%); }
未加 filter 的效果以下:前端工程師
加了 filter 的效果:佈局
filter 的屬性還有不少,其中 blur
能夠實現高斯模糊,相似 IOS7 的毛玻璃效果。contrast
能夠調整圖片的對比度。drop-shadow
會在圖片的下方合成陰影效果,等等。學習
以前遇到過一個需求,註冊登陸界面的總體色調偏藍色,連輸入框的邊框色都偏藍。因此,產品但願輸入框的顏色和光標都變爲藍色。網站
設置文本的顏色方便,但光標該怎麼設置顏色?CSS3 的 caret-color
能夠解決這個問題。ui
input, textarea { caret-color: blue; }
它不只對於原生的輸入控件有效,對設置 contenteditable 的普通 HTML 標籤也適用。
不過兼容性上,safari 的 PC 版從 V11.1 開始支持,wap 版從 V11.4 也開始支持了。固然 IE 目前尚未支持。
在之前,若是不想讓別人選中你的頁面裏的內容,能夠用 JS 來阻止鼠標事件。而如今,只須要一句 user-select:none;
的樣式就能夠搞定了。
body { user-select: none; // 頁面中的文本不能被選中 }
除了 IE,兼容性都不錯。在 IE 6-9 上,能夠經過給 body 添加 JS 代碼 onselectstart="return false;"
來解決。
反過來,對於沒法被選中文本的頁面,若是真想複製,也是有技巧的。方法很簡單:打開 chrome 的 debug 模式,在 console 下輸入 document.body.innerText
,回車後就能愉快地複製了,嘿嘿~
手寫原生 table 的時候,直接給單元格設置寬度並沒什麼做用,由於單元格的寬度是根據其內容進行調整的。可是,在使用 element-ui 的 el-table 組件時,卻能夠給每一個單元格設置寬度。這是如何作到的呢?
打開 debug,看 table 的結構,會發如今 CSS 上有個屬性:table-layout: fixed;
。
table-layout 的默認值是 auto,當設置爲 fixed 時,在 單元格 td 上設置的寬度就起做用了。用法很簡單:
table { table-layout: fixed; width: 100%; }
某個商城上曾看到過的,鼠標 hover 出現一道流光劃過的效果。用到了 CSS3 的 transform、linear-gradient、transition 等特性。
<div class="img-light"> <img src="xxx.jpg" width="640" height="384"> </div>
.img-light { position: relative; width: 640px; height: 384px; } .img-light::after { content: ""; height: 100%; width: 100px; transform: skewX(-25deg) translateZ(0); background-image: linear-gradient(90deg, hsla(0, 0%, 100%, 0), hsla(0, 0%, 100%, 0.3) 50%, hsla(0, 0%, 100%, 0)); position: absolute; left: -150%; top: 0; z-index: 2; } .img-light:hover::after { transition: left 2s ease-in-out; left: 150%; }
遇到過一種狀況,點擊當前層無需觸發本身的事件,但能夠觸發下面那層的事件,我把這種狀況理解爲「透傳」。也就是,點擊自身並沒有反應,至關於直接點擊在了下面那層上。
用 CSS3 的 pointer-events
實現很簡單:
div { pointer-events: none; }
設置爲 none,在 MDN 上的解釋是:元素永遠不會成爲鼠標事件的 target。可是,當其後代元素的 pointer-events 屬性指定其餘值時,鼠標事件能夠指向後代元素,在這種狀況下,鼠標事件將在捕獲或冒泡階段觸發父元素的事件偵聽器。
在某個博客中看到的美化 radio 和 checkbox 的寫法。
.radio-beauty-container { font-size: 0; $bgc: green; %common { padding: 2px; background-color: $bgc; background-clip: content-box; } .radio-name { vertical-align: middle; font-size: 16px; } .radio-beauty { width: 18px; height: 18px; box-sizing: border-box; display: inline-block; border: 1px solid $bgc; vertical-align: middle; margin: 0 15px 0 3px; border-radius: 50%; &:hover { box-shadow: 0 0 7px $bgc; @extend %common; } } input[type="radio"]:checked+.radio-beauty { @extend %common; } }
其原理是:
CSS3 有許多很讚的特性,能夠呈現很是神奇且炫酷的效果。在這兒僅展現了一些我搜羅到的,以爲有意思的特效。你們若是有值得推薦的 CSS 特效,也歡迎一塊兒探討學習哈~
莉莉絲遊戲招 中高級前端工程師
啦!!!
你玩過《小冰冰傳奇([刀塔傳奇])》麼?你玩過《劍與家園》麼?
你想和 薛兆豐老師 成爲同事麼?有興趣的同窗,能夠 關注下面的公衆 號加我微信 詳聊哈~