我想尝试一下几种常见的、使用 CSS 时非常古怪的多列流体宽度布局样式。
实现多列流体布局的一种方法是使用百分比设置列宽。例如,将左侧列的宽度设置为 19%,右侧列的宽度设置为 80%(保持总宽度低于 100% 可以防止它们相互碰撞并导致布局错乱)。我真的很不喜欢这种方法。它会阻止您在这些列上使用基于像素的填充(存在问题),导致需要额外的 div。更糟糕的是,这两列之间的“间距”会随着浏览器窗口大小的变化而变化,因此在浏览器窗口最窄时,1% 太窄了,而在窗口最宽时,它又太宽了。
一个更好的流体宽度技术(假设您只希望其中一列是“流体”列)是完全不依赖百分比,而是使用单个列的最小和最大宽度。事实上,这单个列实际上并不是一列,而是布局的整个宽度。内部内容可以通过填充从边缘推开,从而为绝对定位的侧边栏腾出空间。
此技术有很多好处
- 不使用浮动意味着布局更稳定。不用担心列会因其包含的内容而扩展和破坏
- 可以一致地控制列之间的间距
- 通常基于像素,允许基于像素的填充/边距
有关此处所用理论的详细说明,请查看 Dan Rubin 的 绝对列。这些非常相似,只是将该理念扩展到流体宽度。
查看演示
IE 6
我相信你们中的大多数人立即想到了 IE 6 中存在的各种问题。我们非常清楚,min/max-width 在 IE 6 中不起作用。并且为这些侧边栏设置 top/left/bottom 或 height: 100% 也无法正常工作。那么我们该怎么办呢?
有很多方法可以解决这个问题,您只需要评估您自己网站上的具体情况以确定如何解决。也许您不介意 min-max-width 出现问题(在 IE 6 中发生的情况是最大宽度为 100%,最小宽度为 0%)。也许您的侧边栏颜色相同,因此您不关心它们是否会一直延伸到底部。
我认为处理 IE 6 最优雅的解决方案(正如 Dan 在其 Absolute Columns 文章中建议的那样)是 Dean Edwards 的 IE7.js 脚本。只需将这个小片段放在 head 部分,您的问题就解决了
<!--[if lt IE 7]>
<script src="//ie7-js.googlecode.com/svn/version/2.0(beta3)/IE7.js" type="text/javascript"></script>
<![endif]-->
测试
我已经在 IE 6 及更高版本以及我安装的所有其他流行浏览器中查看了这些布局,并且它们在所有浏览器中都能正常工作。如果您遇到问题,请告诉我,我们可以一起寻找解决方案。
*“一半一半”使用了百分比,这与其他示例的理论不符(但仍然可能有用)。
Chris 最近怎么样?!
我刚开始访问你的网站,想告诉你我非常喜欢,你做得很好。感谢所有信息 :)
我只是想陈述我对你的示例布局以及网络上其他类似布局的个人看法。
我认为在使用这些技术时,密切关注排版非常重要
a) 每行字数
b) 行高(行距)
c) 字体大小
显然,所有这些因素(可能还有更多)都会影响页面的可读性。在让内容“流动”之前,我们必须考虑这些因素。
很乐意听到你的反馈。
AG
当然,所有这些都很重要。在流体宽度环境中,每行字数很容易成为问题。这也是使用 min 和 max-width 理想的原因,因为您可以将它们设置为仅允许适当的长度。
通过使用 em 单位而不是百分比,这可以通过一些计算轻松完成。
首先,**行高不需要指定单位**。您可以使用 p { line-height: 1.5; },浏览器会自动计算。
字体大小也可以计算,只要您小心跟踪父 div 的宽度即可。由于 max-width 的存在,行长也可以这样做。
有关流体网格和计算的更多信息,请查看 ALA 的文章《流体网格》
@koew - 我正要建议 ALA 的 1em = 16px 公式。它非常好用,并且不需要在 IE 浏览器中进行太多修改。
或者您可以使用 62.5% 的技巧:将 body 的字体大小设置为 62.5%。然后 1.0em 将被计算为 10px,1.3em 为 13px,2.5em 为 25px。如果您不习惯 em 计算,但仍然希望事物保持像素化,这是一个不错的技巧。
哇,这些真的太棒了,谢谢 Chris(你什么时候睡觉)。我使用 IE7.js 脚本已经有一段时间了,我认为它非常有效,比修改 IE 6 及更低版本的效果要好得多。此外,您还可以获得额外的满足感,因为您知道通过让那些仍然使用 IE 6 的人下载额外的文件来惩罚他们。
感谢这些布局包,继续努力 :)
如果流体列中有更多文本会发生什么?页面会完全崩溃。
解决方案可能是:overflow:auto; 就像 Dan Rubin 的文章中一样。
我以非常简单的方式解决了流体列的问题,只需阻止流体列周围的所有内容即可 :)
以下是解决方案:Emastic 模板
那里有一些非常不错的方法。我从来都不是流体宽度布局的忠实粉丝,但当然,当您使用 min/max-width 时,您可以轻松解决纯百分比方法的一些主要问题(例如在非常高分辨率屏幕上发生的布局中断)。
固定/流体方法可以兼顾两者的优点,即设计固定宽度,但同时也能满足那些通过较小窗口或异常低分辨率屏幕查看网页的用户。
我之前尝试过这个,但在 IE 上遇到了问题……
我还注意到您必须使用严格的文档类型。
我在阅读你的文章时,想起了 A List Apart 的一篇相关文章 http://www.alistapart.com/articles/fluidgrids。谢谢 Chris。
IE7.js 太棒了。使用它的唯一一个小问题是,如果用户禁用了 JavaScript,布局就会中断。当然,如果您使用它来设计一个在 IE 6 中不可能实现的布局,那么这无关紧要 :-P
CSS 新手问题,参考 [固定 - 流体 - 固定] 3 列示例
现在,中间列是流体
#main-content { position: absolute; right: 0; top: 0; width: 160px; bottom: 0;
background: white; padding: 0 10px }
使 #main-content 成为固定的 CSS 代码是什么?
即:如何使所有 3 列都成为固定宽度?
谢谢你的帮助!
要使它成为固定宽度,只需设置 WIDTH 而不是 MIN 和 MAX 宽度。
嗨,Chris,
抱歉,我上面帖子中的错误……
现在“流体”中间列的 CSS 定义是
#main-content { padding: 0 190px; background: white; }
上述 CSS 定义应该是什么?
使中间列(内容)成为固定宽度?
即:就像现在左右两个侧边栏一样,是固定宽度。
需要所有 3 列都具有“固定”宽度……
谢谢!
我应该说,设置 #page-wrap 的宽度。
很棒的技巧,Chris~
但是这些布局存在一个问题……
由于您正在使用绝对定位来设置侧边栏,那么当中间内容的高度比侧边栏短时会发生什么情况?页脚会随着流体中间内容向上收缩,从而导致侧边栏穿透。
我实际上正在写一篇关于类似主题的文章,可能下周会发布,我非常乐意听听您的意见。
我使用了一个最小高度(带有 *html hack 为 IE6 设置高度)在一个包裹侧边栏和中间内容的容器上。
这样,如果中间内容没有太多内容(例如只有一句话的错误页面),页脚仍然不会超过侧边栏。这在我的之前项目中非常有效 :-)
-Soh
嘿,Soh,
最可靠的方法是在侧边栏上设置 `overflow: auto;`,这样它们就不会溢出,而是会出现滚动条。
另一种方法是使用 JavaScript 获取内容的高度,并设置 `#page-wrap` 的高度至少与之相同。
我可以看到在某些情况下,在包装器上使用最小高度是有效的,但该值有点随意,并不完全万无一失。除非我的理解有误。迫不及待地想看看你对这个问题的看法!
Chris 的观点很棒。我同意这不是一个万无一失的解决方案~
使用 JavaScript,
我确实遇到过一个问题,我计算了侧边栏和中间内容的高度,找到了两者中的最大高度,并将该高度设置为包装器的高度,但当我们在内容中添加手风琴时,它似乎计算了最大高度,但没有考虑折叠的内容。所以发生的事情是,加载后我们在底部得到了巨大的空白区域。也许 JavaScript 代码有错误(很有可能),但在我看来,它之前遇到了障碍。
无论如何,Chris 总是像往常一样提供很棒的内容 :-)
不错!
我刚刚尝试了固定-流体-固定布局。有没有办法在侧边栏中添加更多内容时使网站垂直缩放?目前它只是溢出底部,看起来非常难看?
除此之外,Chris 的工作真的很棒 :-)
嘿,Chris,
我并不是特别喜欢流体布局,但我真的很喜欢 J.R.V. http://www.jrvelasco.com/ 所做的。你会如何称呼这样的布局?
对我来说,这是流体布局唯一有意义的方式。
感谢您撰写这篇文章。
在我看来,这似乎是他可能正在使用的网格系统 CSS 框架……
感谢您提供这些布局包……我比 CSS 框架更需要这些……
我认为我同意上面 Farid 关于 J.R.V 流体布局的观点。通常内容设置为流体,侧边栏固定,但他做了相反的事情,并且它起作用了(至少对他来说是这样)。
流体内容会导致过长的文本行,难以阅读……
谢谢,非常有用!
不错!
那个 IE 7 脚本似乎是我其中一个项目的救星。非常感谢您的信息!
感谢您的分享,尤其是 IE7 的那个;这正是我目前需要的:]
我正在开发一个网站,IE 修复程序似乎不起作用。页面在 IE8、Firefox 和 Safari 中看起来都很好,但在 IE7 及更低版本中则不行。
您能查看一下为什么 DIV #homeContent (http://test.rwrightarchitects.com/) 忽略了 “margin-top” 值并将 DIV 移动到页面顶部。
谢谢
Raj
不用担心。我搜索了一下,发现使用填充而不是边距可以解决问题。