好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

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

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

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

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

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

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

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

footer {
background:  # 333;
}
.wrapper {
max-width: 900px;
mar gin : 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代码都剥离干净了。也就是说,它其实已经不需要参与布局了,我们可以安全地把它从结构代码中去掉。终于,我们在纯净无冗余的 HT ML 结构上实现了想要的设计风格。这个 方案 还有进一步优化的空间吗?没错。你要相信,追求卓越的道路是永无止境的!

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

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

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

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

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

总结

以上是 为你收集整理的 calc()实现满屏背景定宽内容 全部内容,希望文章能够帮你解决 calc()实现满屏背景定宽内容 所遇到的问题。

如果觉得 网站内容还不错, 推荐好友。

查看更多关于calc()实现满屏背景定宽内容的详细内容...

  阅读:19次