代码之家  ›  专栏  ›  技术社区  ›  Ates Goral

Fluid CSS:具有最大宽度和溢出的浮动列

  •  7
  • Ates Goral  · 技术社区  · 14 年前

    我在为我的博客工作的新主题中使用了流畅的布局。我经常在博客上写代码和include <pre> float: left 内容区域的列具有 max-width 使列停止在某个最大宽度,也可以缩小:

    +----------+     +------+
    |   text   |     | text | 
    |          |     |      |
    |          |     |      |
    |          |     |      |
    |          |     |      |
    |          |     |      |
    +----------+     +------+
        max           shrunk
    

    我想要的是 < < 元素从内容区域溢出,而不影响其流动性:

    +----------+     +------+
    | text     |     | text | 
    |          |     |      |
    +----------+--+  +------+------+
    | code        |  | code        |
    +----------+--+  +------+------+
    |          |     |      |
    +----------+     +------+
        max           shrunk
    

    但是, 一旦我插入外伸部分就不再是流体了 <前> 其中:列的宽度保持在指定的 最大宽度 即使我把浏览器缩小到超过这个宽度。

    <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. 拆下 <
    2. 拆下 浮动:左

    我当前使用的解决方法是插入 <前> 元素转换为“断开”列中的post,使post段的宽度和 <前> 各分部相互排他性管理:

    +----------+     +------+
    | text     |     | text | 
    +----------+     +------+
    +-------------+  +-------------+
    | code        |  | code        |
    +-------------+  +-------------+
    +----------+     +------+
    +----------+     +------+
        max           shrunk
    

    <div> 我宁愿保持语义上的原始性。

    诚然,我不完全了解box模型如何处理内容溢出的float,所以我不明白为什么 浮动:左 在容器和 <前> 最大宽度 容器的顶部。

    我在Firefox/Chrome/Safari/Opera上也发现了同样的问题。IE6(疯狂的那个)似乎一直很开心。

    更新

    我做了进一步的测试来观察 最大宽度 浮动:左

    4 回复  |  直到 4 年前
        1
  •  4
  •   knut    14 年前

    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>
    
        2
  •  1
  •   icio    14 年前

    <!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>
    
        3
  •  0
  •   Finbarr    14 年前

    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>
    
        4
  •  0
  •   wheresrhys    14 年前

    这也许有用

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

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