box-shadow-陰影,你真的懂嗎
theme: channing-cyan
一起養成寫作習慣!這是我參與「掘金日新計劃 · 4 月更文挑戰」的第5天,點選檢視活動詳情。
大家好,我是半夏👴,一個剛剛開始寫文的沙雕程式設計師.如果喜歡我的文章,可以關注➕ 點贊 👍 加我微信:frontendpicker,一起學習交流前端,成為更優秀的工程師~關注公眾號:搞前端的半夏,瞭解更多前端知識.點我探索新世界!
在日常的前端開發中, 我們會經常使用陰影這個效果,(當然你通常是做***管理系統的話,可能有的比較少)例如下面的一段程式碼,這段程式碼是從ant-design 官網上覆制下來的程式碼。
box-shadow: 1px 0 #0000000f,
0 1px #0000000f,
1px 1px #0000000f,
1px 0 #0000000f inset,
0 1px #0000000f inset;
作為CSS中最基礎的屬性(個人想法),大家都知道box-shadow是用來製作陰影的,但是你真的知道他是如何生成陰影的嗎?他的每個值的意義嗎?
作用
box-shadow
可以將一個陰影或者多個陰影附加到盒子上,他可以接受沒有陰影的none或者以逗號分割的陰影列表。
語法
box-shadow
接受2-4個長度值,一個可選的顏色值,一個可選的inset關鍵字,省略的長度值預設為0。
/* x偏移量 | y偏移量 | 陰影模糊半徑 | 陰影擴散半徑 | 陰影顏色 */
box-shadow:offset-x offset-y blur-radius spread-radius. color position;
box-shadow: 2px 2px 2px 1px rgba(0, 0, 0, 0.2);
請注意這裡最少需要兩個長度值,也就是offset-x 和offset-y,陰影模糊/擴散半徑可以省略,預設為零!
-
offset-x : 橫向偏移量。正值陰影偏移到容器右側)負值陰影在容器左側。
box-shadow: -5px 20px 0px 0px green, 5px 20px 0px 0px red ;
-
offset-y:豎向偏移量,正值陰影偏移到容器下方,負值陰影偏移到容器上方
-
blur-radius :取值為[0,∞],負值無效。
-
spread-radius:表示陰影的擴充套件半徑,正值表示往外擴充套件半徑,負值表示往內收縮半徑。
-
color: 顏色值,指定陰影的顏色。可以省略,省略預設值為
currentColor
.currentColor是CSS的一個關鍵字。 -
inset:內陰影。這個屬性也可以解除安裝offset-x前面。
陰影是在容器上層的
在陰影的應用過程中, 我起初並沒有意識到陰影是在容器的上層的,並且它並不會被計算成內容。
知道使用inset這個屬性,我才意識到陰影是在容器的上方的。當然這也可能是內陰影和外陰影的差別。
.boxShadow{
width: 200px;
height: 200px;
border: 1px solid #000;
box-shadow: 5px 20px 0px 0px green ;
}
但是看下面的這個例子:我們有兩個相鄰的容器,當給上面的容器新增陰影,整個陰影會覆蓋在下方
容器的上面,因為上下兩個容器是在同一層面的,所以我們可以得出來,陰影是在容器的上層的!
我們仔細觀察會發現,雖然陰影超出容器那麼多,但是容器並不會出現滾動條,這完全可以說明容器不會作為內容計算!
陰影的前世今生
.boxShadow{
width: 200px;
height: 200px;
border: 1px solid #000;
}
上面的程式碼我們定義了一個寬高均為200px的容器
陰影的大小與offset
box-shadow: 0px 0px 0px 0px green;
當我們設定偏移量均為0的時候,效果如下:
此時並沒有出現陰影,我們猜想陰影和容器的大小是一致的嗎?還是小的。
下面我們加上橫向和豎向的偏移
box-shadow: 20px 20px 0px 0px green;
此時我們可以觀察到,陰影出現的兩條邊是和容器一樣長的。所以我們確定陰影是和容器一樣大的!
當我們給陰影設定橫向和豎向偏移的時候,整體直接進行了偏移,然後瀏覽器將容器上方的那一塊給裁剪掉了!
blur-radius
我們先來看一下官方文件的解釋:
A non-zero blur radius indicates that the resulting shadow should be blurred, such as by a Gaussian filter. The exact algorithm is not defined; however the resulting shadow must approximate (with each pixel being within 5% of its expected value) the image that would be generated by applying to the shadow a Gaussian blur with a standard deviation equal to half the blur radius
也就是說,當我們給陰影加上模糊半徑的時候,這個陰影會以每條邊的的中心為開始,往線的兩邊模糊,並且這個半徑是模糊半徑一半的!
我們有20px模糊半徑:
``` -shadow: 40px 20px 20px 0px green;
```
為了直觀的展示,我們將陰影偏移到容器外面。
``` box-shadow: 300px 0px 60px 0px #0d00ff;
```
我們用跟容器一樣大的紅框標記陰影的原本尺寸,然後用肉眼找到往裡消失的邊界(可能不太準),會發現這個內外的模糊大小是一樣的。
spread-radius
在MDN上,第四個變數被稱作擴散半徑。但是我更喜歡稱之為擴散距離!
我們在沒有模糊半徑的情況下
``` box-shadow: 20px 20px 0px 10px green;
```
設定擴散半徑是10px,會發現整個陰影的四周都多了10px的距離。它其實改變的是陰影的大小。開始的時候陰影的大小和容器一樣大,設定擴散半徑之後,陰影會往四個方向增加尺寸。
此時如果設定了模糊半徑,此時陰影就會以新的的中心為起點,往線的兩邊模糊。
- 取代前端er?PyScript到底是何方神聖!
- 永別了,IE!
- 眼疾手快,真男人就來合成粽子三兄弟
- 如何編寫更高效簡潔的JS程式碼?
- 【Vue3 Express實戰-2】sequilze連線Mysql
- 【Vue3 Express實戰-1】專案環境搭建
- 解決JS數字精度丟失
- TypeScript自學課(6)-any
- TypeScript自學課(5)-使用TSC編譯TS
- TypeScript自學課(3)-JSDoc 標記型別
- TypeScript自學課(2)-型別推斷與語義檢查
- TS自學課(1)-強型別與弱型別
- Javascript 立即執行函式
- ES6 物件解構用法
- JavaScript變數作用域
- ES6中的4個字串方法
- box-shadow-陰影,你真的懂嗎
- TypeScript中的trycatch
- TypeScript中的只讀修飾符
- TypeScript配置嚴格null型別檢查strictNullChecks