Calc 在CSS3中的使用

在制作頁面的時候,總會碰到有的元素是100%的寬度。如果元素寬度為100%時,其自身不帶其他盒模型屬性設(shè)置還好,要是有別的,那將導(dǎo)致盒子撐破。

比如說,有一個邊框,或者說有margin和padding,這些都會讓你的盒子撐破。我們換句話來說,如果你的元素寬度是100%時,只要你在元素中添加了border,padding,margin任何一值,都將會把元素盒子撐破(標(biāo)準(zhǔn)模式下,除IE怪異模式)。

calc簡介

calc()函數(shù)功能實現(xiàn)上面的效果來得更簡單。calc是英文單詞calculate(計算)的縮寫,是css3的一個新增的功能,用來指定元素的長度。比如說,你可以使用calc()給元素的border、margin、pading、font-size和width等屬性設(shè)置動態(tài)值。為何說是動態(tài)值呢?因為我們使用的表達式來得到的值。不過calc()最大的好處就是用在流體布局上,可以通過calc()計算得到元素的寬度。calc()能讓你給元素的做計算,你可以給一個div元素,使用百分比、em、px和rem單位值計算出其寬度或者高度。

calc使用

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

.elm {
  width: calc(expression);
}

其中"expression"是一個表達式,用來計算長度的表達式。

calc()的運算規(guī)則

  • calc()使用通用的數(shù)學(xué)運算規(guī)則;
  • 使用"+"、"-"、"*" 和 "/"四則運算
  • 可以使用百分比、px、em、rem等單位
  • 可以混合使用各種單位進行計算
  • 表達式中有"+"和“-”時,其前后必須要有空格
  • 表達式中有“*”和“/”時,其前后可以沒有空格,但建議留有空格

例子

一個容器

<div class="demo">
     <div class="box"></div>
</div>  

添加樣式

.demo {
    width: 300px;
    background: #60f;
}
.box {
  width: 100%;
    background: #f60;
    height: 50px;
}
css3-calc-1.jpg

添加padding和border

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

css3-calc-2.jpg

這個時候div.box的寬度大于了其容器div.demo的總寬度,從而撐破容器伸出來了。

使用calc解決問題

為了解決撐破容器的問題,以前我們只能去計算div.box的寬度,用容器寬度減去padding和border的值,但有時候,我們苦于不知道元素的總寬度,比如說是自適應(yīng)的布局,只知道一個百分值,但其他的值又是px之類的值,這就是難點,死卡住了。隨著CSS3的出現(xiàn),其中利用box-sizing來改變元素的盒模型類型實使實現(xiàn)效果,使用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: 3px 0;
}
.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);
}

css3-calc-3.jpg

這樣一來,通過calc()計算后,div.box不在會超出其容器div.demo的寬度

另外一個例子

css3-calc-4.png
<ul id="testTube"/>
  <li id="ingredients01">10%</li>
  <li id="ingredients02">20%</li>
  <li id="ingredients03">30%</li>
  <li id="ingredients04">40%</li>
</ul>

ul#testTube {
  width:100px;
  height:300px;
  list-style:none;
  border-radius: 0 0 100px 100px;
  border: 1px solid #033a52;
}
li#ingredients01 {
  background-color: #4dbded;
}
li#ingredients02 {
  background-color: #2f9bc9;
}
li#ingredients03 {
  background-color: #136182;
}
li#ingredients04 {
  background-color: #033a52;
  border-radius: 0 0 100px 100px;
}
li#ingredients04 {
  height: -moz-calc(300px/2 - 30px);
  height: -webkit-calc(300px/2 - 30px);
  height: calc(300px/2 - 30px);    
/* Gesamtwert von 120px entspricht 40% der Füllmenge */
}
li#ingredients03 {
  height: -moz-calc(300px/10 + 60px);
  height: -webkit-calc(300px/10 + 60px);
  height: calc(300px/10 + 60px);
/* Gesamtwert von 90px entspricht 30% der Füllmenge */
}
li#ingredients02 {
  height: -moz-calc(300px/10*2);
  height: -webkit-calc(300px/10*2);
  height: calc(300px/10*2);    
/* Gesamtwert von 60px entspricht 20% der Füllmenge */
}
li#ingredients01 {
  height: -moz-calc(300px/10);
  height: -webkit-calc(300px/10);
  height: calc(300px/10);    
/* Gesamtwert von 30px entspricht 10% der Füllmenge */
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補...
    _Yfling閱讀 14,152評論 1 92
  • 摘自http://www.w3cplus.com/css3/how-to-use-css3-calc-functi...
    Lareina林暖暖閱讀 813評論 0 0
  • H5移動端知識點總結(jié) 閱讀目錄 移動開發(fā)基本知識點 calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇閱讀 4,829評論 0 26
  • 什么是calc()? 學(xué)習(xí)calc()之前,我們有必要先知道calc()是什么?只有知道了他是個什么東東?在實際運...
    ddai_Q閱讀 443評論 0 1
  • 移動開發(fā)基本知識點 一.使用rem作為單位 html { font-size: 100px; } @media(m...
    橫沖直撞666閱讀 3,725評論 0 6

友情鏈接更多精彩內(nèi)容