什么是calc()?
學(xué)習(xí)calc()之前,我們有必要先知道calc()是什么?只有知道了他是個(gè)什么東東?在實(shí)際運(yùn)用中更好的使用他。
calc()從字面我們可以把他理解為一個(gè)函數(shù)function。其實(shí)calc是英文單詞calculate(計(jì)算)的縮寫(xiě),是css3的一個(gè)新增的功能,用來(lái)指定元素的長(zhǎng)度。比如說(shuō),你可以使用calc()給元素的border、margin、pading、font-size和width等屬性設(shè)置動(dòng)態(tài)值。為何說(shuō)是動(dòng)態(tài)值呢?因?yàn)槲覀兪褂玫谋磉_(dá)式來(lái)得到的值。不過(guò)calc()最大的好處就是用在流體布局上,可以通過(guò)calc()計(jì)算得到元素的寬度。
calc()能做什么?
calc()能讓你給元素的做計(jì)算,你可以給一個(gè)div元素,使用百分比、em、px和rem單位值計(jì)算出其寬度或者高度,比如說(shuō)“width:calc(50% + 2em)”,這樣一來(lái)你就不用考慮元素DIV的寬度值到底是多少,而把這個(gè)煩人的任務(wù)交由瀏覽器去計(jì)算。
calc()語(yǔ)法
calc()語(yǔ)法非常簡(jiǎn)單,就像我們小時(shí)候?qū)W加 (+)、減(-)、乘(*)、除(/)一樣,使用數(shù)學(xué)表達(dá)式來(lái)表示:
.elm { width: calc(expression);}
其中"expression"是一個(gè)表達(dá)式,用來(lái)計(jì)算長(zhǎng)度的表達(dá)式。
calc()的運(yùn)算規(guī)則
calc()使用通用的數(shù)學(xué)運(yùn)算規(guī)則,但是也提供更智能的功能:
使用“+”、“-”、“” 和 “/”四則運(yùn)算;
可以使用百分比、px、em、rem等單位;
可以混合使用各種單位進(jìn)行計(jì)算;
表達(dá)式中有“+”和“-”時(shí),其前后必須要有空格,如"widht: calc(12%+5em)"這種沒(méi)有空格的寫(xiě)法是錯(cuò)誤的;
表達(dá)式中有“”和“/”時(shí),其前后可以沒(méi)有空格,但建議留有空格。
瀏覽器的兼容性
具體參見(jiàn):http://caniuse.com/#search=calc
瀏覽器對(duì)calc()的兼容性還算不錯(cuò),在IE9+、FF4.0+、Chrome19+、Safari6+都得到較好支持,同樣需要在其前面加上各瀏覽器廠商的識(shí)別符,不過(guò)可惜的是,移動(dòng)端的瀏覽器還沒(méi)僅有“firefox for android 14.0”支持,其他的全軍覆沒(méi)。
大家在實(shí)際使用時(shí),同樣需要添加瀏覽器的前綴
.elm {
/*Firefox*/ -moz-calc(expression);
/*chrome safari*/ -webkit-calc(expression);
/*Standard */ calc();
}
通過(guò)上面的了解,大家對(duì)calc()不在那么陌生,但對(duì)于實(shí)際的運(yùn)用可能還是不太了解,那么大家就接下來(lái)跟我一起動(dòng)手,通過(guò)實(shí)例來(lái)了解他吧。首先我們來(lái)看一個(gè)最常用的實(shí)例:
<div class="demo"> <div class="box"></div></div>
上面的結(jié)構(gòu)很簡(jiǎn)單,就是一個(gè)div.demo的元素中包含了一個(gè)div.box的元素,接下來(lái)我們一步一步來(lái)看其中的變化。
第一步:添加普通樣式:
.demo { width: 300px; background: #60f;}
.box { width: 100%; background: #f60; height: 50px;}
此時(shí)的效果很簡(jiǎn)單,就是div.box完全遮蓋了div.demo,如下圖所示:
第二步,在div.box上添加border和padding
這一步很棘手的事情來(lái)了,在div.box上添加10px的內(nèi)距padding,同時(shí)添加5px的border:
.demo { width: 300px; background: #60f;}
.box { width: 100%; background: #f60; height: 50px;padding: 10px; border: 5px solid green;}
為了更好的說(shuō)明問(wèn)題,我在div.demo上添加了一個(gè)padding:3px 0;
.demo { width: 300px; background: #60f;padding: 3px 0; }.box { width: 100%; background: #f60; height: 50px; padding: 10px; border: 5px solid green;}
這個(gè)時(shí)候大家不知道能否想到問(wèn)題會(huì)發(fā)生在哪?其實(shí)很簡(jiǎn)單,這個(gè)時(shí)候div.box的寬度大于了其容器div.demo的總寬度,從而撐破容器伸出來(lái)了,如圖所示:
第三步,calc()的運(yùn)用
為了解決撐破容器的問(wèn)題,以前我們只能去計(jì)算div.box的寬度,用容器寬度減去padding和border的值,但有時(shí)候,我們苦于不知道元素的總寬度,比如說(shuō)是自適應(yīng)的布局,只知道一個(gè)百分值,但其他的值又是px之類(lèi)的值,這就是難點(diǎn),死卡住了。隨著CSS3的出現(xiàn),其中利用box-sizing來(lái)改變?cè)氐暮心P皖?lèi)型實(shí)使實(shí)現(xiàn)效果,但今天我們學(xué)習(xí)的calc()方法更是方便。
知道總寬度是100%,在這個(gè)基礎(chǔ)上減去boder的寬度(5px * 2 = 10px),在減去padding的寬度(10px * 2 = 20px),即"100% - (10px + 5px) * 2 = 30px" ,最終得到的值就是div.box的width值:
.demo { width: 300px; background: #60f; padding: 3px 0;}
.box { background: #f60; height: 50px; padding: 10px; border: 5px solid green;**width: 90%;/*寫(xiě)給不支持calc()的瀏覽器*/ width:-moz-calc(100% - (10px + 5px) * 2); width:-webkit-calc(100% - (10px + 5px) * 2); width: calc(100% - (10px + 5px) * 2);**}
這樣一來(lái),通過(guò)calc()計(jì)算后,div.box不在會(huì)超出其容器div.demo的寬度,如圖所示:
轉(zhuǎn)載出處:http://www.w3cplus.com/css3/how-to-use-css3-calc-function.html