手把手教你打造一個純CSS圖標(biāo)庫

來铃辖,干了這碗安利


寫這篇文章的目的其實(shí)就是為了安利一下我的圖標(biāo)庫:iconoo,所以猪叙,開門見山娇斩,star吧少年少婦們H示怼(這樣的我是不是應(yīng)該要加個github互星的團(tuán)伙了?)

iconoo

正題說完了犬第,下面說說主題锦积。

在web開發(fā)中,我們經(jīng)常要用到一些小圖標(biāo)(加減勾叉等)歉嗓。通常做法就兩種:

  1. 直接使用圖片丰介;
  2. 使用css/svg直接在瀏覽器中繪制圖標(biāo)。

方案1:由于圖標(biāo)圖片比較多鉴分,而且體積很小哮幢,為了減少請求所以很多時候我們會用雪碧圖這種技術(shù)來將圖標(biāo)拼湊在同一張圖片里面。你也能想到志珍,一堆圖標(biāo)的雪碧圖橙垢,修改維護(hù)會相當(dāng)麻煩!現(xiàn)在比較好的方案是使用webpack引入圖片碴裙,小圖直接轉(zhuǎn)換成base64插入css中钢悲。直接使用圖片比較簡單,這也是目前比較主流的做法舔株。

方案2: 相比方案1莺琳,明顯可以減小資源的體積,只需要幾條css/svg命令就可以繪制出精美的圖標(biāo)载慈,而且不受圖片尺寸限制惭等,可大可小非常靈活。初看方案2的一堆代碼可能會覺得非常難办铡,但其實(shí)很多簡單的圖標(biāo)都是非常容易實(shí)現(xiàn)的辞做。

接下來就是妹子們最期待的茄果叔叔手把手教學(xué)時間啦。

手抓手教學(xué)時間


使用CSS繪制線條寡具,用到的不外乎兩個屬性:border & box-shadow秤茅。而形狀則可以用border-radiustransform控制變形童叠,位置則會用到絕對定位框喳、transformmargin等屬性來調(diào)整厦坛。CSS的繪圖五垮,做過幾個就知道大概是怎么回事了,歸根到底杜秸,還是幾何放仗。如果覺得幾何燒腦,那就直接用 iconoo 吧~~~

基本原理說了撬碟,下面來擼一發(fā)诞挨,先看看最簡單的加號:

.plus {
    box-sizing : border-box;
    display    : inline-block;
    position   : relative;
    font-size  : 20px;
}

.plus:before, .plus:after {
    content        : '';
    pointer-events : none;
    position       : absolute;
    left           : 50%;
    top            : 50%;
    transform      : translate(-50%, -50%);
    box-shadow     : inset 0 0 0 1em;
}

.plus:before {
    width  : 1em;
    height : 2px;
}

.plus:after {
    height : 1em;
    width  : 2px;
}

代碼還是非常簡單的莉撇,首先我們這里用到了beforeafter兩個偽類增加可用的標(biāo)簽,不然只有一個標(biāo)簽亭姥,要玩出花來實(shí)在是太難稼钩。content顧名思義就是內(nèi)容顾稀,里面可以加各種字符达罗,甚至是換行之類的控制符。而pointer-events:none則是消除了鼠標(biāo)指針事件静秆,這樣元素就具有穿透性了粮揉,具體細(xì)節(jié)還請自行搜索哈,這里就不多說了抚笔。繪圖的核心扶认,就是通過設(shè)置兩個偽類的寬高和陰影來繪制橫豎兩條線,位置方面是通過絕對定位+反向偏移的方式殊橙,巧妙利用了這兩個屬性百分比參照的不同實(shí)現(xiàn)了橫豎的居中辐宾。所有尺寸除了線寬(2px)外都使用em這個相對單位,所以調(diào)整font-size的值就可以調(diào)整圖標(biāo)的大小了膨蛮。要調(diào)整線寬呢叠纹,就將所有px單位的尺寸都一并改了即可。

進(jìn)階玩法


首先來看看這個圖片圖標(biāo):

icon-image

這個圖形網(wǎng)上說的應(yīng)該還是比較多的了敞葛,然而我第一眼看到的時候還是懵逼了誉察。。惹谐。分析一下持偏,最外層的邊框明顯可以用border來做,然后用個before來做圓點(diǎn)也非常簡單氨肌,關(guān)鍵是兩座大山要如何繪制呢鸿秆?box-shadow貌似可以做多層邊框呢,然后加個旋轉(zhuǎn)是不是就出來了呢怎囚?最后隱藏邊框之外的部分就可以了卿叽。繪制流程如下:

icon-image-design
.icon-img {
    display: inline-block;
    position: relative;
    box-sizing: border-box;
    width: 90px;
    height: 80px;
    border: 5px solid;
    border-radius: 10px;
    color: #2ba5bb;
    overflow: hidden;
}

.icon-img:before,.icon-img:after {
    content: '';
    pointer-events: none;
    position: absolute;
}

.icon-img:before {
    width: 10px;
    height: 10px;
    top: 18px;
    right: 20px;
    box-shadow: inset 0 0 0 1em;
    border-radius: 50%;
}

.icon-img:after {
    width: 60px;
    height: 50px;
    left: 0;
    bottom: -27px;
    box-shadow: inset 0 0 0 50px,30px -20px 0 0;
    transform: rotate(45deg);
}

代碼是臨時拼的,就沒做成em單位了桩了。呃附帽,為什么要做成em單位呢?

我們在使用圖標(biāo)的時候井誉,可能尺寸每次都不一樣蕉扮,但圖標(biāo)的尺寸都是有關(guān)聯(lián)的,調(diào)整起來相當(dāng)費(fèi)勁颗圣。當(dāng)然你可以會想到用zoom喳钟、scale來做縮放屁使,但是這樣的縮放線寬也會隨之變化了。設(shè)置em的話奔则,在icon級設(shè)置font-size蛮寂,然后icon本身以及后代都以這個font-size為參照,只調(diào)整font-size就完成了圖標(biāo)的等比縮放了易茬。

再來看一個帶變形的:

codepen

這個一看其實(shí)就能猜到是怎么畫的酬蹋,幾何關(guān)系貌似也比較簡單,但是要映射到css的規(guī)則里面卻非常復(fù)雜抽莱。先看看流程:

codepen-design
.icon-codepen {
    display: inline-block;
    position: relative;
    box-sizing: border-box;
    color: #2ba5bb;
    width: 2px;
    height: 10px;
    box-shadow: inset 0 0 0 32px,0 15px,-11px 7px,11px 7px;
}

.icon-codepen:before,
.icon-codepen:after {
    content: '';
    pointer-events: none;
    position: absolute;
    width: 11px;
    height: 4px;
}

.icon-codepen:before {
    right: 2px;
    top: 3px;
    transform: skew(0,-35deg) scaleY(0.6);
    box-shadow: inset 0 0 0 32px,0 13px,11px 26px,12px 39px;
}

.icon-codepen:after {
    left: 2px;
    top: 3px;
    transform: skew(0,35deg) scaleY(0.6);
    box-shadow: inset 0 0 0 32px,0 13px,-11px 26px,-12px 39px;
}

難點(diǎn)就在長寬的變形上范抓,對于變形比較簡單的方法是使用變換矩陣來求解。圖形學(xué)學(xué)的不好的話食铐,那就比較痛苦了匕垫,如果不追求單標(biāo)簽的話,可以將每條邊用一個標(biāo)簽表示虐呻,這樣就很好處理了象泵。

叔叔,我想裝逼


怎么樣斟叼?覺得上面這些都是小玩意偶惠?想裝逼了?好犁柜,叔叔教你洲鸠!

蒙娜麗莎

蒙娜麗莎?什么鬼馋缅?我會告訴你這也可以用一個單標(biāo)簽純CSS畫出來的嗎扒腕?

http://codepen.io/jaysalvat/pen/HaqBf ,自己看去萤悴,幾千條box-shadow構(gòu)成的蒙娜麗莎瘾腰,看的我內(nèi)分泌都失調(diào)了。覆履。蹋盆。

靜態(tài)的還不夠,那來點(diǎn)動態(tài)的:

weather

http://codepen.io/fbrz/pen/iqtlk 硝全,不多說栖雾,拿去不謝!

更多CSS玩意兒伟众,請到codepen上去探寶吧析藕!如果codepen都打不開,可以到我博客園去下載相應(yīng)的css文件吧凳厢!什么账胧,沒有提供下載鏈接竞慢?F12大法搞起!

首尾呼應(yīng)


語文老師說了治泥,文章要首尾呼應(yīng)升華主題筹煮,so one more time:寫這篇文章的目的其實(shí)就是為了安利一下我的圖標(biāo)庫:iconoo,所以居夹,開門見山败潦,star吧少年少婦們!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吮播,一起剝皮案震驚了整個濱河市变屁,隨后出現(xiàn)的幾起案子眼俊,更是在濱河造成了極大的恐慌意狠,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疮胖,死亡現(xiàn)場離奇詭異环戈,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)澎灸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門院塞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人性昭,你說我怎么就攤上這事拦止。” “怎么了糜颠?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵汹族,是天一觀的道長。 經(jīng)常有香客問我其兴,道長顶瞒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任元旬,我火速辦了婚禮榴徐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘匀归。我一直安慰自己坑资,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布穆端。 她就那樣靜靜地躺著袱贮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪徙赢。 梳的紋絲不亂的頭發(fā)上字柠,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天探越,我揣著相機(jī)與錄音,去河邊找鬼窑业。 笑死钦幔,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的常柄。 我是一名探鬼主播鲤氢,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼西潘!你這毒婦竟也來了卷玉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤喷市,失蹤者是張志新(化名)和其女友劉穎相种,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體品姓,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寝并,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了腹备。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衬潦。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖植酥,靈堂內(nèi)的尸體忽然破棺而出镀岛,到底是詐尸還是另有隱情,我是刑警寧澤友驮,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布漂羊,位于F島的核電站,受9級特大地震影響喊儡,放射性物質(zhì)發(fā)生泄漏拨与。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一艾猜、第九天 我趴在偏房一處隱蔽的房頂上張望买喧。 院中可真熱鬧,春花似錦匆赃、人聲如沸淤毛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽低淡。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蔗蹋,已是汗流浹背何荚。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留猪杭,地道東北人餐塘。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像皂吮,于是被迫代替她去往敵國和親戒傻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容