8

我正在为我的博客开发的新主题中使用流畅的布局。我经常写关于代码的博客,并<pre>在帖子中包含块。内容区域的float: left列有一个max-width,以便该列在某个最大宽度处停止,也可以缩小:

+----------+ +------+
| 正文 | | 正文 |
| | | |
| | | |
| | | |
| | | |
| | | |
+----------+ +------+
    最大缩小

我想要的是<pre>元素比文本列更宽,这样我就可以在没有水平滚动条的情况下容纳 80 个字符的包装代码。但我希望<pre>元素从内容区域溢出,而不影响其流动性:

+----------+ +------+
| 正文 | | 正文 |
| | | |
+---------+--+ +------+------+
| 代码 | | 代码 |
+---------+--+ +------+------+
| | | |
+----------+ +------+
    最大缩小

但是,max-width一旦我将悬垂插入其中,就会停止流动:即使我将浏览器缩小到超出该宽度<pre>,列的宽度仍保持在指定值。max-width

我已经用这个最低限度的场景重现了这个问题:

<div style="float: left; max-width: 460px; border: 1px solid red">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>
<pre style="max-width: 700px; border: 1px solid blue">
function foo() {
    // Lorem ipsum dolor sit amet, consectetur adipisicing elit
}
</pre>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>
</div>

我注意到执行以下任一操作都会恢复流动性:

  1. 删除<pre>(doh...)
  2. 去除那个float: left

我目前使用的解决方法是将<pre>元素插入到帖子列中的“中断”中,以便帖子段和<pre>段的宽度相互独占管理:

+----------+ +------+
| 正文 | | 正文 |
+----------+ +------+
+-------------+ +-------------+
| 代码 | | 代码 |
+-------------+ +-------------+
+----------+ +------+
+----------+ +------+
    最大缩小

但这迫使我<div>在帖子标记中插入额外的关闭和打开元素,我宁愿在语义上保持原始状态。

诚然,我没有完全理解盒子模型如何与内容溢出的浮动一起工作,所以我不明白为什么float: left容器上和容器<pre>内部的组合会削弱max-width容器的性能。

我在 Firefox/Chrome/Safari/Opera 上观察到同样的问题。IE6(疯狂的)似乎一直都很开心。

这似乎也不依赖于怪癖/标准模式。

更新

我已经进行了进一步的测试以观察max-width当元素具有float: left. 我浏览了 W3C 盒子模型章节,但没有立即看到明确提及这种行为。任何指针?

4

4 回答 4

5

margin-right: -240px; float: left;在元素上设置,<pre>使其占用尽可能少的水平空间,同时可能会溢出父<div>元素240px。请记住确保<p>元素清除两侧的浮动元素 ( clear: both)。完整示例如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
    "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <title>Solution</title>
    </head>
    <body>
        <div style="float: left; background-color: cyan; max-width: 460px;">
            <p style="background-color: magenta; clear: both;">
                Lorem ipsum dolor sit amet, consectetur adipisicing elit. 
                Lorem ipsum dolor sit amet, consectetur adipisicing elit. 
                Lorem ipsum dolor sit amet, consectetur adipisicing elit.
            </p>
            <pre style="float: left; max-width: 700px; 
                background-color: yellow; margin-right: -240px;">
function foo() {
    // Lorem ipsum dolor sit amet, consectetur adipisicing elit
}
            </pre>
            <p style="background-color: magenta; clear: both;">
                Lorem ipsum dolor sit amet, consectetur adipisicing elit. 
                Lorem ipsum dolor sit amet, consectetur adipisicing elit. 
                Lorem ipsum dolor sit amet, consectetur adipisicing elit.
            </p>
        </div>
    </body>
</html>
于 2010-04-25T13:11:38.977 回答
1

我认为这应该可以满足您的需求,但您可能需要稍微调整一下才能使其在原地工作。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
        <title>Test</title>
        <style type="text/css" media="screen">
            body
            {
                margin: 0;
                padding: 0;
            }
            #wrapper
            {
                float: left;
                width: 100%;
            }
            #content
            {
                float: left;
                width: 100%;
                max-width: 500px;

                margin: 0;
                padding: 0;

                font-family: "Trebuchet MS", sans-serif;
                font-size: 12px;
            }
            #content-pad
            {
                margin: 50px;
                padding: 50px 0 40px 50px;
                background-color: #CCC;
            }

            p, pre
            {
                margin: 0 50px 10px 0;
                line-height: 1.6em;
            }

            pre
            {
                padding: 20px;
                width: 560px;

                background-color: #333;
                color: #FFF;
            }
        </style>
    </head>
    <body>
        <div id="wrapper">
            <div id="content">
                <div id="content-pad">
                    <p>Fusce euismod nunc vitae orci vestibulum adipiscing. Nam id quam libero, sed convallis elit. Etiam interdum, urna et imperdiet euismod, nisi erat commodo elit, sed convallis magna est quis sem. Fusce tempor aliquet est, et ornare eros vulputate et. Vivamus arcu augue, pretium vel fermentum in, gravida sed elit. Vestibulum ut ligula ac quam hendrerit ullamcorper. Phasellus id justo augue. Integer a eros ante. Vivamus sapien mi, placerat a viverra pharetra, dignissim sit amet ipsum. Fusce nunc nunc, tempus ut aliquet sit amet, consectetur sed quam. Cras ligula enim, bibendum eget luctus a, convallis sit amet nisl. Nullam in quam in lectus faucibus lobortis vel pulvinar ante.</p>
                    <pre>Here is some code!
We're going to make sure that it has a full eighty characters to play in.
12345678901234567890123456789012345678901234567890123456789012345678901234567890</pre>
                    <p>Nullam in sapien vitae dui tincidunt elementum. Curabitur condimentum vulputate sem ornare pharetra. Fusce in dolor eget neque viverra sagittis a a orci. Vivamus blandit leo eget orci viverra quis hendrerit velit tempus. Donec in erat risus. Nullam scelerisque faucibus ante, ultricies tristique dolor laoreet sit amet. Duis sit amet tortor dolor, vel interdum ipsum. Sed sed nibh vel ipsum commodo cursus. Proin fermentum nunc in velit tincidunt imperdiet sit amet nec neque. Suspendisse neque ante, luctus sit amet pulvinar eu, congue laoreet magna. Aenean sit amet porttitor quam. Mauris hendrerit vulputate tempus. Curabitur mauris magna, laoreet congue rutrum condimentum, condimentum in sapien. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.</p>
                </div>
            </div>
        </div>

        <!-- this next element just maintains the margin properly -->
        <div style="clear:both; height: 0; overflow: hidden;"></div>
    </body>
</html>
于 2010-04-25T13:32:22.937 回答
0

CSS:

pre {
    display: inline-block;
}

适用于 Chrome 和 FireFox,这让我认为它至少也适用于 Opera、Safari 和 IE8。

如果这破坏了 IE6,您可以使用此选择器从浏览器中隐藏规则:

div > pre {
    display: inline-block;
}

在您的示例中(添加了额外的字符):

<div style="float: left; max-width: 460px; border: 1px solid red">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>
<pre style="max-width: 700px; border: 1px solid blue; display: inline-block;">
function foo() {
    // Lorem ipsum dolor sit amet, consectetur adipisicing elit dfsf sdf sdf sdf sdf
}
</pre>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>
</div>
于 2010-04-19T18:30:52.210 回答
0

这可能有效

pre {
  position:relative;
  float:left;
  z-index: 1;
}

position relative 使 pre “弹出”列的尺寸而不将其从文档流中删除,并且 float 应该调整 pre 的宽度以包含其所有内容。

于 2010-04-19T23:09:25.450 回答