当前位置主页 > 资料库 > 前端教程 > 深入理解CSS calc属性

深入理解CSS calc属性

12-08

在过去的几年时间里,前端WEB页面的布局已经从固定宽度演变为现在的响应式布局。本教程将带大家理解CSS calc属性,这是一个非常有用的属性,理解它的最好方法是举一些例子。

Example 1:垂直Margin(Vertical Flush Margins)

来看看下面的一张图片:图片中的瀑布图片被浮动起来,右边有2em

的margin。图片被制作为流式布局,宽度为它的父元素的50%。它的html结果如下:

css calc属性的应用-1

<img src="1.jpg" alt style="width:50%; margin-right: 2rem; float: left;"> 
<p>Det er et velkjent faktum...</p>
                            

现在,我们想要瀑布图片的margins沿着垂直方向延伸,现在的问题是 p 段落的文字最终会跑到图片的下方去。我们想要的效果如下图:

css calc属性的应用-2

解决的方法有很多种,我们这里要遵从下面的原则:跟随在图片后的 p 元素要有50%+2em的左margin。

我们在兄弟选择器上使用calc属性来解决这个问题:

img ~ p { margin-left: calc(50% + 2rem); }                               
                            

calc 允许我们融合不同的单位:百分比和rem,从而得到margin固定而图片是流式布局的效果。

Example 2:容器中的全屏宽度(Full-Width Elements In Padded Containers)

来看下面的例子:

HTML

<article>
    <header>
    <img src="fredvang.jpg" alt>
    </header>
    <p>......</p>
</article>                                
                            

CSS

 * { box-sizing: border-box; }
body { background: #000; font-family: Edelsans, sans-serif; line-height: 1.5; }
article { width: 80%; margin: 0 auto; background: #fff; padding: 0 2rem; color: #000; }
article header img { width: 100%; height: auto; }                               
                            

上面的代码得到的页面效果如下:

css calc属性的应用-3

这个设计的问题是给 article 元素的padding会作用在 header 上。使图片也一起被压缩了。

我们能通过在 header 元素上使用 calc 解决这个问题。

article header { width: calc(100% + 4rem); margin-left: -2rem; }                                
                            

通过在 head 上添加4rem的宽度来弥补左右两侧的2rem的padding。得到结果如下:

css calc属性的应用-4

操作符(Operations)

calc 可以做基本的数学运算:+、-、*、/。

有一点要记住, calc 在做加法和减法运算时,在它的操作符两侧必须有空格隔开并且 calc 必须紧贴着括号。例如:

下面的写法是正确的:

width: calc(20% - 1rem);                                
                            

下面的写法是错误的:

width: calc(20%-1rem);                               
                            

下面的写法也是错误的:

width: calc (20% - 1rem);                                                          
                            

如果书写错误,浏览器会将“-”号解释为“负值”。乘法和除法不需要添加空格,但是建议都加上空格。

浏览器支持和局限性

所有的现代浏览器都支持使用 calc 来计算长度。理论上,可以在任何地方使用这些 calc 计算,这将会 得到一些非常有趣的效果:

.box { background: rgba(255, 0, 0, calc(.3 * 2)); }                                
                            

css calc属性的应用-5

.box { transform: rotate(calc(45deg - 2.31rad)); }                               
                            

css calc属性的应用-6

如果你看到上面的两个方形分别是半透明和旋转一定角度的,那么祝贺你,你的浏览器支持不同声明的CSS calc 属性。大多数浏览器对这种极端情况都做了声明:

  • Chrome和Opera:支持所有的 calc ,但是Chrome 38 / Opera 25不支持角度计算。
  • Firefox:仅支持 calc 的长度和百分比计算。
  • Safari / Mobile Safari: calc 可以计算3D CSS transformsolor calculations 。但奇怪的是,它不支持2D transforms
  • Android 4.4:仅支持加法和减法运算,较早的版本完全不支持 calc
  • Chrome 38 on Android:和它的桌面版本支持是一样的。
  • Internet Explorer 9+:(desktop and mobile)支持长度计算。如果在IE9中使用calc来计算background-position,IE9将崩溃!

另外,绝大多数浏览器在使用calc时不需要添加厂商的前缀。

Previous:
上一篇:制作简单的masonry瀑布流图片布局
Next:
下一篇:浏览器原生Modernizr-在CSS中使用@supports
返回顶部