前端知識(shí) | CSS小技巧-自適應(yīng)橢圓

背景知識(shí):

border-radius?屬性的基本用法丛晌。

難題:

你可能注意到過(guò),給任何正方形元素設(shè)置一個(gè)足夠大的 border-radius斗幼,就可以把它變成一個(gè)圓形澎蛛。所用到的 CSS 代碼如下所示:???


圖1.1給元素設(shè)置固定寬高以及一半長(zhǎng)度的 border-radius,可以得到一個(gè)圓形

你可能還注意到了蜕窿,如果指定任何大于 100px 的半徑谋逻,仍然可以得到一個(gè)圓形。規(guī)范特別指出了這其中的原因:

“當(dāng)任意兩個(gè)相鄰圓角的半徑之和超過(guò) borderbox 的尺寸時(shí)渠羞,用戶代理必須按比例減小各個(gè)邊框半徑所使用的值斤贰,直到它們不會(huì)相互重疊為止〈窝”——CSS 背景與邊框(第三版)(http://w3.org/TR/css3-background/#corner-overlap)

不過(guò)荧恍,我們往往不愿意對(duì)一個(gè)元素指定固定的寬度和高度,因?yàn)槲覀兿M芨鶕?jù)其內(nèi)容自動(dòng)調(diào)整并適應(yīng)屯吊,而內(nèi)容的長(zhǎng)短不可能在事先就知道送巡。即使是在設(shè)計(jì)一個(gè)靜態(tài)網(wǎng)站的時(shí)候(元素的內(nèi)容可以預(yù)先確定),我們也可能需要在某個(gè)時(shí)刻改變其內(nèi)容盒卸;或者我們?yōu)樗鼫?zhǔn)備了一款尺寸略有差異的回退字體骗爆,而不同字體對(duì)相同內(nèi)容的渲染結(jié)果很可能是不同的。在這個(gè)案例中蔽介,我們通常期望達(dá)到這個(gè)效果:如果它的寬高相等摘投,就顯示為一個(gè)圓煮寡;如果寬高不等,就顯示為一個(gè)橢圓犀呼⌒宜海可是,我們前面的代碼并不能滿足這個(gè)期望外臂。當(dāng)寬度大于高度時(shí)坐儿,我們得到的形狀如圖1.2所示。那我們到底能不能用 border-radius 來(lái)產(chǎn)生一個(gè)橢圓宋光,甚至是一個(gè)自適應(yīng)的橢圓呢貌矿?


圖1.2在前面的圓形示例中,當(dāng)高度小于寬度時(shí)發(fā)生的情況罪佳;border-radius 所產(chǎn)生的圓形用虛線標(biāo)示逛漫。

解決方案:

說(shuō)到 border-radius,有一個(gè)鮮為人知的真相:它可以單獨(dú)指定水平和垂直半徑菇民,只要用一個(gè)斜杠(/)分隔這兩個(gè)值即可尽楔。這個(gè)特性允許我們?cè)诠战翘巹?chuàng)建橢圓圓角(參見(jiàn)圖1.3)。因此第练,如果我們有一個(gè)尺寸為 200px×150px 的元素,就可以把它圓角的兩個(gè)半徑值分別指定為元素寬高的一半玛荞,從而得到一個(gè)精確的橢圓:


圖1.3一個(gè)容器設(shè)置了不相等的水平和垂直 border-radius娇掏;拐角處的弧線現(xiàn)在呈現(xiàn)出橢圓的形狀,這個(gè)橢圓的水平和垂直半徑就是我們?yōu)?border-radius 指定的值勋眯,在圖中用虛線標(biāo)示婴梧。


圖1.4通過(guò)非對(duì)稱的 border-radius 曲線來(lái)創(chuàng)建一個(gè)橢圓。

我們可以在圖1.4中看到結(jié)果客蹋。但是塞蹭,這段代碼存在一個(gè)很大的缺陷:只要元素的尺寸發(fā)生變化,border-radius 的值就得跟著改讶坯。我們?cè)趫D3-5中可以看到番电,當(dāng)元素的尺寸變?yōu)?200px×300px 時(shí),如果 border-radius 沒(méi)有跟著改變辆琅,會(huì)發(fā)生什么后果漱办。因此,如果我們的元素尺寸會(huì)隨著它的內(nèi)容變化而變化婉烟,這就是一個(gè)問(wèn)題了娩井。難道我們真的走投無(wú)路了嗎?其實(shí)似袁,border-radius 這個(gè)屬性還有另外一個(gè)鮮為人知的真相洞辣,它不僅可以接受長(zhǎng)度值咐刨,還可以接受百分比值。這個(gè)百分比值會(huì)基于元素的尺寸進(jìn)行解析扬霜,即寬度用于水平半徑的解析所宰,而高度用于垂直半徑的解析。這意味著相同的百分比可能會(huì)計(jì)算出不同的水平和垂直半徑畜挥。因此仔粥,如果要?jiǎng)?chuàng)建一個(gè)自適應(yīng)的橢圓,我們可以把這兩個(gè)半徑值都設(shè)置為50%:


由于斜杠前后的兩個(gè)值現(xiàn)在是一致的(即使它們最終可能會(huì)被計(jì)算為不同的值)蟹但,我們可以把這行代碼進(jìn)一步簡(jiǎn)化為:


最終躯泰,只需要這一行代碼,我們就可以得到一個(gè)自適應(yīng)的橢圓了华糖。

擴(kuò)展:border-radius 的簡(jiǎn)寫方式


延伸一句代碼半橢圓:border-radius: 100% 0 0 100%/50%;即可形成如圖1.5所示的半橢圓


圖1.5

延伸一句代碼實(shí)現(xiàn)1/4橢圓:border-radius: 100% 0 0 0; 即可形成如圖1.6所示的1/4橢圓


圖1.6


小花絮:

為什么叫 border-radius麦向?可能有人會(huì)奇怪,border-radius 到底由何得名客叉。這個(gè)屬性并不需要邊框來(lái)參與工作诵竭,似乎把它叫作 corner-radius 更貼切一些。這個(gè)名字乍聽(tīng)起來(lái)確實(shí)讓人摸不著頭腦兼搏,其實(shí)原因在于 border-radius 是對(duì)元素 borderbox 進(jìn)行切圓角處理的卵慰。當(dāng)元素沒(méi)有邊框時(shí),可能還看不出差異佛呻;當(dāng)它有邊框時(shí)裳朋,則以邊框外側(cè)的拐角作為切圓角的基準(zhǔn)。邊框內(nèi)側(cè)的圓角會(huì)稍小一些(嚴(yán)格來(lái)說(shuō)內(nèi)角半徑將是 max(0,border-radius-border-width))吓著。


海說(shuō)軟件會(huì)持續(xù)推出前端教學(xué)課程鲤嫡、技術(shù)干貨。


-END-?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绑莺,一起剝皮案震驚了整個(gè)濱河市暖眼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纺裁,老刑警劉巖诫肠,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異对扶,居然都是意外死亡区赵,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門浪南,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)笼才,“玉大人,你說(shuō)我怎么就攤上這事络凿÷馑停” “怎么了昂羡?”我有些...
    開(kāi)封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)摔踱。 經(jīng)常有香客問(wèn)我虐先,道長(zhǎng),這世上最難降的妖魔是什么派敷? 我笑而不...
    開(kāi)封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任蛹批,我火速辦了婚禮,結(jié)果婚禮上篮愉,老公的妹妹穿的比我還像新娘腐芍。我一直安慰自己,他們只是感情好试躏,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布猪勇。 她就那樣靜靜地躺著,像睡著了一般颠蕴。 火紅的嫁衣襯著肌膚如雪泣刹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天犀被,我揣著相機(jī)與錄音椅您,去河邊找鬼。 笑死弱判,一個(gè)胖子當(dāng)著我的面吹牛襟沮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昌腰,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼膀跌!你這毒婦竟也來(lái)了遭商?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤捅伤,失蹤者是張志新(化名)和其女友劉穎劫流,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體丛忆,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祠汇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了熄诡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片可很。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖凰浮,靈堂內(nèi)的尸體忽然破棺而出我抠,到底是詐尸還是另有隱情苇本,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布菜拓,位于F島的核電站瓣窄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏纳鼎。R本人自食惡果不足惜俺夕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贱鄙。 院中可真熱鬧劝贸,春花似錦、人聲如沸贰逾。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疙剑。三九已至氯迂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間言缤,已是汗流浹背嚼蚀。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留管挟,地道東北人轿曙。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像僻孝,于是被迫代替她去往敵國(guó)和親导帝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344