## 一、粘滯定位
  粘滯定位(sticky)與相對定位類似,既不會脫離正常流,也不會改變元素盒類型,并且會保留原先所占的空間。它會相對于包含塊偏移,它的包含塊分為兩種,第一種和絕對定位一樣;第二種是最近的滾動祖先,即overflow屬性是hidden、scroll、auto或overlay時。接下來用一個例子來介紹粘滯定位的用法,如下代碼所示。
~~~html
<style>
div {
overflow: auto;
}
span {
position: sticky;
top: 10px;
left: 20px;
width: 70px;
height: 50px;
background: #CCC;
}
</style>
<div>
改變粘滯定位的位置,改變
<span>粘滯定位的位置</span>
,改變粘滯定位的位置,改變粘滯定位的位置,
改變粘滯定位的位置,改變粘滯定位的位置,
改變粘滯定位的位置。
</div>
~~~
  span元素的包含塊是div元素,下圖描繪了頁面滾動時,粘滯定位的效果。在中間圖中可以看到偏移后的span元素所占的空間被保留了,在右邊圖中可以看到span元素粘滯在指定的偏移位置。
:-: 
## 二、邊框圖像
  CSS3新增了一組屬性,允許在邊框中加載圖像,接下來會逐個講解。
  第一個是border-image-source屬性,它能指定圖像來源,如下所示。在下圖中,會發現加載的圖像位于div元素的四個角,而不是沿著邊框繪制。
~~~css
div {
border: 40px solid;
border-image-source: url(./star.png);
}
~~~
:-: 
  注意,邊框寬度需要指定,并且其外觀不能是none,否則將無法顯示。
  第二個是border-image-slice屬性,它包含四條裁剪線,可接收四個偏移值,分別距圖像的上右下左四個邊,下圖演示了偏移33%時的裁剪線。
:-: 
  執行下面的樣式(效果如下圖所示),在將circle.png分解成9塊后,編號為1、2、3、4的四個圓位于div元素的四個角,而編號為5、6、7、8的四個圓則會被拉伸。
~~~css
div {
border-image-source: url(./circle.png);
border-image-slice: 33%;
}
~~~
:-: 
  border-image-slice屬性還能接收一個fill關鍵字(如下圖所示),可將編號為9的圓作為div元素的背景圖。
~~~css
div {
border-image-slice: 33% fill;
}
~~~
:-: 
  第三個是border-image-repeat屬性,它能指定填充邊框的方式,默認是拉伸,現在改成平鋪(如下圖所示),邊界處的圖像可能會被裁剪。
~~~css
div {
border-image-repeat: repeat;
}
~~~
:-: 
  第四個是border-image-width屬性,與border-image-slice屬性類似,也有4條裁剪線,只是它裁剪的對象是邊框。在下圖中,左邊是未定義border-image-width屬性的div元素,右邊是將該屬性設為20px后的效果。
~~~css
div {
border-image-width: 20px;
}
~~~
:-: 
  第五個是border-image-outset屬性,可聲明圖像超出邊框的距離,即向外偏移。在下圖中,左邊是未定義border-image-outset屬性的div元素,右邊是將該屬性設為10px后的效果。
~~~css
div {
border-image-outset: 10px;
}
~~~
:-: 
  第六個是border-image屬性,可將上述5個屬性整合到一起,規定不同的值之間用斜杠(/)分隔,并且還指定了順序:首先是border-image-slice,然后是border-image-width,最后是border-image-outset。而border-image-source和border-image-repeat兩個屬性可放在任意位置,但要注意,不能放置在其它屬性值之中。下面是個整合示例,效果如下圖所示。
~~~css
div {
border-image: url(./circle.png) 33% / 20px / 10px repeat;
}
~~~
:-: 
## 三、字符間距
  letter-spacing屬性可定義字符之間的距離,可以突出某段文本,例如為p元素定義10px的字符間距,如下圖所示。?
~~~html
<style>
p {
letter-spacing: 10px;
}
</style>
<p>字符間距是10px</p>
~~~
:-: 
## 四、文本陰影
  text-shadow屬性可為文本添加陰影,適用于標題或短文本。陰影值由四部分組成,分別是顏色、橫向偏移、縱向偏移和模糊半徑。下面的示例為一段文本添加了灰色的陰影,效果如下圖所示。
~~~html
<style>
p {
text-shadow: #CCC 5px 10px 2px;
}
</style>
<p>My name is Strick.</p>
~~~
:-: 
  注意,模糊半徑越大,陰影就越模糊。妥善利用好text-shadow屬性,還能創造出3D效果,下面的樣式來源于網絡,字體放大后,3D更明顯,效果如下圖所示。
~~~css
p {
font-size: 48px;
text-shadow: 0 1px 1px #BBB,
0 2px 0 #999,
0 3px 0 #888,
0 4px 0 #777,
0 5px 0 #666,
0 6px 0 #555,
0 7px 0 #444,
0 8px 0 #333,
0 9px 7px #302314;
}
~~~
:-: 
## 五、多重背景
  CSS3支持多重背景,大部分背景屬性都能通過逗號分隔多個值,包括簡寫的background屬性也能接受多個值。在下面的示例中,為div元素聲明了兩個背景,先聲明的star.png將會在lake.png之上,如下圖所示。
~~~css
div {
background-image: url(./star.png), url(./lake.png);
background-position: left bottom, center;
background-repeat: repeat-x, no-repeat;
}
/* 等價于 */
div {
background: url(./star.png) left bottom repeat-x,
url(./lake.png) center no-repeat;
}
~~~
:-: 
  注意,不能為background-color指定多個值。當用background屬性聲明多個背景時,顏色只能出現在最后一個背景層中,如下代碼所示。
~~~css
/* 錯誤 */
div {
background: #FC0 url(./star.png) left bottom repeat-x,
url(./lake.png) center no-repeat;
}
/* 正確 */
div {
background: url(./star.png) left bottom repeat-x,
#FC0 url(./lake.png) center no-repeat;
}
~~~
## 六、矩陣函數
  在CSS中,矩陣函數是變形的基礎,位移、縮放、傾斜和旋轉四種變形都能用矩陣來實現,例如用矩陣函數來描述水平偏移10px,垂直偏移5px,代碼如下所示。
~~~css
.matrix {
transform: matrix(1, 0, 0, 1, 10, 5);
/* 等同于 */
transform: translate(10px, 5px);
}
~~~
  現在將矩陣函數的6個參數用小寫字母來命名,如下所示。
~~~css
transform: matrix(a, b, c, d, e, f);
~~~
  對應的矩陣如下所示,注意觀察6個參數的位置。
:-: 
  矩陣函數的原理是通過變更元素的所有坐標,重新定位元素,從而實現各種變形。下面是矩陣的計算公式,其中x和y是元素的橫坐標和縱坐標。
:-: 
  ax+cy+e是變形后的橫坐標,bx+dy+f是變形后的縱坐標。具體的計算過程如下所示,以矩陣的第一行為例,相同底色的變量會相乘,得到的積再相加。
:-: 
  在下圖中,列出了與四類變形函數等效的矩陣符號(引用自《[The CSS3 matrix() Transform for the Mathematically Challenged](https://www.useragentman.com/blog/2011/01/07/css3-matrix-transform-for-the-mathematically-challenged/)》一文),其中旋轉和傾斜還用到了三角函數。
:-: 
  在三維空間,也有一個對應的矩陣函數:matrix3d(),此處不再展開敘述,可以查看網上的相關資料。
## 七、三維變形
  在三維空間中有三個軸,如下圖所示,其中Z軸表示用戶與平面的距離(即透視值)。
:-: 
  perspective()是一個透視函數,它能接收一個非零正數透視值。在下面的示例中,會讓四個元素圍繞Y軸旋轉30°,除了第一個元素,其它都調用了透視函數。通過下圖的效果可知,當透視值越小時,變形效果越失真。
~~~css
.rotate {
transform: rotateY(30deg);
}
.perspective-200 {
transform: perspective(200px) rotateY(30deg);
}
.perspective-600 {
transform: perspective(600px) rotateY(30deg);
}
.perspective-1200 {
transform: perspective(1200px) rotateY(30deg);
}
~~~
:-: 
  注意,透視函數需要聲明在變形函數列表的首位,以免在透視前變形,呈現錯誤的效果。
  除了perspective()函數之外,CSS3還提供了一個perspective屬性。前者只能為目標元素聲明透視,而后者聲明的透視能應用于其子元素。舉個簡單的例子,為父元素section聲明perspective屬性,子元素仍舊圍繞Y軸旋轉30°,代碼如下所示,得到的效果如下圖所示。
~~~html
<style>
.perspective {
perspective: 200px;
}
.perspective > div {
transform: rotateY(30deg);
}
</style>
<section class="perspective">
<div>200px</div>
<div>200px</div>
</section>
~~~
:-: 
  perspective-origin屬性可修改透視原點,也叫消失點,其取值與transform-origin類似。默認情況下,這個點位于元素的中心,接下來修改上例父元素的透視原點,樣式如下,效果如下圖所示。
~~~css
.perspective {
perspective-origin: top left;
}
~~~
:-: 
  backface-visibility屬性可控制元素背面朝向用戶時是否渲染,利用該屬性可設計出3D翻轉的特效。接下來會一步步的實現該功能,首先是創建HTML結構,如下所示,section是兩個div的父元素。
~~~html
<section class="flip">
<div class="positive">正面</div>
<div class="reverse">反面</div>
</section>
~~~
  然后在父元素中添加過渡時間和透視,并將transform-style屬性設為preserve-3d,這樣才能讓子元素和父元素處于同一個三維空間,樣式如下。
~~~css
.flip {
position: relative;
width: 100px;
height: 100px;
transition: 0.6s;
transform-style: preserve-3d;
perspective: 1000px;
}
~~~
  再將兩個子元素的backface-visibility屬性設為hidden,并且將第二個div元素圍繞Y軸旋轉180°,樣式如下。
~~~css
.flip > div {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
backface-visibility: hidden;
}
.flip .positive {
background: #FC0;
}
.flip .reverse {
background: #F60;
transform: rotateY(180deg);
}
~~~
  最后為父元素定義:hover偽類,也就是在鼠標懸停時,自身也圍繞Y軸旋轉180°,隱藏第一個div元素,顯示第二個div元素,樣式如下。
~~~css
.flip:hover {
transform: rotateY(180deg);
}
~~~
  由于是動態的效果,因此需要用多張圖來描繪翻轉的過程,如下圖所示。
:-: 
*****
> 原文出處:
[博客園-CSS躬行記](https://www.cnblogs.com/strick/category/1667864.html)
[知乎專欄-CSS躬行記](https://zhuanlan.zhihu.com/pwcss)
已建立一個微信前端交流群,如要進群,請先加微信號freedom20180706或掃描下面的二維碼,請求中需注明“看云加群”,在通過請求后就會把你拉進來。還搜集整理了一套[面試資料](https://github.com/pwstrick/daily),歡迎瀏覽。

推薦一款前端監控腳本:[shin-monitor](https://github.com/pwstrick/shin-monitor),不僅能監控前端的錯誤、通信、打印等行為,還能計算各類性能參數,包括 FMP、LCP、FP 等。
- ES6
- 1、let和const
- 2、擴展運算符和剩余參數
- 3、解構
- 4、模板字面量
- 5、對象字面量的擴展
- 6、Symbol
- 7、代碼模塊化
- 8、數字
- 9、字符串
- 10、正則表達式
- 11、對象
- 12、數組
- 13、類型化數組
- 14、函數
- 15、箭頭函數和尾調用優化
- 16、Set
- 17、Map
- 18、迭代器
- 19、生成器
- 20、類
- 21、類的繼承
- 22、Promise
- 23、Promise的靜態方法和應用
- 24、代理和反射
- HTML
- 1、SVG
- 2、WebRTC基礎實踐
- 3、WebRTC視頻通話
- 4、Web音視頻基礎
- CSS進階
- 1、CSS基礎拾遺
- 2、偽類和偽元素
- 3、CSS屬性拾遺
- 4、浮動形狀
- 5、漸變
- 6、濾鏡
- 7、合成
- 8、裁剪和遮罩
- 9、網格布局
- 10、CSS方法論
- 11、管理后臺響應式改造
- React
- 1、函數式編程
- 2、JSX
- 3、組件
- 4、生命周期
- 5、React和DOM
- 6、事件
- 7、表單
- 8、樣式
- 9、組件通信
- 10、高階組件
- 11、Redux基礎
- 12、Redux中間件
- 13、React Router
- 14、測試框架
- 15、React Hooks
- 16、React源碼分析
- 利器
- 1、npm
- 2、Babel
- 3、webpack基礎
- 4、webpack進階
- 5、Git
- 6、Fiddler
- 7、自制腳手架
- 8、VSCode插件研發
- 9、WebView中的頁面調試方法
- Vue.js
- 1、數據綁定
- 2、指令
- 3、樣式和表單
- 4、組件
- 5、組件通信
- 6、內容分發
- 7、渲染函數和JSX
- 8、Vue Router
- 9、Vuex
- TypeScript
- 1、數據類型
- 2、接口
- 3、類
- 4、泛型
- 5、類型兼容性
- 6、高級類型
- 7、命名空間
- 8、裝飾器
- Node.js
- 1、Buffer、流和EventEmitter
- 2、文件系統和網絡
- 3、命令行工具
- 4、自建前端監控系統
- 5、定時任務的調試
- 6、自制短鏈系統
- 7、定時任務的進化史
- 8、通用接口
- 9、微前端實踐
- 10、接口日志查詢
- 11、E2E測試
- 12、BFF
- 13、MySQL歸檔
- 14、壓力測試
- 15、活動規則引擎
- 16、活動配置化
- 17、UmiJS版本升級
- 18、半吊子的可視化搭建系統
- 19、KOA源碼分析(上)
- 20、KOA源碼分析(下)
- 21、花10分鐘入門Node.js
- 22、Node環境升級日志
- 23、Worker threads
- 24、低代碼
- 25、Web自動化測試
- 26、接口攔截和頁面回放實驗
- 27、接口管理
- 28、Cypress自動化測試實踐
- 29、基于Electron的開播助手
- Node.js精進
- 1、模塊化
- 2、異步編程
- 3、流
- 4、事件觸發器
- 5、HTTP
- 6、文件
- 7、日志
- 8、錯誤處理
- 9、性能監控(上)
- 10、性能監控(下)
- 11、Socket.IO
- 12、ElasticSearch
- 監控系統
- 1、SDK
- 2、存儲和分析
- 3、性能監控
- 4、內存泄漏
- 5、小程序
- 6、較長的白屏時間
- 7、頁面奔潰
- 8、shin-monitor源碼分析
- 前端性能精進
- 1、優化方法論之測量
- 2、優化方法論之分析
- 3、瀏覽器之圖像
- 4、瀏覽器之呈現
- 5、瀏覽器之JavaScript
- 6、網絡
- 7、構建
- 前端體驗優化
- 1、概述
- 2、基建
- 3、后端
- 4、數據
- 5、后臺
- Web優化
- 1、CSS優化
- 2、JavaScript優化
- 3、圖像和網絡
- 4、用戶體驗和工具
- 5、網站優化
- 6、優化閉環實踐
- 數據結構與算法
- 1、鏈表
- 2、棧、隊列、散列表和位運算
- 3、二叉樹
- 4、二分查找
- 5、回溯算法
- 6、貪心算法
- 7、分治算法
- 8、動態規劃
- 程序員之路
- 大學
- 2011年
- 2012年
- 2013年
- 2014年
- 項目反思
- 前端基礎學習分享
- 2015年
- 再一次項目反思
- 然并卵
- PC網站CSS分享
- 2016年
- 制造自己的榫卯
- PrimusUI
- 2017年
- 工匠精神
- 2018年
- 2019年
- 前端學習之路分享
- 2020年
- 2021年
- 2022年
- 2023年
- 2024年
- 日志
- 2020