單標(biāo)簽!純CSS實現(xiàn)動態(tài)晴陰雨雪

1 引言

本期分享一下如何僅用CSS3船惨,實現(xiàn)單標(biāo)簽的動態(tài)晴陰雨雪粱锐。技術(shù)關(guān)鍵點就是“單標(biāo)簽”和“純CSS”怜浅。先看下最終效果:


再看看HTML代碼:

<!--晴-->

<div class="weather sunny"></div>

<!--陰-->

<div class="weather cloudy"></div>

<!--雨-->

<div class="weather rainy"></div>

<!--雪-->

<div class="weather snowy"></div>

沒錯,就是這么任性跨琳,每個動圖就一個標(biāo)簽樟氢,而且無圖無JS埠啃!下面就來詳細(xì)介紹下技術(shù)實現(xiàn)。

涉及到的關(guān)鍵CSS3屬性:

transform:用于移位潦牛、旋轉(zhuǎn)巴碗、縮放效果

box-shadow:利用投影實現(xiàn)圖像的復(fù)制(關(guān)鍵!)

clip-path:基于繪制的形狀對元素進(jìn)行遮罩處理

animation:設(shè)置元素的動畫

以及實現(xiàn)單標(biāo)簽最關(guān)鍵的:before逸爵、:after偽元素運(yùn)用师倔。

通過本期分享,能學(xué)到什么凶朗?

最大的一點就是:box-shadow的另類玩法——“影分身”抖单。

下面開始逐個講解。

2 基礎(chǔ)背景

圖中的藍(lán)塊背景區(qū)域刃永,很基礎(chǔ)了斯够,不用講了抓督。

設(shè)置了區(qū)域的寬高铃在、背景色和圓角效果。

.weather {

????position: relative;

????display: inline-block;

????width: 180px;

????height: 240px;

????background: #23b7e5;

????border-radius: 8px;

}


3 晴天

晴天圖標(biāo)由兩個元素組成:太陽和內(nèi)六角形陽光揣炕。

:before畸陡、:after 兩個偽元素可以在元素內(nèi)部分別“添加”一個元素,正好都利用上了涩惑。

3.1 繪制太陽

首先,用 :before實現(xiàn)太陽痊硕。

.sunny:before {

????content: "";

????position: absolute;

????top: 50%;

????left: 50%;

????transform: translate(-50%, -50%);

????width: 60px;

????height: 60px;

????background: #F6D963;

????border-radius: 50%;

????box-shadow: 0 0 20px #ff0;

????z-index: 2;

}

content用來生成一個元素。

position盒揉、top、left藕漱、transform用來實現(xiàn)中心居中肋联。

box-shadow實現(xiàn)外發(fā)光效果忘伞,這只是box-shadow最基本最常用的使用方式。



3.2 繪制內(nèi)六角形

用 :after實現(xiàn)內(nèi)六角形。

實現(xiàn)的關(guān)鍵就是使用遮罩育勺。通過clip-path繪制一個內(nèi)六角形涧至。這就變成了一個簡單的初中幾何問題哑了。

內(nèi)六角形由兩個等邊三角形拼合而成窄陡。


合并之后,我們可以把整體劃分為若干個完全相同的小等邊三角形币叹。


在垂直方向做個輔助線套硼,連接中間頂部和底部兩點卡辰。不難發(fā)現(xiàn)胞皱,“垂直方向的最大長度”要大于“水平方向的最大長度”邪意。


設(shè)小等邊三角形的邊長為1,以內(nèi)六角形中心為坐標(biāo)原點反砌,可以計算出每個點的坐標(biāo)雾鬼,如下:


為了使用clip-path的百分比定位來繪制圖像宴树,下一步需要把長度坐標(biāo)轉(zhuǎn)換為百分比坐標(biāo)蠢莺。

設(shè)垂直方向最大長度為100%祸憋,仍以內(nèi)六角形中心為坐標(biāo)原點,每個點的坐標(biāo)值轉(zhuǎn)換如下:


由于clip-path繪制原點是在左上角颊咬,x軸右側(cè)為正值,y軸下方為正值。需要做下坐標(biāo)系轉(zhuǎn)換。即:

新x軸坐標(biāo)值 = 舊x軸坐標(biāo)值 + 50%

新y軸坐標(biāo)值 = (舊y軸坐標(biāo)值 - 50%) * -1


使用clip-path的polygon方法繪制內(nèi)六角形,坐標(biāo)已通過上面的步驟計算出來了。

樣式代碼如下:

.sunny:after {

????content: "";

????position: absolute;

????top: 50%;

????left: 50%;

????margin: -45px 0 0 -45px;

????width: 90px;

????height: 90px;

????background: #FFEB3B;

????clip-path: polygon(

????????50% 0%,

????????64.43% 25%,

????????93.3% 25%,

????????78.87% 50%,

????????93.3% 75%,

????????64.43% 75%,

????????50% 100%,

????????35.57% 75%,

????????6.7% 75%,

????????21.13% 50%,

????????6.7% 25%,

????????35.57% 25%);

????z-index: 1;

????animation: sunScale 2s linear infinite;

}

@keyframes sunScale {

????0% {

????????transform: scale(1);

????}

????50% {

????????transform: scale(1.1);

? ? ?}

????100% {

????????transform: scale(1);

????}

}

※注:safari需要將clip-path改為-webkit-clip-path。由于代碼太占篇幅,這里就不重復(fù)寫兩遍了祖能。


實現(xiàn)原理就是通過clip-path繪制了一個內(nèi)六角形遮罩鳞滨,把黃顏色背景通過遮罩變成了最終的內(nèi)六角形笋敞。

animation通過關(guān)鍵幀動畫實現(xiàn)了“放大縮小”交替動效喷兼。

最終效果:



4 陰天

觀察圖形發(fā)現(xiàn)藕筋,有兩個云朵:前面的白云和后面的烏云。貌似需要分別用 :before和 :after實現(xiàn)垛贤。如果這樣做的話禀酱,后續(xù)章節(jié)的雨天和雪天的雨雪元素就沒有多余的偽元素可用了鳍置。所以只能用一個偽元素實現(xiàn)兩朵云衫冻。 這里就用到了box-shadow的“影分身”了莉测!

由于后續(xù)章節(jié)的雨天和雪天都復(fù)用了云的樣式祟绊,所以寫在一起了,代碼如下:

.cloudy:before, .rainy:before, .snowy:before {

????content: "";

????position: absolute;

????top: 50%;

????left: 25%;

????transform: translate(-50%, -50%);

????width: 36px;

????height: 36px;

????background: #fff;

????border-radius: 50%;

????z-index: 2;

}


真實的元素(真身)就是一個圓。通過box-shodow來把投影作為“分身”。

先來看看box-shadow的屬性:

box-shadow: h-shadow v-shadow blur spread color inset;

參數(shù)詳解:

????h-shadow: 陰影的水平偏移量仆邓。

????v-shadow: 陰影的垂直偏移量嗓蘑。

????blur: 模糊距離(就是漸變的距離业簿,設(shè)為0就沒有漸變)缰揪。

????spread: 投影的尺寸箱蟆,通過這個控制“影分身”的大小入客。

????color: 投影顏色管毙,通過這個實現(xiàn)后方的烏云腿椎。

????inset: 改為內(nèi)陰影。這里用不到夭咬。

先復(fù)制一個影分身試試:

box-shadow: #fff 22px -15px 0 6px;


繼續(xù)復(fù)制多個影分身啃炸,帶全部影分身的完整代碼如下:

.cloudy:before, .rainy:before, .snowy:before {

????content: "";

????position: absolute;

????top: 50%;

????left: 25%;

????transform: translate(-50%, -50%);

????width: 36px;

????height: 36px;

????background: #fff;

????border-radius: 50%;

????box-shadow:

????????????#fff 22px -15px 0 6px,

????????????#fff 57px -6px 0 2px,

????????????#fff 87px 4px 0 -4px,

????????????#fff 33px 6px 0 6px,

? ? ? ? ? ? #fff 61px 6px 0 2px,

????????????#ccc 29px -23px 0 6px,

? ? ? ? ? ? #ccc 64px -14px 0 2px,

????????????#ccc 94px -4px 0 -4px;

????z-index: 2;

}

五個分身的白圓(#fff),三個分身的灰圓(#ccc)拼成了兩朵云。

再給云朵加上“上下浮動”的動效:

.cloudy:before {

????animation: cloudMove 2s linear infinite;

}

@keyframes cloudMove {

????0% {

????????transform: translate(-50%, -50%);

????}

????50% {

????????transform: translate(-50%, -60%);

????}

? ? 100% {

????????transform: translate(-50%, -50%);

????}

}



5 雨天

云朵的代碼直接復(fù)用第4章的陰天卓舵。這里使用 :after 偽元素實現(xiàn)雨滴南用。

先實現(xiàn)一個雨滴(為方便觀看,暫時隱藏云朵):

.rainy:after {

????content: "";

????position: absolute;

????top:50%;

????left: 25%;

????width: 4px;

????height: 14px;

????background: #fff;

????border-radius: 2px;

}


然后通過box-shadow“影分身”:

.rainy:after {

????content: "";

????position: absolute;

????top:50%;

????left: 25%;

????width: 4px;

????height: 14px;

????background: #fff;

????border-radius: 2px;

? ? box-shadow:

? ? ? ? ?#fff 25px -10px 0,

? ? ? ? ?#fff 50px 0 0,

? ? ? ? ?#fff 75px -10px 0,

? ? ? ? ? #fff 0 25px 0,

? ? ? ? ?#fff 25px 15px 0,

? ? ? ? ? #fff 50px 25px 0,

? ? ? ? ?#fff 75px 15px 0,

? ? ? ? ? #fff 0 50px 0,

? ? ? ? ?#fff 25px 40px 0,

? ? ? ? ?#fff 50px 50px 0,

? ? ? ? ?#fff 75px 40px 0;

}


再加入下雨的移動動效掏湾,修改如下:

.rainy:after {

????...(略)

? ? ?animation: rainDrop 2s linear infinite;

}

?@keyframes rainDrop {

? ? ?0% {

? ? ? ? transform: translate(0, 0)

????????rotate(10deg);

}

? ? ?100% {

? ? ? ? ?transform: translate(-4px, 24px)

????????rotate(10deg);

? ? ? ? ?box-shadow:

? ? ? ? ? ? ? ? ? #fff 25px -10px 0,

? ? ? ? ? ? ? ? ?#fff 50px 0 0,

? ? ? ? ? ? ? ? ?#fff 75px -10px 0,

? ? ? ? ? ? ? ? ? #fff 0 25px 0,

? ? ? ? ? ? ? ? ?#fff 25px 15px 0,

? ? ? ? ? ? ? ? ?#fff 50px 25px 0,

? ? ? ? ? ? ? ? ? #fff 75px 15px 0,

? ? ? ? ? ? ? ? ? rgba(255, 255, 255, 0) 0 50px 0,

? ? ? ? ? ? ? ? ? rgba(255, 255, 255, 0) 25px 40px 0,

? ? ? ? ? ? ? ? ?rgba(255, 255, 255, 0) 50px 50px 0,

? ? ? ? ? ? ? ? ?rgba(255, 255, 255, 0) 75px 40px 0;

? ? ? ? ?}

?}


動畫添加了10度的旋轉(zhuǎn)裹虫,讓雨滴傾斜,以及垂直方向的移動融击。

這里的關(guān)鍵就是:雖然本質(zhì)是垂直移動筑公,但為了看上去是“循環(huán)”效果,需要將最下面的雨滴進(jìn)行透明漸變尊浪,同時調(diào)節(jié)X和Y軸的值匣屡,讓最終位置正好跟初始位置重合,就不會顯得“斷開”际长。

我們生成的是三行雨滴耸采,第一行被云朵擋住了兴泥,實際能看到的是下面兩行工育。在第一行移動到第二行位置的時候,原第三行已經(jīng)透明看不見了搓彻,正好與初始狀態(tài)一樣如绸,實現(xiàn)了無縫循環(huán)拼接。

6 雪天

雪天與雨天的區(qū)別就是把雨滴換成圓形旭贬,取消旋轉(zhuǎn)角度怔接。 代碼如下:

.snowy:after {

????content: "";

????position: absolute;

????top:50%;

????left: 25%;

????width: 8px;

????height: 8px;

????background: #fff;

????border-radius: 50%;

????box-shadow:

????????????#fff 25px -10px 0,

????????????#fff 50px 0 0,

????????????#fff 75px -10px 0,

????????????#fff 0 25px 0,

????????????#fff 25px 15px 0,

????????????#fff 50px 25px 0,

????????????#fff 75px 15px 0,

????????????#fff 0 50px 0,

????????????#fff 25px 40px 0,

????????????#fff 50px 50px 0,

????????????#fff 75px 40px 0;

????animation: snowDrop 2s linear infinite;

}

@keyframes snowDrop {

????0% {

????????transform: translateY(0);

????}

????100% {

????????transform: translateY(25px);

????????box-shadow:

????????????????#fff 25px -10px 0,

????????????????#fff 50px 0 0,

????????????????#fff 75px -10px 0,

????????????????#fff 0 25px 0,

????????????????#fff 25px 15px 0,

????????????????#fff 50px 25px 0,

????????????????#fff 75px 15px 0,

? ? ? ? rgba(255, 255, 255, 0) 0 50px 0,

????????rgba(255, 255, 255, 0) 25px 40px 0,

????????rgba(255, 255, 255, 0) 50px 50px 0,

????????rgba(255, 255, 255, 0) 75px 40px 0;

????}

}?



7 全部源碼

源碼如下,方便粘貼保存為html:

<!DOCTYPE html>

<html lang="en">

<head>

????<meta charset="UTF-8">

????<title>單標(biāo)簽稀轨!純CSS實現(xiàn)動態(tài)晴陰雨雪</title>

</head>

<body>

????<div class="weather sunny"></div>

????<div class="weather cloudy"></div>

????<div class="weather rainy"></div>

????<div class="weather snowy"></div>

?</body>

<style>

.weather {

????position: relative;

????display: inline-block;

????width: 180px;

????height: 240px;

????background: #23b7e5;

????border-radius: 8px;

}

.sunny:before {

????content: "";

????position: absolute;

????top: 50%;

????left: 50%;

????transform: translate(-50%, -50%);

????width: 60px;

????height: 60px;

????background: #F6D963;

????border-radius: 50%;

????box-shadow: 0 0 20px #ff0;

????z-index: 2;

}

.sunny:after {

????content: "";

????position: absolute;

????top: 50%;

????left: 50%;

????margin: -45px 0 0 -45px;

????width: 90px;

????height: 90px;

????background: #FFEB3B;

????clip-path: polygon(

????????????50% 0%,

????????????64.43% 25%,

????????????93.3% 25%,

????????????78.87% 50%,

????????????93.3% 75%,

????????????64.43% 75%,

????????????50% 100%,

????????????35.57% 75%,

????????????6.7% 75%,

????????????21.13% 50%,

????????????6.7% 25%,

????????????35.57% 25%

????);

????z-index: 1;

????animation: sunScale 2s linear infinite;

}

@keyframes sunScale {

????0% {

????????transform: scale(1);

????}

????50% {

????????transform: scale(1.1);

????}

????100% {

????????transform: scale(1);

????}

}

.cloudy:before, .rainy:before, .snowy:before {

????content: "";

????position: absolute;

????top: 50%;

????left: 25%;

????transform: translate(-50%, -50%);

????width: 36px;

????height: 36px;

????background: #fff;

????border-radius: 50%;

????box-shadow:

????????????#fff 22px -15px 0 6px,

????????????#fff 57px -6px 0 2px,

????????????#fff 87px 4px 0 -4px,

????????????#fff 33px 6px 0 6px,

????????????#fff 61px 6px 0 2px,

????????????#ccc 29px -23px 0 6px,

????????????#ccc 64px -14px 0 2px,

????????????#ccc 94px -4px 0 -4px;

????z-index: 2;

}

.cloudy:before {

????animation: cloudMove 2s linear infinite;

}

@keyframes cloudMove {

????0% {

????????transform: translate(-50%, -50%);

????}

????50% {

????????transform: translate(-50%, -60%);

????}

????100% {

????????transform: translate(-50%, -50%);

????}

}

.rainy:after {

????content: "";

????position: absolute;

????top:50%; left: 25%;

????width: 4px;

????height: 14px;

????background: #fff;

????border-radius: 2px;

????box-shadow:

????????????#fff 25px -10px 0,

????????????#fff 50px 0 0,

????????????#fff 75px -10px 0,

????????????#fff 0 25px 0,

????????????#fff 25px 15px 0,

????????????#fff 50px 25px 0,

????????????#fff 75px 15px 0,

????????????#fff 0 50px 0,

????????????#fff 25px 40px 0,

????????????#fff 50px 50px 0,

????????????#fff 75px 40px 0;

????animation: rainDrop 2s linear infinite;

}

@keyframes rainDrop {

????0% {

????????transform: translate(0, 0)

????????rotate(10deg);

????}

????100% {

????????transform: translate(-4px, 24px)

????????rotate(10deg);

????????box-shadow:

????????????????#fff 25px -10px 0,

????????????????#fff 50px 0 0,

????????????????#fff 75px -10px 0,

????????????????#fff 0 25px 0,

????????????????#fff 25px 15px 0,

????????????????#fff 50px 25px 0,

????????????????#fff 75px 15px 0,

????????rgba(255, 255, 255, 0) 0 50px 0,

????????rgba(255, 255, 255, 0) 25px 40px 0,

????????rgba(255, 255, 255, 0) 50px 50px 0,

????????rgba(255, 255, 255, 0) 75px 40px 0;

????}

}

.snowy:after {

????content: "";

????position: absolute;

????top:50%;

????left: 25%;

????width: 8px;

????height: 8px;

????background: #fff;

????border-radius: 50%;

????box-shadow:

????????#fff 25px -10px 0,

????????#fff 50px 0 0,

????????#fff 75px -10px 0,

????????#fff 0 25px 0,

????????#fff 25px 15px 0,

????????#fff 50px 25px 0,

????????#fff 75px 15px 0,

????????#fff 0 50px 0,

????????#fff 25px 40px 0,

????????#fff 50px 50px 0,

????????#fff 75px 40px 0;

????animation: snowDrop 2s linear infinite;

}

@keyframes snowDrop {

????0% {

????????transform: translateY(0);

????}

????100% {

????????transform: translateY(25px);

????????box-shadow:

????????????????#fff 25px -10px 0,

????????????????#fff 50px 0 0,

????????????????#fff 75px -10px 0,

????????????????#fff 0 25px 0,

????????????????#fff 25px 15px 0,

????????????????#fff 50px 25px 0,

????????????????#fff 75px 15px 0,

????????rgba(255, 255, 255, 0) 0 50px 0,

????????rgba(255, 255, 255, 0) 25px 40px 0,

????????rgba(255, 255, 255, 0) 50px 50px 0,

????????rgba(255, 255, 255, 0) 75px 40px 0;

????}

}

</style>

</html>


?著作權(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)我...
    茶點故事閱讀 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
  • 正文 獨居荒郊野嶺守林人離奇死亡震放,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了驼修。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殿遂。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡诈铛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出墨礁,到底是詐尸還是另有隱情幢竹,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布恩静,位于F島的核電站焕毫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏驶乾。R本人自食惡果不足惜邑飒,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望级乐。 院中可真熱鬧疙咸,春花似錦、人聲如沸风科。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贼穆。三九已至题山,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間故痊,已是汗流浹背顶瞳。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留崖蜜,地道東北人浊仆。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像豫领,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子舔琅,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

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

  • 1 引言 本期分享一下如何僅用CSS3备蚓,實現(xiàn)單標(biāo)簽的動態(tài)晴陰雨雪课蔬。技術(shù)關(guān)鍵點就是“單標(biāo)簽”和“純CSS”。先看下最...
    Mr_兔子先生閱讀 569評論 0 2
  • 上次看到簡友用HTML+CSS寫了一個小叮當(dāng)郊尝,這次我發(fā)憤圖強(qiáng)二跋,終于寫出了這只大白 截的靜態(tài)圖,他的頭其實是可以動的...
    _Crown閱讀 1,859評論 9 38
  • 1流昏、垂直對齊 如果你用CSS扎即,則你會有困惑:我該怎么垂直對齊容器中的元素吞获?現(xiàn)在,利用CSS3的Transform谚鄙,...
    kiddings閱讀 3,170評論 0 11
  • 各種純css圖標(biāo) CSS3可以實現(xiàn)很多漂亮的圖形各拷,我收集了32種圖形,在下面列出闷营。直接用CSS3畫出這些圖形烤黍,要比...
    劍殘閱讀 9,565評論 0 8
  • 設(shè)置hash類型與獲取
    極簡series閱讀 292評論 0 0