calc()制作自适应布局

本文由大漠根据Osvaldas Valutis的《Imitating calc() Fallback or Fixed-Width Sidebar In Responsive Layout》所译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://osvaldas.info/imitating-calc-fallback-fixed-width-sidebar-in-responsive-layout,以及作者相关信息

——作者:Osvaldas Valutis

——译者:大漠

处理CSS的浏览器兼容性和解决技术问题才能尽显前端开发人员真正的魅力。没有项目可做的情况之下,我终于有了一次机会使用cale()函数的经验。

使用calc(),您可以通过计算来确定CSS属性值。

如果你还从未接触过calc(),你可以通过阅读《CSS3的calc()使用》一文来了解有关于calc()的基础知识——大漠

我想你可能知道,我也知道你已经看到这些例子,甚至在首页尝试使用过:

div{
    width: calc( 100% - 2.5em );
    background-position: calc( 50% + 50px );
    margin: calc( 1.25rem - 5px );
}

正如你所看到的,编写calc()需要一个更高的CSS水平。它是如此强大,前端开发人员不知道如何处理它。现在主流的浏览器(Android4.4)都支持这功能

明智的做法就是开始使用它。

情况

想象一上这种标准,是多么的痛苦:主内容和侧边栏通过浮动并列在一起,两者之间有一个间距。

通常有一个容器包含了两个div,并且设置样式:

HTML

<div class="container">
    <div class="content">Content</div>
    <div class="sidebar">Sidebar</div>
</div>

CSS

.container:after,
.container:before {
  content:"";
  display: table;
}
.container:after {
  clear:both;
  overflow: hidden;
}
.container {
  zoom:1;
}
.container,
.content,
.sidebar{
  box-sizing: border-box;
  color: #fff;
}
.container{
  width: 100%;
  max-width: 80em; /* 1280 */
  padding: 2.5em; /* 40 */
  background: #eee;
}
.content,
.sidebar {
  padding:10em 1.25em;
}
.content{
  width: 80%; /* 960 */
  float: left;
  background: #8ac233;
}
.sidebar{
  width: 16.666%; /* 200 */
  float: right;
  background: #8ac233;
}

@media only screen and (max-width: 40em) /* 640 */{
  .content,
  .sidebar{
     width: 100%;
     float: none;
  }
  .sidebar{
     margin-top: 1.25em; /* 20 */
  }
}

看起来像一个完美的响应式布局和什么都没有添加,但是...

问题

在我们的布局中有一个初始的小的侧栏和宽的内容区域。因此,当调整视窗大小,侧边栏很快变得紧紧的。当侧边栏太狭窄的时候我们应该做什么,过早移动内容?

解决方案

通过calc()函数计算宽度,并给不支持calc的浏览器提供一个后备方案,就是固定宽度。通过给.content.sidebar两个类上做一个小小的修改,将会改变你的一切:

.content{
  width: 80%; /* 960 */
  width: calc( 100% - 15em ); /* 240 */
  float: left;
  background: #8ac233;
}
.sidebar{
  width: 16.666%; /* 200 */
  width: calc( 12.5em ); /* 200 */
  float: right;
  background: #8ac233;
}

如果你细心的话,你应该看到多添加了一行width:calc(12.5em),这就是技巧。为什么?让我们看看这些宽度都是成对——下在我们浏览器需要的。

第一对是width:80%(主内容)和width:16.666%(侧边栏),不支持calc()的浏览器将会无视calc()。这是用来做备份的。这意味着少数访问者访问网站看到窄的侧边栏。对于使用旧的浏览版本的人应该是完美的。

第二对是:width:calc(100% - 15em)width: calc(12.5em)。这是用于新的浏览器版本,这将会覆盖前面定义的固定宽度。有几个方面需要作个解释:

  • 主内容:calc(100% - 15em)= 100% - 侧边栏宽度 - 间距宽度。除了计算主内容元素的宽度,也要确保侧栏和主内容之间的间距总是等于2.5em(40px)。这样就完美。
  • 侧边栏:calc(12.5em)。可能有人会问,这里括号要添加空格吗?这是一个欺骗浏览器的伎俩。我把这称作为“模仿calc()备份”,但实际上它是不用也可括号也可以。

到了演示时间!我做了一个按钮开关来控制calc(),你可以试试:

demo

还有一件事

就像其他的一些CSS特性,calc()还是一个实验属性,在特定的浏览器下还需要添加特定的前缀。让更多的浏览器得到支持:

.content{
  width: 80%; /* 960 */
  width: -webkit-calc( 100% - 15em ); /* 240 */
  width: calc( 100% - 15em ); /* 240 */
  float: left;
  background: #8ac233;
}
.sidebar{
  width: 16.666%; /* 200 */
  width: -webkit-calc(12.5em); /* 200 */
  width: calc(12.5em); /* 200 */
  float: right;
  background: #8ac233;
}

有一种情况不能使用calc(),这是通过CSS的position属性。然而,如果侧边栏高于内容区域,整个布局会失败(这是你不希望看到的)。

通过一个简单的示例,向大家演示了如何使用CSS的calc()属性,给元素设置表达式,通过浏览器自身去计算需要的值。从而达到完美的自适应效果。

译者手语:整个翻译依照原文线路进行,并在翻译过程略加了个人对技术的理解。如果翻译有不对之处,还烦请同行朋友指点。谢谢!

如需转载,烦请注明出处:

英文原文:http://osvaldas.info/imitating-calc-fallback-fixed-width-sidebar-in-responsive-layout

中文译文:http://www.w3cplus.com/css3/imitating-calc-fallback-fixed-width-sidebar-in-responsive-layout.html

时间: 2024-10-19 13:12:47

calc()制作自适应布局的相关文章

关于使用rem单位,calc()进行自适应布局

关于css中的单位 大家都知道在css中的单位,一般都包括有px,%,em等单位,另外css3新增加一个单位rem. 其中px,%等单位平时在传统布局当中使用的比较频繁,大家也比较熟悉,不过px单位在进行自适应布局的过程当中则会有些力不从心,大部分的解决方案是使用%为单位配合@media媒介查询来进行自适应布局.不过还有另外一个css3新添加的单位也同样可以拿来进行自适应布局,在我看来这种方法也更加方便直观. em和rem 首先先介绍一下em,这个单位是根据其父元素的字体大小来进行计算的,即1e

关于使用rem单位、css函数calc()进行自适应布局

一.关于css中的单位 大家都知道在css中的单位,一般都包括有px,%,em等单位,另外css3新增加一个单位rem. 其中px,%等单位平时在传统布局当中使用的比较频繁,大家也比较熟悉,不过px单位在进行自适应布局的过程当中则会有些力不从心,大部分的解决方案是使用%为单位配合@media媒介查询来进行自适应布局. 不过还有另外一个css3新添加的单位也同样可以拿来进行自适应布局,在我看来这种方法也更加方便直观. 1.em和rem 首先先介绍一下em,这个单位是根据其父元素的字体大小来进行计算

处理移动端自适应布局的方法- calc()与vw

在处理移动端自适应布局时,目前前端最流行的方法应该就是使用媒体查询,来设置HTML的字体大小,然后用rem为单位对Dom的宽高进行设置,这个方法的优势在于兼容性方面很好,劣势则在于当前市场上不同的机型太多,尺寸种类比较杂,所以要想做到所以尺寸机型都能适应,工作量相对比较大.目前也有人会选择用百分比进行布局,这个布局方法在仅仅处理元素的宽高上面非常好用,但是当js中要对dom元素的尺寸进行设置时,百分比的局限性就出来了,还有就是dom元素的font-size没办法用页面宽度百分比对他进行大小设置,

css3 calc()属性介绍以及自适应布局使用方法

前端知识 Calc()介绍 calc的英文是calculate的缩写,中文为计算的意思,是css3的一个新增的功能,用来只当元素的长度.比如说:你可以用calc()给元素margin.padding.border.font-size和width等属性设置动态值.为什么说是动态值呢?因为我们是使用来表示得到的值.不过calc()最大的好处就是用在流体布局上,可以通过calc()计算得到元素的宽度. Calc()的用处 calc()能让你给元素的做计算,你可以给一个div元素,使用百分比.em.px

如何制作自适应网站

自适应网站已经成为现互联网时代的主流网站,自适应网页布局的改革,让网站焕然一新,赋予了网站新的活力与更精美的展现.今天给大家讲下如何利用建站宝盒制作自适应网站. 建站流程:模板设置>基本资料>网站栏目>编辑内容>发布网站>推广网站 1.   进入界面 2.   选择网站模板,安装模板 3.   编辑网站 双击栏目,更改内容 点击首页,可以管理更改网站所有内容栏目 4.编辑完成,进行发布 程序代码的建站者而言,使用建站宝盒进行网站建设是一个不错的选择,操作简单方便,无需懂程序编

两列布局中单列定宽单列自适应布局的5种思路

× 目录 [1]float [2]inline-block [3]table[4]absolute[5]flex 前面的话 说起自适应布局方式,单列定宽单列自适应布局是最基本的布局形式.本文将从float.inline-block.table.absolute和flex这五种思路来详细说明如何巧妙地实现布局 思路一: float 说起两列布局,最常见的就是使用float来实现.float浮动布局的缺点是浮动后会造成文本环绕等效果,以及需要及时清除浮动.如果各浮动元素的高度不同时,可能会出犬牙交错

为iPhone 6设计自适应布局

Apple从iOS 6加入了Auto Layout后开始就比较委婉的开始鼓励.建议开发者使用自适应布局,但是到目前为止,我感觉大多数开发者一直在回避这个问题,不管是不是由于历史原因造成的,至少他们在心底还坚守着固定布局的老传统思想. 随着iPhone6.iPhone6 Plus的到来,使用自适应布局更是迫在眉睫的事,固定布局的老传统思想脆弱的不堪一击.现在的iPhone有4种尺寸,如果算上iPad,现在Apple的iOS设备有5种尺寸.我们在准备使用自适应布局设计应用界面之前,可以把这5种尺寸划

中间定宽,两边自适应布局的三种实现方法

中间定宽,两边自适应布局的三种实现方法 1. 浮动加定位 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>中间定宽,两边自适应</title> <style type="text/css"> html,body,div{ height: 100%; } .parent{ p

为iPhone 6设计自适应布局(iOS8)

Apple从iOS 6加入了Auto Layout后开始就比较委婉的开始鼓励.建议开发者使用自适应布局,但是到目前为止,我感觉大多数开发者一直在回避这个问题,不管是不是由于历史原因造成的,至少他们在心底还坚守着固定布局的老传统思想. 随着iPhone6.iPhone6 Plus的到来,使用自适应布局更是迫在眉睫的事,固定布局的老传统思想脆弱的不堪一击.现在的iPhone有4种尺寸,如果算上iPad,现在Apple的iOS设备有5种尺寸.我们在准备使用自适应布局设计应用界面之前,可以把这5种尺寸划