CSS3初体验之奇技淫巧
自CSS3流行以來,雖然以前看過一遍所有的新增屬性,但其實(shí)在實(shí)際項(xiàng)目中用到的少之又少。所以沒有形成系統(tǒng)性的認(rèn)識,以及看到效果立馬就能想到解決方案的能力。然后最近正好遇到一個需要繪制大量動畫的需求,所以決定趁此機(jī)會好好研究一下這個既熟悉又陌生的css3。
在正式開始css3之前,先來介紹一些比較經(jīng)典的css3實(shí)例,讓大家好好感受一下css3的魅力,本文會提到以下幾個css3的屬性:
border-radius、::after、attr和content、box-sizing、linear-gradient、radial-gradient、box-shadow
border-radius
相信這個屬性,寫過css的同學(xué)都知道,用來產(chǎn)生圓角,比如畫一個圓形:
div {width:100px;height:100px;background:red;border-radius:50px; //圓角效果最大為長寬的一半,所以設(shè)置為50px及以上均可。/*border-radius:50%; */ //或者使用百分比,設(shè)置為50%及以上都是圓形效果。}復(fù)制代碼然后我們來看看它的語法:border-radius: [左上] [右上] [右下] [左下],于是我們來畫一個半圓
div {width: 100px;height: 50px;background: red;border-radius: 50px 50px 0 0;}復(fù)制代碼那如果要畫一個橢圓該怎么辦呢?你會發(fā)現(xiàn)上面的語法貌似做不到了,其實(shí)border-radius的值還有一種語法: x半徑/y半徑:
div {width: 100px;height: 50px;background: red;border-radius: 50px/25px;}復(fù)制代碼如果我要畫半個橢圓,又要咋辦呢?
div {width: 100px;height: 50px;background: red;border-radius: 100% 0 0 100% /50%;}復(fù)制代碼
::after
這里拿個簡單的例子來看,我們要畫一個放大鏡,如下圖:
分析一下,這個放大鏡可以由兩個div組成,一個是黑色的圓環(huán),一個是黑色把手(旋轉(zhuǎn)45度)。所以我們就需要用兩個div來實(shí)現(xiàn)嗎?答案是NO,一個div也是可以的,我們可以借助::after來添加一個元素。同理如果需要三個div,我們還可以使用::before再添加一個元素。下面看一下代碼:
div {width: 50px;height: 50px;border-radius: 50%;border: 5px solid #333;position: relative; } div::after {content: '';display: block; width: 8px; height: 60px; border-radius: 5px; background: #333; position: absolute; right: -22px; top: 38px; transform: rotate(-45deg); }復(fù)制代碼attr和content
比如我們要實(shí)現(xiàn)一個懸浮提示的功能。傳統(tǒng)方法,使用title屬性就能實(shí)現(xiàn),但是現(xiàn)在我們要更美觀,可以使用css3提供的attr:能夠在css中獲取到元素的某個屬性值,然后插入到偽元素的content中去。
假如我們的html代碼如下:
<div data-title="hello, world">hello...</div>復(fù)制代碼我們來看看實(shí)現(xiàn)這個插件的css代碼:
div {position: relative; } div:hover::after {content: attr(data-title); //取到data-title屬性的值display: inline-block;padding: 10px 14px;border: 1px solid #ddd;border-radius: 5px;position: absolute;top: -50px;left: -30px; }復(fù)制代碼當(dāng)hover的時候,在元素尾部添加一個內(nèi)容為data-title屬性值的元素,所以就實(shí)現(xiàn)了hover顯示的效果,如下圖所示:
box-sizing
我們知道,在標(biāo)準(zhǔn)盒子模型中,元素的總寬=content + padding + border + margin。 css中的盒子模型大家可能都知道,但是這個盒子模型的屬性可能沒有那么多人知道,box-sizing屬性就是用來重定義這個計(jì)算方式的,它有三個取值,分別是:content-box(默認(rèn))、border-box、padding-box
一般來說,假如我們需要有一個占寬200px、padding10px、border5px的div,經(jīng)過計(jì)算,要這么定義樣式。
div {width: 170px; //這里的寬度要使用200-10*2-5*2 = 170得到。height: 50px;padding: 10px;border: 5px solid red; }復(fù)制代碼然后我們來使用一下box-sizing屬性。
div {box-sizing: border-box;width: 200px; //這里的寬度就是元素所占總寬度,不需要計(jì)算 height: 50px;padding: 10px;border: 5px solid red; }復(fù)制代碼linear-gradient
做活動頁面的時候我們經(jīng)常會遇到這樣的需求:
頂部的中間一張大banner圖片,然后整個區(qū)域的背景色要根據(jù)圖片背景色漸變。就可以使用這個屬性了。
div {width: 200px;height: 50px;background: linear-gradient(to right, red, yellow, black, green); }復(fù)制代碼是不是很有趣?其實(shí),linear-gradient還有更多有趣的功能,你可以根據(jù)下面的動圖去感受一下:
你以為這就完了?等等,還有更強(qiáng)大的呢!repeating-linear-gradient,來感受一下:
linear-gradient還有更加強(qiáng)大的功能,比如它可以給元素添加多個漸變,從而達(dá)到更NB的效果。
radial-gradient
上面的linear-gradient是線性漸變,這個屬性是徑向漸變。下面的代碼實(shí)現(xiàn)了一個chrome的logo。
div.chrome {width: 180px;height: 180px;border-radius: 50%;box-shadow: 0 0 4px #999, 0 0 2px #ddd inset;background: radial-gradient(circle, #4FACF5 0, #2196F3 28%, transparent 28%),radial-gradient(circle, #fff 33%, transparent 33%),linear-gradient(-50deg, #FFEB3B 34%, transparent 34%),linear-gradient(60deg, #4CAF50 33%, transparent 33%),linear-gradient(180deg, #FF756B 0, #F44336 30%, transparent 30%),linear-gradient(-120deg, #FFEB3B 40%, transparent 40%),linear-gradient(-60deg, #FFEB3B 30%, transparent 30%),linear-gradient(0deg, #4CAF50 45%, transparent 45%),linear-gradient(60deg, #4CAF50 30%, transparent 30%),linear-gradient(120deg, #F44336 50%, transparent 50%),linear-gradient(180deg, #F44336 30%, transparent 30%); }復(fù)制代碼實(shí)現(xiàn)原理就是使用了多個漸變色放在div上,友協(xié)被遮住,視覺上就產(chǎn)生了想要的效果,是不是很強(qiáng)大!看了下圖你就知道其實(shí)就是在div上加了很多個漸變。
box-shadow
上面的例子大都是對css3新屬性的了解和認(rèn)識,這個實(shí)例則是有關(guān)于解決方案的例子。
需求:我們要實(shí)現(xiàn)下面這個效果圖(三個邊框:黑色,綠色,紅色):
解法一:假如沒有css3知識,我們可以做這樣做:用三個div,分別設(shè)置邊框,然后分別控制寬高和位置來達(dá)到這個效果。顯然,很復(fù)雜,這里就不貼代碼了。
解法二:現(xiàn)在我們有css3的知識了,借助box-shadow就可以輕松解決這個問題。先來看看它的語法:box-shadow: [x偏移] [y偏移] [陰影模糊寬度] [陰影寬度] [顏色],并且還能添加多個陰影,使用逗號隔開。
當(dāng)然你還可以繼續(xù)增加,四重邊框,五重邊框......都不再是問題啦。另外,還能加圓角,陰影會貼緊內(nèi)層div。
使用這種方法,有一個缺點(diǎn)就是,不支持虛線邊框。
解法三: 使用outline(只能支持兩重邊框)
使用這種方法的缺點(diǎn)就是,只能支持兩層的邊框,而且還不能根據(jù)容器的border-radius自動貼合。
總結(jié)
通過這段時間對css3的深入了解,發(fā)現(xiàn)css3真的很強(qiáng)大,研究起來還是挺有趣的,只有想不到,感覺沒有做不到。不過為了實(shí)現(xiàn)很酷炫的效果,可能需要編寫大量的css代碼,這個時候使用什么技術(shù)就需要我們自己來衡量了。
總結(jié)
以上是生活随笔為你收集整理的CSS3初体验之奇技淫巧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jquery总结06-动画事件03-淡入
- 下一篇: java常见面试题及答案 11-20(J