CSS揭秘之形狀

一.自適應(yīng)的橢圓

問(wèn)題:

我們肯定都注意到過(guò)瘪撇,我們給一個(gè)正方形元素添加一個(gè)足夠大的border-radius(指定大于正方形元素邊長(zhǎng)一半的半徑)获茬,就可以使其變成一個(gè)圓形(如圖1-1.png)。

示例:

width: 200px;
height: 200px;
backgrund: #FFC727;
border-radius: 100px;
圖1-1.png
圖1-1.png

規(guī)范還特別指出了其中的原因:

“當(dāng)任意兩個(gè)相鄰圓角的半徑之和超過(guò)border box的尺寸時(shí)倔既,用戶代理必須按比例減小各個(gè)邊框半徑所使用的值恕曲,直到它們不會(huì)相互重疊為止〔秤浚”

我們有時(shí)可能不愿意給一個(gè)元素設(shè)置固定的寬高佩谣,而是希望讓元素能根據(jù)內(nèi)容自己調(diào)整并適應(yīng)。如果我們現(xiàn)在需要這樣的效果:如果元素的寬高相等实蓬,就顯示為一個(gè)圓茸俭,如果不相等就顯示為橢圓吊履。我們前面的代碼并不能滿足這樣的效果,那我們應(yīng)該怎么來(lái)產(chǎn)生一個(gè)橢圓呢调鬓?

解決方案:

其實(shí)就是一個(gè)你可能并不知道的真相艇炎,那就是border-radius它可以單獨(dú)指定水平半徑和垂直半徑,用(/)分隔兩值即可腾窝。這樣我們就可以得到一個(gè)相對(duì)精確的橢圓(圖1-2.png)缀踪。

示例:

width: 200px;
height: 150px;
background: #ffc727;
border-radius: 100px / 75px;
圖1-2.png
圖1-2.png

這樣就得到了一橢圓,但是它元素的尺寸變化燕锥,border-radius值也需要改變辜贵,那也是有點(diǎn)麻煩的。那我們?cè)趺崔k呢归形?
其實(shí)呢托慨,哈哈,那就是border-radius值是接收百分比值的暇榴;
所以設(shè)置border-radius: 50%;就可以實(shí)現(xiàn)一個(gè)自適應(yīng)的橢圓了厚棵;

好吧,那我們就來(lái)看看border-radius吧蔼紧。
1. border-radius:<length-percentage>{1,4} [ / <length-percentage>{1,4} ]?
where
<length-percentage> = <length> | <percentage>

(1.1) border-radius 用來(lái)設(shè)置邊框圓角婆硬。當(dāng)使用一個(gè)半徑時(shí)確定一個(gè)圓形;當(dāng)使用兩個(gè)半徑時(shí)確定一個(gè)橢圓奸例,這個(gè)(橢)圓與邊框的交集形成圓角效果彬犯。(圖1-3.png)

圖1-3.png---來(lái)自MDN
圖1-3.png---來(lái)自MDN

(1.2)border-radius前一個(gè)語(yǔ)法取值可以取1~4個(gè)值,看下圖(圖1-4.png)就很清楚了,指定的是水平半徑;
后一個(gè)語(yǔ)法取值也可以取1~4個(gè)值(同前一個(gè)語(yǔ)法)查吊,指定的是垂直半徑谐区;

圖1-4.png---來(lái)自css揭秘
圖1-4.png---來(lái)自css揭秘

(1.3)看一些示例吧

二分之一橢圓(圖1-5.png)

width: 200px;
height: 150px;
background: #ffc727;
border-radius: 50% /100% 100% 0 0;
<!--border-top-left-radius: 50% 100%;-->
<!--border-top-right-radius: 50% 100%;-->
<!--border-bottom-right-radius: 50% 0px;-->
<!--border-bottom-left-radius: 50% 0px;-->
圖1-5.png
圖1-5.png

四分之一橢圓(圖1-6.png)

width: 200px;
height: 150px;
background: #ffc727;
border-radius: 100% 0 0 0;
圖1-6.png
圖1-6.png

隨便加了點(diǎn)陰影(圖1-7.png)

width: 200px;
height: 150px;
background: #ffc727;
border-radius: 50%/100% 0;
box-shadow: 0px 10px 20px 0;
圖1-7.png
圖1-7.png

二.平行四邊形

問(wèn)題:

我們可以通過(guò)skew()來(lái)對(duì)矩形進(jìn)行拉伸來(lái)生成一個(gè)平行四邊形(如圖2-1.png);


圖2-1.png
圖2-1.png

平行四邊形是生成了逻卖,但是里面的內(nèi)容“hello”也進(jìn)行了拉伸宋列,這樣就比較難閱讀,也不好看评也。那么有什么辦法只讓形狀拉伸炼杖,而保持內(nèi)容不變呢?

解決方案:

我們可以把所有樣式都應(yīng)用到為元素上盗迟,然后對(duì)偽元素進(jìn)行變形坤邪。因?yàn)槲覀兊膬?nèi)容并不是包含在偽元素里,所以內(nèi)容不會(huì)受到形變的影響诈乒。

示例:(圖2-2.png)

.box{
    margin: 100px;
    width:100px;
    height:40px;
    position:relative;
    text-align: center;
    line-height:40px;
    color: #fff;
}
.box::before{
    content: "";
    position: absolute;
    top:0;
    left: 0;
    right:0;
    bottom: 0;
    background: #ffc727;
    transform: skew(-45deg);
    z-index:-1;
}
圖2-2.png
圖2-2.png

三.菱形圖片

我們可以通過(guò)clip-path屬性來(lái)快速實(shí)現(xiàn)菱形圖片的效果,不過(guò)它現(xiàn)在還是一個(gè)實(shí)驗(yàn)中的功能罩扇,它的兼容性不是很好。
clip-path:<clip-source> | [ <basic-shape> || <geometry-box> ] | none
where
<clip-source> = <url>
<basic-shape> = <inset()> | <circle()> | <ellipse()> | <polygon()>
<geometry-box> = <shape-box> | fill-box | stroke-box | view-box

示例:(圖3-1.png)

img{
    clip-path: polygon(50% 0,100% 50%,50% 100%,0 50%);
}
圖3-1.png
圖3-1.png

basic-shape有四種基本形狀(inset,cicle,ellipse,polygon),感覺(jué)好方便啊,那我們就一起來(lái)看看吧喂饥。
(3.1)<inset()> :定義一個(gè)插圖矩形
where
<inset()> = inset( <length-percentage>{1,4} [ round <border-radius> ]? )
inset()可以傳入5個(gè)參數(shù)(第5個(gè)參數(shù)可選)消约,分別對(duì)應(yīng)top,right,bottom,left,round radius,我們看一下下面的示例(圖3-2.png)员帮,就清楚了或粮;

示例:(圖3-2.png)

clip-path: inset(10px 10px 50px 20px round 30px);
圖3-2.png
圖3-2.png

(3.2)<circle()>:圓
where
<circle()> = circle( [ <shape-radius> ]? [ at <position> ]? )
circle()可以傳人2個(gè)可選參數(shù);
第一個(gè)參數(shù)是圓的半徑捞高,默認(rèn)為圖片寬高中短的那個(gè)為直徑氯材;
注意:這個(gè)參數(shù)是支持百分比的,如果用百分比:
圓的半徑/百分比=sqrt(width2+height2)/sqrt(2)硝岗。

第二個(gè)參數(shù)是圓心位置氢哮,默認(rèn)為圖片中心。

示例:(圖3-3.png)

clip-path: circle(30% at 150px 120px);

圖3-3.png
圖3-3.png

圓的半徑 = [sqrt(3002+2252)/sqrt(2)]*30% ≈ 80 px;

(3.3)<ellipse()>:橢圓
where
<ellipse()> = ellipse( [ <shape-radius>{2} ]? [ at <position> ]? )
ellipse()可以傳入3個(gè)可選參數(shù)型檀;
前2個(gè)參數(shù)表示的分別是橢圓X軸半徑和Y軸半徑冗尤,默認(rèn)是圖片寬(高)的一半,支持百分比胀溺;
第三個(gè)參數(shù)是橢圓中心位置裂七,默認(rèn)圖片中心。

示例:(圖3-4.png)

clip-path: ellipse(25% 25% at 50% 25%);
圖3-4.png
圖3-4.png

(3.4)<polygon()>:多邊形
where
<polygon()> = polygon( <fill-rule>? , [ <length-percentage> <length-percentage> ]# )
polygon()中前一個(gè)語(yǔ)法<fill-rule>表示填充規(guī)則用來(lái)確定該多邊形的內(nèi)部仓坞”沉悖可能的值有nonzero和evenodd,默認(rèn)值是nonzero;
后面列表中的每對(duì)參數(shù)表示多邊形的頂點(diǎn)坐標(biāo)(X,Y);

示例:(圖3-5.png)

clip-path: polygon(50% 0,100% 50%,0 100%);
圖3-5.png
圖3-5.png

clip-path這個(gè)屬性還可以參與動(dòng)畫(huà)呢,只要我們使用的是同一種形狀函數(shù)无埃。

示例:(圖3-6.png)

img{
    clip-path: ellipse(75% 25%);
    transition: 1s clip-path;
}
img:hover{
    clip-path: ellipse(50% 50%);
}
圖3-6.png
圖3-6.png

四.切角效果
我這里用上面的clip-path來(lái)實(shí)現(xiàn)下徙瓶,可以通過(guò)css漸變和border-image實(shí)現(xiàn)。
(4.1)clip-path實(shí)現(xiàn)切角效果

示例:(圖4-1.png)
CSS

.box{
width:200px;
height:200px;
background: #FFc727;
clip-path: polygon(20px 0,calc(100% - 20px) 0,100% 20px,100% calc(100% - 20px),calc(100% - 20px) 100%,20px 100%,0 calc(100% - 20px),0 20px);
}

>
這樣要改一切角嫉称,就要改好多地方倍啥,不是很方便,我們就用一下預(yù)處理器,我使用的是LESS澎埠,這樣就稍稍好了一些,但也不夠DRY始藕。
LESS
>>```
.corner(@radius){
    @ca: e("calc(100% - @{radius})");
    <!--@ca: calc(~"100% - @{radius}");-->
    clip-path: polygon(@radius 0,@ca 0,100% @radius,100% @ca,@ca 100%,@radius 100%,0 @ca,0 @radius);
}
.box{
    width:200px;
    height:200px;
    background: #FFc727;
    .corner(20px);
}
圖4-1.png
圖4-1.png

未來(lái)蒲稳,可能會(huì)引入一個(gè)新的屬性corner-shape,配合border-radius使用伍派,這樣就可以快速實(shí)現(xiàn)一些切角的問(wèn)題江耀。
corner-shape介紹:http://lea.verou.me/2013/03/border-corner-shape-is-in-danger-and-you-can-help/
corner-shape體驗(yàn):http://leaverou.github.io/corner-shape/


本內(nèi)容根據(jù)《css揭秘》, MDN 和自己的理解進(jìn)行整理;
感謝您的閱讀诉植。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末祥国,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舌稀,老刑警劉巖啊犬,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異壁查,居然都是意外死亡觉至,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門睡腿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)语御,“玉大人,你說(shuō)我怎么就攤上這事席怪∮Υ常” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵挂捻,是天一觀的道長(zhǎng)碉纺。 經(jīng)常有香客問(wèn)我,道長(zhǎng)细层,這世上最難降的妖魔是什么惜辑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮疫赎,結(jié)果婚禮上盛撑,老公的妹妹穿的比我還像新娘。我一直安慰自己捧搞,他們只是感情好抵卫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著胎撇,像睡著了一般介粘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晚树,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天姻采,我揣著相機(jī)與錄音,去河邊找鬼爵憎。 笑死慨亲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宝鼓。 我是一名探鬼主播刑棵,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼愚铡!你這毒婦竟也來(lái)了蛉签?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碍舍,沒(méi)想到半個(gè)月后柠座,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乒验,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年愚隧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锻全。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狂塘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鳄厌,到底是詐尸還是另有隱情荞胡,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布了嚎,位于F島的核電站泪漂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏歪泳。R本人自食惡果不足惜萝勤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呐伞。 院中可真熱鬧敌卓,春花似錦、人聲如沸伶氢。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)癣防。三九已至蜗巧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蕾盯,已是汗流浹背幕屹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留级遭,地道東北人香嗓。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像装畅,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沧烈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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

  • 各種純css圖標(biāo) CSS3可以實(shí)現(xiàn)很多漂亮的圖形掠兄,我收集了32種圖形,在下面列出。直接用CSS3畫(huà)出這些圖形蚂夕,要比...
    劍殘閱讀 9,506評(píng)論 0 8
  • 選擇qi:是表達(dá)式 標(biāo)簽選擇器 類選擇器 屬性選擇器 繼承屬性: color迅诬,font,text-align婿牍,li...
    wzhiq896閱讀 1,732評(píng)論 0 2
  • 選擇qi:是表達(dá)式 標(biāo)簽選擇器 類選擇器 屬性選擇器 繼承屬性: color侈贷,font,text-align等脂,li...
    love2013閱讀 2,304評(píng)論 0 11
  • 1.CSS簡(jiǎn)介 Cascading Style Sheet 層疊樣式表 主要用來(lái)定義頁(yè)面中的表現(xiàn)俏蛮,HTML 描述頁(yè)...
    hyt222閱讀 818評(píng)論 0 0
  • 文:豆芽菜 從畢業(yè)到工作四年了搏屑,鬼使神差的我的工作都是跟英語(yǔ)有關(guān)的,理工科出身的我粉楚,真的做不到啊辣恋。在自己亂七八糟的...
    麻豆札記閱讀 9,776評(píng)論 4 97