CSS3的calc()使用

姓名:岳沁? 學(xué)號:17101223458

轉(zhuǎn)載自:https://www.w3cplus.com/css3/how-to-use-css3-calc-function.html

【嵌牛導(dǎo)讀】:CSS3的calc()使用

【嵌牛鼻子】:CSS

【嵌牛提問】: calc()自適應(yīng)有哪些缺陷?

【嵌牛正文】:calc()對大家來說贴彼,或許很陌生底燎,不太會相信calc()是css中的部分。因?yàn)榭雌渫獗硐駛€函數(shù)扬霜,既然是函數(shù)為何又出現(xiàn)在CSS中呢囤采?這一點(diǎn)也讓我百思不得其解需曾,今天有一同事告訴我,說CSS3中有一個屬性能實(shí)現(xiàn)自適應(yīng)的布局菇晃,首先讓我想到的是box-sizing册倒,但跟我說還可以計(jì)算,這讓我不得不想起calc()磺送。因?yàn)樵缦仍诠倬W(wǎng)和一些blog上看到相關(guān)的介紹驻子,但一直沒有深入,也沒有自己去測試過估灿。今天花了一下午的時間徹底學(xué)習(xí)了一下calc()崇呵。于是就有了這篇blog,希望對大家有所幫助馅袁。

平時在制作頁面的時候域慷,總會碰到有的元素是100%的寬度。眾所周知汗销,如果元素寬度為100%時犹褒,其自身不帶其他盒模型屬性設(shè)置還好,要是有別的弛针,那將導(dǎo)致盒子撐破叠骑。比如說,有一個邊框削茁,或者說有margin和padding宙枷,這些都會讓你的盒子撐破。我們換句話來說茧跋,如果你的元素寬度是100%時慰丛,只要你在元素中添加了border,padding,margin任何一值,都將會把元素盒子撐破(標(biāo)準(zhǔn)模式下瘾杭,除IE怪異模式)诅病。這樣一來就會相當(dāng)?shù)穆闊綍r我們碰到這樣的現(xiàn)象時,也是相當(dāng)?shù)闹?jǐn)慎睬隶,有時甚至無法解決,只能通過改變結(jié)構(gòu)來實(shí)現(xiàn)页徐。就算你通過繁瑣的方法實(shí)現(xiàn)了苏潜,但有于瀏覽器的兼容性而導(dǎo)致最終效果不一致。雖然前面介紹的CSS3屬性中的box-sizing在一定程度上解決這樣的問題变勇,其實(shí)今天的calc()函數(shù)功能實(shí)現(xiàn)上面的效果來得更簡單恤左。

什么是calc()?

學(xué)習(xí)calc()之前,我們有必要先知道calc()是什么搀绣?只有知道了他是個什么東東飞袋?在實(shí)際運(yùn)用中更好的使用他。

calc()從字面我們可以把他理解為一個函數(shù)function链患。其實(shí)calc是英文單詞calculate(計(jì)算)的縮寫巧鸭,是css3的一個新增的功能,用來指定元素的長度麻捻。比如說纲仍,你可以使用calc()給元素的border、margin贸毕、pading郑叠、font-size和width等屬性設(shè)置動態(tài)值。為何說是動態(tài)值呢?因?yàn)槲覀兪褂玫谋磉_(dá)式來得到的值明棍。不過calc()最大的好處就是用在流體布局上乡革,可以通過calc()計(jì)算得到元素的寬度。

calc()能做什么摊腋?

calc()能讓你給元素的做計(jì)算沸版,你可以給一個div元素,使用百分比兴蒸、em推穷、px和rem單位值計(jì)算出其寬度或者高度,比如說“width:calc(50% + 2em)”类咧,這樣一來你就不用考慮元素DIV的寬度值到底是多少馒铃,而把這個煩人的任務(wù)交由瀏覽器去計(jì)算。

calc()語法

calc()語法非常簡單痕惋,就像我們小時候?qū)W加 (+)区宇、減(-)、乘(*)值戳、除(/)一樣议谷,使用數(shù)學(xué)表達(dá)式來表示:

.elm{width:calc(expression);}

其中"expression"是一個表達(dá)式,用來計(jì)算長度的表達(dá)式堕虹。

calc()的運(yùn)算規(guī)則

calc()使用通用的數(shù)學(xué)運(yùn)算規(guī)則卧晓,但是也提供更智能的功能:

使用“+”芬首、“-”、“*” 和 “/”四則運(yùn)算逼裆;

可以使用百分比郁稍、px、em胜宇、rem等單位耀怜;

可以混合使用各種單位進(jìn)行計(jì)算;

表達(dá)式中有“+”和“-”時桐愉,其前后必須要有空格财破,如"widht: calc(12%+5em)"這種沒有空格的寫法是錯誤的;

表達(dá)式中有“*”和“/”時从诲,其前后可以沒有空格左痢,但建議留有空格。

瀏覽器的兼容性

瀏覽器對calc()的兼容性還算不錯系洛,在IE9+抖锥、FF4.0+、Chrome19+碎罚、Safari6+都得到較好支持磅废,同樣需要在其前面加上各瀏覽器廠商的識別符,不過可惜的是荆烈,移動端的瀏覽器還沒僅有“firefox for android 14.0”支持拯勉,其他的全軍覆沒。

大家在實(shí)際使用時憔购,同樣需要添加瀏覽器的前綴

.elm {/*Firefox*/-moz-calc(expression);/*chrome safari*/-webkit-calc(expression);/*Standard */calc(); }

通過上面的了解宫峦,大家對calc()不在那么陌生,但對于實(shí)際的運(yùn)用可能還是不太了解玫鸟,那么大家就接下來跟我一起動手导绷,通過實(shí)例來了解他吧。首先我們來看一個最常用的實(shí)例:

上面的結(jié)構(gòu)很簡單屎飘,就是一個div.demo的元素中包含了一個div.box的元素妥曲,接下來我們一步一步來看其中的變化。

第一步:添加普通樣式:

.demo{width:300px;background:#60f;}.box{width:100%;background:#f60;height:50px;}

此時的效果很簡單钦购,就是div.box完全遮蓋了div.demo檐盟,如下圖所示:

第二步,在div.box上添加border和padding

這一步很棘手的事情來了押桃,在div.box上添加10px的內(nèi)距padding葵萎,同時添加5px的border:

.demo{width:300px;background:#60f;}.box{width:100%;background:#f60;height:50px;padding:10px;border:5px solid green;}

為了更好的說明問題,我在div.demo上添加了一個padding:3px 0;

.demo{width:300px;background:#60f;padding:3px0;}.box{width:100%;background:#f60;height:50px;padding:10px;border:5px solid green;}

這個時候大家不知道能否想到問題會發(fā)生在哪?其實(shí)很簡單羡忘,這個時候div.box的寬度大于了其容器div.demo的總寬度谎痢,從而撐破容器伸出來了,如圖所示:

第三步卷雕,calc()的運(yùn)用

為了解決撐破容器的問題节猿,以前我們只能去計(jì)算div.box的寬度,用容器寬度減去padding和border的值爽蝴,但有時候,我們苦于不知道元素的總寬度纫骑,比如說是自適應(yīng)的布局蝎亚,只知道一個百分值,但其他的值又是px之類的值先馆,這就是難點(diǎn)发框,死卡住了。隨著CSS3的出現(xiàn)煤墙,其中利用box-sizing來改變元素的盒模型類型實(shí)使實(shí)現(xiàn)效果梅惯,但今天我們學(xué)習(xí)的calc()方法更是方便。

知道總寬度是100%仿野,在這個基礎(chǔ)上減去boder的寬度(5px * 2 = 10px),在減去padding的寬度(10px * 2 = 20px)铣减,即"100% - (10px + 5px) * 2 = 30px" ,最終得到的值就是div.box的width值:

.demo{width:300px;background:#60f;padding:3px0;}.box{background:#f60;height:50px;padding:10px;border:5px solid green;width:90%;/*寫給不支持calc()的瀏覽器*/width:-moz-calc(100% - (10px +5px)*2);width:-webkit-calc(100% - (10px +5px)*2);width:calc(100% - (10px +5px)*2);}

這樣一來脚作,通過calc()計(jì)算后葫哗,div.box不在會超出其容器div.demo的寬度,如圖所示:

上面是一個簡單的實(shí)例球涛,接下來我們一起來看一個自適應(yīng)布局的例子:

上面的demo是一個非常簡單而常見的布局效果劣针,在這個布局中,我采用了自適應(yīng)布局亿扁。整個布局包含了“頭部”捺典、“主內(nèi)容”、“邊欄”和“腳部”从祝,并且“主內(nèi)容”居左襟己,“邊欄”靠右,具體結(jié)構(gòu)請看DEMO中的html部分牍陌。

接下來稀蟋,我們主要看看css部分:

1、在body中設(shè)置一個內(nèi)距呐赡,并附上一些基本的樣式退客,大家可以根據(jù)自己需要進(jìn)行不同的設(shè)置,此例代碼如下:

body{background:#E8EADD;color:#3C323A;padding:20px;}

2、設(shè)置主容器“wrapper”的樣式

主容器的寬度是“100% - 20px * 2”,并且水平居中:

.wrapper{width:1024px;/* Fallback for browsers that don't support the calc() function */width:-moz-calc(100% -40px);width:-webkit-calc(100% -40px);width:calc(100% -40px);margin:auto;}

給不支持calc()的瀏覽器設(shè)置了一個固定寬度值“1024px”萌狂。

3档玻、給header和footer設(shè)置樣式

這個例子中的header和footer很簡單,給他們添加了一個內(nèi)距為20px茫藏,其他就是一些基本的樣式設(shè)置误趴,那么其對應(yīng)的寬度應(yīng)該是"100% - 20px * 2":

#header{background:#f60;padding:20px;width:984px;/*Fallback for browsers that don't support the calc() function*/width:-moz-calc(100% -40px);width:-webkit-calc(100% -40px);width:calc(100% -40px);}#footer{clear:both;background:#000;padding:20px;color:#fff;width:984px;/* Fallback for browsers that don't support the calc() function */width:-moz-calc(100% -40px);width:-webkit-calc(100% -40px);width:calc(100% -40px);}

4、給主內(nèi)容設(shè)置樣式

給主內(nèi)容設(shè)置了一個8px的邊框务傲,20px的內(nèi)距凉当,并且向左浮動,同時設(shè)置了一個向右的外邊距“20”px售葡,關(guān)鍵之處看杭,我們主內(nèi)容占容器寬度的75%,這樣一來挟伙,主內(nèi)容的寬度應(yīng)該是“75% - 8px * 2 - 20px * 2”:

#main{border:8px solid#B8C172;float:left;margin-bottom:20px;margin-right:20px;padding:20px;width:704px;/* Fallback for browsers that don't support the calc() function */width:-moz-calc(75% -20px *2-8px *2);width:-webkit-calc(75% -20px *2-8px *2);width:calc(75% -20px *2-8px *2);}

4楼雹、設(shè)置右邊欄樣式

給邊欄設(shè)置了一個25%的寬度,其除了包含8px的邊框尖阔,10px的內(nèi)距外贮缅,還有主內(nèi)容外距20px也要去掉,不然整個寬度與容器會相差20px,換句話說就會撐破容器掉下來介却。因此邊欄的實(shí)際寬度應(yīng)該是"25% - 10px * 2 - 8px * 2 -20px":

#accessory{border:8px solid#B8C172;float:right;padding:10px;width:208px;/* Fallback for browsers that don't support the calc() function */width:-moz-calc(25% -10px *2-8px *2-20px);width:-webkit-calc(25% -10px *2-8px *2-20px);width:calc(25% -10px *2-8px *2-20px);}

這樣一來谴供,大家就看到了上面demo展現(xiàn)的布局效果。經(jīng)過此例的學(xué)習(xí)齿坷,大家是不是會覺得使用calc()用于自適應(yīng)布局是超爽的呀憔鬼。此時有很多同學(xué)肯定會感吧,苦逼的IE6-8不支持胃夏,不敢使用轴或。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市仰禀,隨后出現(xiàn)的幾起案子照雁,更是在濱河造成了極大的恐慌,老刑警劉巖答恶,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饺蚊,死亡現(xiàn)場離奇詭異,居然都是意外死亡悬嗓,警方通過查閱死者的電腦和手機(jī)污呼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來包竹,“玉大人燕酷,你說我怎么就攤上這事籍凝。” “怎么了苗缩?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵饵蒂,是天一觀的道長。 經(jīng)常有香客問我酱讶,道長退盯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任泻肯,我火速辦了婚禮渊迁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘灶挟。我一直安慰自己琉朽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布膏萧。 她就那樣靜靜地躺著漓骚,像睡著了一般蝌衔。 火紅的嫁衣襯著肌膚如雪榛泛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天噩斟,我揣著相機(jī)與錄音曹锨,去河邊找鬼。 笑死剃允,一個胖子當(dāng)著我的面吹牛沛简,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斥废,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼椒楣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了牡肉?” 一聲冷哼從身側(cè)響起捧灰,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎统锤,沒想到半個月后毛俏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饲窿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年煌寇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逾雄。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡阀溶,死狀恐怖腻脏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情淌哟,我是刑警寧澤迹卢,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站徒仓,受9級特大地震影響腐碱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掉弛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一症见、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧殃饿,春花似錦谋作、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奈惑,卻和暖如春吭净,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肴甸。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工寂殉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人原在。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓友扰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親庶柿。 傳聞我的和親對象是個殘疾皇子村怪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

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

  • 摘自http://www.w3cplus.com/css3/how-to-use-css3-calc-functi...
    Lareina林暖暖閱讀 775評論 0 0
  • 什么是calc()? 學(xué)習(xí)calc()之前,我們有必要先知道calc()是什么浮庐?只有知道了他是個什么東東甚负?在實(shí)際運(yùn)...
    ddai_Q閱讀 399評論 0 1
  • 1、垂直對齊 如果你用CSS兔辅,則你會有困惑:我該怎么垂直對齊容器中的元素腊敲?現(xiàn)在,利用CSS3的Transform维苔,...
    kiddings閱讀 3,150評論 0 11
  • 心里很痛碰辅,剛寫了那么多筆記斷電了,全沒了介时, 1 總結(jié)一下算了没宾,選中單元格在里面輸入數(shù)字凌彬,日期或者序號等,將鼠標(biāo)移動...
    小生活大happy閱讀 132評論 0 0
  • 大家好循衰,給這個是上海傳美有限公司出品的化妝品《三草兩木》 三草兩木是我接觸的第3個產(chǎn)品铲敛,之前有用過其它,多覺得不合...
    八戒豬豬豬閱讀 216評論 0 0