之前在知乎看到一個很有意思的討論 一行程式碼可以做什麼?
那麼,一行 CSS 程式碼又能不能搞點事情呢?
CSS Battle
首先,這讓我想到了,年初的時候沉迷的一個網站 CSS Battle 。這個網站是核心玩法就是:
官方給出一張圖形,在給定的 400 x 300 的畫布上,能夠用越短的程式碼實現它,分數就越高。
注意是,完全一模一樣還原。
其中,第一題就非常有趣,看看題目:
嗯,想一想,如果給定這樣一張圖形,告訴你 HTML 的大小是 400px
x 300px
,圖片中使用到的顏色是 #5D3A3A, #B5E0BA
,你會怎麼用 CSS 去實現它呢?
因為要求,字元數越少,分數越高,當然是選字元少的標籤,是不是這樣:
<p> <style> body{background:#5D3A3A;} p {width: 200px;height:200px;background:#B5E0BA;} </style>
這個網站的設定,HTML 和 CSS 可以按照上述格式寫在一起,
<style>
標籤內的即為 CSS,之外的是 HTML ,標籤<p></p>
可以簡寫為<p>
額,這樣當然可以,但是看看文章的標題,一行 CSS ?這明顯不是啊,並且這裡有 100+ 個字元。我們得把字元數壓一壓。
嗯嗯嗯,想到了陰影,嘗試下使用 box-shadow
:
<a> <style> a { box-shadow:0 0 0 200px #b5e0ba,0 0 0 400px #5d3a3a; } </style>
利用兩層陰影,完美實現圖例圖形,並且,字元數壓縮到了 82 個。當然,這還不是極致,我們完全可以內聯 CSS,再減少字元數:
<a style="box-shadow:0 0 0 200px #b5e0ba,0 0 0 400px #5d3a3a">
只有 62 個字元。當然,從一行程式碼的角度,這個問題完美的解決了,如果追求極致的字元數,上述的程式碼還可以再簡化一下:
<a style=box-shadow:0+0+0+200px#b5e0ba,0+0+0+5in#5d3a3a>
這裡有一些小知識點,HTML5 支援屬性後面不用引號包住,又譬如
box-shadow: 0 0 0 400px #5d3a3a
是可以壓縮到box-shadow:0+0+0+5in#5d3a3a
,CSS 中1in=96px
,但是畫布只有 400px,5in 大於 400px,也沒有問題,能夠充滿畫布,但是400px
相對5in
字元多了 2 個。
瀏覽器裡面看一下,這個是完全正確的寫法:
OK,最終只有 56 個字元,完美。當然,CSS Battle 裡面還有更多更復雜的挑戰,也有很多能夠通過一行程式碼實現的,感興趣的嘗試下。
一行背景程式碼
要說到 CSS 最有意思的屬性,我覺得背景(background)肯定能夠獲得很多選票。背景分為:
- 純色
- 線性漸變(
linear-gradient
) - 徑向漸變(
radial-gradient
) - 角向漸變(
conic-gradient
) - 多重線性漸變(
repeating-linear-gradient
) - 多重徑向漸變(
repeating-radial-gradient
) - 多重角向漸變(
repeating-conic-gradient
)
突出一個字,離譜。並且它們還可以互相混合、疊加新增濾鏡、配合各種背景相關屬性等等等。
不過今天,來看看一行 CSS Background 程式碼能玩出什麼花來。嗯?這裡的主角是多重角向漸變(repeating-conic-gradient
),只用一行 CSS 程式碼:
{ background: repeating-conic-gradient(#fff, #000, #fff 0.1deg); }
這什麼玩意?腦補一下,這行程式碼繪製出來的圖形會是什麼樣子?看看:
Wow,不可思議。這裡 0.1deg
非常關鍵,這裡的角度越小(小於 1deg 為佳),圖形越酷炫。
我們把 0.1deg
替換成 30deg
看看:
當然也非常好看,只不過沒有上面那個那麼驚豔。
CodePen -- One Line CSS Pattern
我們可以再利用 CSS - Doodle,隨機產生這份美:
CSS - Doodle 它是一個基於 Web-Component 的庫。允許我們快速的建立基於 CSS Grid 佈局的頁面,並且提供各種便捷的指令及函式(隨機、迴圈等等),讓我們能通過一套規則,得到不同 CSS 效果。
沒錯,它的本質其實就是上述的那一行核心 CSS 程式碼。
CSS Doodle - CSS Magic Conic-gradient
margin: auto
與 place-items: center
這個也非常有意思,當然,它不算嚴格意義上的一行 CSS,因為需要搭配其他屬性一起使用。
最快水平垂直居中一個元素的方法是什麼?
水平垂直居中也算是 CSS 領域最為常見的一個問題了,不同場景下的方法也各不相同,各有優劣。嗯,下面這兩種方法應該算是最便捷的了:
方法一:flex
佈局下的 margin: auto
<div class="g-container"> <div class="g-box"></div> </div>
.g-container { display: flex; } .g-box { margin: auto; }
上面的
display: flex
替換成display: inline-flex | grid | inline-grid
也是可以的。
在 display: flex
佈局下, margin auto
的生效不僅是水平方向,垂直方向也會自動去分配這個剩餘空間。
CodePen Demo -- 使用 margin auto 水平垂直居中元素
如果你對非常有用的 margin: auto
還不是很瞭解,可以看看:探祕 flex 上下文中神奇的自動 margin
方法二:grid
佈局下的 place-items: center
直接上程式碼:
.g-container { display: grid; place-items: center }
上述兩個份程式碼效果都是一樣的:
CodePen Demo -- 水平垂直居中元素 grid+ place-items: center
最後
一行 CSS 能幹什麼?肯定不止這些,當然,這不就是 CSS 的樂趣麼。
好了,本文到此結束,希望對你有幫助 :)
更多精彩 CSS 技術文章彙總在我的 Github -- iCSS ,持續更新,歡迎點個 star 訂閱收藏。
如果還有什麼疑問或者建議,可以多多交流,原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。