calc()实现满屏背景定宽内容

所属分类: 网页制作 / CSS 阅读数: 907
收藏 0 赞 0 分享

在过去的几年间,有一种网页设计手法逐渐流行起来,我将它称作背景宽度满屏,内容宽度固定。这个设计的一些典型特征如下。

页面中包含多个大区块,每个区块都占据了整个视口的宽度,区块的背景也各不相同。

内容是定宽的,即使在不同分辨率下的宽度不一样,那也只是因为媒体查询改变了这个固定的宽度值而已。在某些情况下,不同区块的内容也可能具有不同的宽度。

有时候,整个网页都是由这种风格的多个区块组成的满屏背景的定宽内容。不过在更多的情况下,页面中只有某个特定区域是以这个风格来设计的,最典型的就是导航或页脚。

要实现这种设计风格,最常见的方法就是为每个区块准备两层元素:外层用来实现满屏的背景,内层用来实现定宽的内容。后者是通过 margin: auto实现水平居中的。举例来说,采用这种设计的页脚通常需要把结构代码写成:

<footer>
<div class="wrapper">
<!-- 页脚的内容写在这里 -->
</div>
</footer>

同时用 CSS 来设置这两层元素的样式:

footer {
background: #333;
}
.wrapper {
max-width: 900px;
margin: 1em auto;
}

看起来很眼熟对不对?目前绝大多数的前端工程师都是这样写的。难道为了这个效果就一定要添加一层额外的元素?我们能否在现代 CSS的帮助下彻底抛弃这个累赘?

我们先来想一想,margin: auto 在这个场景下到底发挥了什么作用。这条声明所产生的左右外边距实际上都等于视口宽度的一半减去内容宽度的一半。由于百分比在这里是基于视口宽度来解析的(假设所有祖先元素都没有显式指定宽度),我们可以把这个外边距的值表达为 50% – 450px。幸好CSS3定义了这样一个 calc() 函数,它允许我们在 CSS 中直接以这种简单的算式来指定属性的值。如果用 calc() 取代原先的 auto,这个内层容器的样式就会变成:

.wrapper {
max-width: 900px;
margin: 1em calc(50% - 450px);
}

之所以要在页脚内加一层容器元素,唯一的原因就是为了给它的margin 指定神奇的 auto 关键字,从而实现内容的水平居中布局。不过,现在我们已经用 calc() 替代了这个神奇的 auto,而且这个新值实际上可以作为一个通用的 CSS 长度值应用到任何一个接受长度值的属性上。这意味着如果我们愿意,还可以把这个长度值应用到父元素的 padding 上,而整个效果是保持不变的:

footer {
max-width: 900px;
padding: 1em calc(50% - 450px);
background: #333;
}
.wrapper {}

经过这一番改造之后,我们已经把内层容器上的所有 CSS代码都剥离干净了。也就是说,它其实已经不需要参与布局了,我们可以安全地把它从结构代码中去掉。终于,我们在纯净无冗余的 HTML 结构上实现了想要的设计风格。这个方案还有进一步优化的空间吗?没错。你要相信,追求卓越的道路是永无止境的!

如果把 width 这一行声明注释掉,你会发现其实没有影响。视觉效果是完全一样的,而且不论视口尺寸如何变化都是如此。这是为什么呢?因为当内边距是 50% – 450px 时,只可能给内容留出 900px(2×450px)的可用空间。只有把 width 显式地设置为 900px 之外(或大或小)的其他值,我们才有可能看出区别。由于我们想要得到的内容宽度本来就是 900px,这一行声明其实就是冗余的,我们可以把它去掉,让代码更加简洁。

另一个可以优化的地方在于,我们可以增加一条回退样式来增强向后兼容性。这样即使浏览器不支持 calc(),我们也至少可以得到一个相对合理的内边距:

footer {
padding: 1em;
padding: 1em calc(50% - 450px);
background: #333;
}

终于大功告成了。我们抛弃了冗余的标签,花费了三行 CSS 代码,最终达成了这个完美的结果:样式灵活、代码简练,还具有良好的兼容性!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

CSS配合JavaScript做酷的动态页面效果

  利用CSS配合JavaScript的可以做很多更酷的动态页面效果,在本教程的最后给大家简单介绍一下CSS配合JS的应用。首先,要搞清楚事件和动作的概念。在客户端脚本中,JavaScript 通过对事件进行响应来获得与用户的交互。例如,当用户单击一个按钮或者在某段文字上移动鼠标
收藏 0 赞 0 分享

WEB标准,Web前端开发工程师必备技术列表

  想要打造并拥有一流的Web产品开发团队,在团队成员基础能力上一定要下功夫。对于Web前端产品开发来说,仅仅掌握Web1.0时代简单的"网页套接"是完全不够的。我结合自己的团队配备,特此罗列了Web前端产品工程师所涉及的技能列表如下:   通过许多实际项目,
收藏 0 赞 0 分享

用CSS制作Alpha滤镜测试板

alpha滤镜给制作网页特效提供了较大的创作空间,但由于它控制参数较多,在实际应用时,为了确定一组合适的参数值,不得不反复调整修改,在编辑窗口和预览窗口来回倒腾,甚是麻烦,本文介绍了一种简单的方法。制作一个“Alpha滤镜参数测试板”,在测试板上输入参数
收藏 0 赞 0 分享

非常流行的所谓的气泡窗口

普通的Alt无法自定义风格,而Sweet Titles通过JS脚本与CSS的集合.自定义了这种伪Alt风格. 前一段时间非常流行的,就所谓的气泡窗口(鼠标移到链接处出现的). 我们这里实现的用的是Sweet Titles的插件.显示效果完全由CSS控制.. 先下载Sweet Ti
收藏 0 赞 0 分享

CSS教程:li和ul标签用法举例

LI代码的格式化: A).运用CSS格式化列表符: ul li{ list-style-type:none; } B).如果你想将列表符换成图像,则: ul li{ list-style-type:none; list-style-image: url(/blog/images/
收藏 0 赞 0 分享

CSS教程:CSS中的定位(position)

  使用CSS来定位页面内层的位置,一直是比较难以掌握的事情,很多时候,往往被绝对定位的元素,总是以浏览器的左上角为坐标原点,此时,如果浏览器的大小改变,被定义的层就会偏离设计想要的位置,让人很挠头。   其实,要想控制好层的绝对定位,只要理解CSS中关于定位
收藏 0 赞 0 分享

CSS教程:盒模型(BOX Model)

  如果想熟练掌握DIV和CSS的布局方法,首先要对盒模型有足够的了解。每个HTML元素都可以看作一个装了东西的盒子,盒子里面的内容到盒子的边框之间的距离即填充(padding),盒子本身有边框(border),而盒子边框外和其他盒子之间,还有边界(margin),如图1所示。
收藏 0 赞 0 分享

无延迟翻滚的图形与CSS混合风格按钮

  在一个具有图形背景的按钮中添加CSS风格的文本,这种建立按钮的方法结合了具有CSS翻滚(CSS rollover)标记的开发速度和效率,从而有效地提高按钮外表图像的三维效果。   相比于常规的图形按钮,这些图形/CSS混合按钮可易于建立和载入,因为你只需要为空白按钮外面
收藏 0 赞 0 分享

css里expression实现界面对象的批量控制

用过css样式我们就知道, 可以定义一批对象的class属性来指定同一个样式来统一界面. 但如何统一同类型的对象的事件? 比如:界面有无数个 <img src="**.jpg"> 如何实现鼠标经过此图片, 图片的src变成是**_over.jpg?
收藏 0 赞 0 分享

CSS教程:水平对齐(text-align)

  水平对齐(text-align),用以设定元素内文本的水平对齐方式。   1.语法   text-align具体参数如下: 语法:text-align:left|right|center|justify 说明:设定元素内文本的水平对齐方式。 参数:left:左
收藏 0 赞 0 分享
查看更多