"2列+中间的em-width分隔符"的CSS布局

Jak*_*ski 6 css layout

如何使用HTML + CSS获取以下布局:

|                        |x|                          |
|                        |x|                          |
Run Code Online (Sandbox Code Playgroud)

所有三列(两列和分隔符)都应该接触,即它们的背景颜色必须接触而没有任何间隙.

我创建这样的布局的问题是我希望"分隔符"的宽度以em(即基于字体宽度)测量,而主要内容列则适合包含元素的其余宽度(即约50%) .我希望保留此布局,而不会在字体大小上独立地覆盖左侧或右侧内容列(即,如果我增加或减少字体宽度,则应保留布局).

请注意,此布局位于其他容器内,并且可以在页面中重复这些容器.因此,我无法使用任何绝对定位解决方案.

容器也不应使用固定宽度:将其视为具有width: 100%;width: auto;(或未设置宽度)的容器.

如果可以在缺少左列或右列(即空列)的情况下创建布局,则可以获得奖励积分.

Šim*_*das 5

一种可能性:

HTML:

<div class="container">
    <div> Column A </div>
    <div> Column B </div>
</div>
Run Code Online (Sandbox Code Playgroud)

CSS:

.container {
    overflow: auto;
}

.container > * {
    float: left;
    width: 50%;        
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}

.container > :first-child {
    border-right: 0.5em solid COLOR;
}

.container > :last-child {
    border-left: 0.5em solid COLOR;
}
Run Code Online (Sandbox Code Playgroud)

其中COLOR是分隔符列的背景颜色的颜色.

现场演示: http ://jsfiddle.net/3XHSu/show/


kiz*_*izu 5

使用inline-blocks,您可以创建许多不同的非平凡布局.

我做了两个例子,第一个例子,人为的等高:http://jsfiddle.net/kizu/nMWcG/

第二个变种,带有物理间隙分隔符:http://jsfiddle.net/kizu/nMWcG/5/

它们有些不同(并且可能有更多基于inline-block解决问题的s的布局),希望其中至少有一个适合你:)

整个想法是使用white-space: nowrapon包装器,因此如果它们的宽度之和大于包装器,则列不会掉落,然后在包装器上添加一个填充,其width: auto间距等于所需的间隙.

如果您只需要一列,则可以将其中一列清空(不带.column-content),或删除它们并在其上添加一个额外的类.嗯,这取决于你希望孤独的列如何表现等.


Poi*_*ars 5

始终可以使用绝对定位,但您也需要定位共同的祖先(relative).使用浮动可以最好地完成灵活的多列布局:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>CSS Test Case: 2-Column Layout with Separator</title>
    <style type="text/css">
      .container {
        position: relative;
        float: left;
        background-color: green;
      }

      .container .left {
        float: left;
        width: 50%;
        background-color: red;
      }

      .container .left .padding {
        margin-right: 5em;
      }

      .container .right {
        float: right;
        width: 50%;
        background-color: fuchsia;
      }

      .container .right .padding {
        margin-left: 5em;
      }

      .container .separator {
        position: absolute;
        left: 50%;
        top: 0;
        width: 10em;
        height: 100%;
        margin-left: -5em;
        background-color: blue;
      }

      div.clearBoth {
        clear: both;
        margin: 0;
        padding: 0;
        height: 0;
        line-height: 0;
        font-size: 0;
        overflow: hidden;
      }
    </style>
  </head>

  <body>
    <h1>CSS Test Case: 2-Column Layout with Separator</h1>
    <div class="container">
      <div class="left">
        <div class="padding">
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam nulla dolor, tempor ac sollicitudin malesuada, tempus in metus. Nulla eget augue ut velit ullamcorper aliquam. Aliquam in nibh eu arcu tincidunt eleifend et ac justo. Donec mauris orci, tristique et ornare quis, dictum a ante. Suspendisse rhoncus commodo ligula, ac mattis eros dignissim vitae. Morbi pulvinar ultrices aliquam. Praesent tempus velit justo, eget fringilla leo. Aliquam fringilla risus eget justo ornare pellentesque. Duis ullamcorper scelerisque mauris vitae blandit. Morbi et bibendum orci. Sed vestibulum posuere nisi, vitae rhoncus mi laoreet in. Quisque commodo porttitor risus, id ullamcorper libero gravida at. Donec interdum accumsan blandit. Vestibulum ac eros et nisl fermentum cursus. Integer vitae ornare orci. Vestibulum facilisis adipiscing metus a suscipit.
        </div>
      </div>
      <div class="right">
        <div class="padding">
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam nulla dolor, tempor ac sollicitudin malesuada, tempus in metus. Nulla eget augue ut velit ullamcorper aliquam. Aliquam in nibh eu arcu tincidunt eleifend et ac justo. Donec mauris orci, tristique et ornare quis, dictum a ante. Suspendisse rhoncus commodo ligula, ac mattis eros dignissim vitae. Morbi pulvinar ultrices aliquam. Praesent tempus velit justo, eget fringilla leo. Aliquam fringilla risus eget justo ornare pellentesque. Duis ullamcorper scelerisque mauris vitae blandit. Morbi et bibendum orci. Sed vestibulum posuere nisi, vitae rhoncus mi laoreet in. Quisque commodo porttitor risus, id ullamcorper libero gravida at. Donec interdum accumsan blandit. Vestibulum ac eros et nisl fermentum cursus. Integer vitae ornare orci. Vestibulum facilisis adipiscing metus a suscipit.
        </div>
      </div>
      <div class="separator"></div>
    </div>
    <div class="clearBoth"><!-- clear --></div>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

请注意

  • 背景颜色是触摸的,因为你看不到水平的绿色(但见下文);
  • 容器尺寸是无关紧要的(它适用于任何视口大小和任何文本内容;但见下文);
  • 它适用于任何字体大小;
  • 它适用于任何分隔符宽度,只要您调整边距(见下文);
  • 它可以在文档中的任何地方,有几次,因为它使用CSS类,而不是ID;
  • 如果您设置display: none左列,右列或两者,它都有效.因此,如果标记中缺少左列,右列或两者,则它可以工作;
  • 它使用了一组最小的选择器,属性和属性值,这些值自CSS1CSS2以来都可用.

由于后者,它也应该适用于所有支持CSS2的浏览器,因为它不依赖于任何特定于UA的实现.我在以下浏览器中测试了这个积极因素:

  • 适用于Windows 7的Microsoft Internet Explorer 9.0.8112.16421
  • 适用于Debian GNU/Linux的Google Chrome 16.0.912.41测试版
  • 适用于Windows的谷歌浏览器15.0.874.121米
  • Chromium 14.0.835.202(Developer Build 103287 Linux)基于Debian unstable构建,在Debian 6.0.3上运行
  • 用于Windows的Mozilla Firefox 8.0.1(在Wine上)
  • Iceweasel(Debian Firefox)8.0
  • 用于Windows的Mozilla Firefox 7.0.1(在Wine上)
  • 适用于Windows的Mozilla Firefox 6.0.2(在Wine上)
  • 适用于Windows的Mozilla Firefox 5.0(在Wine上)
  • 用于Windows的Mozilla Firefox 4.0.1(在Wine上)
  • 用于Windows的Mozilla Firefox 3.6.24(在Wine上)
  • 用于Windows的Mozilla Firefox 3.5.19(在Wine上)
  • 用于Windows的Mozilla Firefox 3.0.19(在Wine上)
  • Iceape(Debian SeaMonkey)2.0.14
  • 用于Windows的Apple Safari 5.0.2(7533.18.5)(在Wine上)
  • 用于Windows的Apple Safari 4.0.5(531.22.7)(在Wine上)
  • 适用于Linux的Opera 11.52.1100
  • 用于GNU/Linux的Konqueror 4.6.5(在KDE 4.6.5上)
  • 谷歌Android 2.3.4浏览器
  • Dolphin Browser HD 7.1.0 for Android
  • 适用于Android的Mozilla Firefox 8.0
  • Opera Mobile 11.50 for Android
  • iPhone 3G上的iOS 4.2.1(8C148)上的Apple Mobile Safari 5.0.2(6533.18.5)(MB496FD)

它并没有工作在:

  • Mozilla Firefox 2.0 for Windows(on Wine):不支持Floats.
  • Mozilla Firefox 1.5.0.12 for Windows(on Wine):不支持Floats.
  • 用于Windows的Mozilla Firefox 1.0.8(在Wine上):不支持浮点数.
  • 用于Windows 98的Microsoft Internet Explorer 6.0.2800.1106(在Wine上):并不总是显示分隔符,如果视口宽度发生更改,则布局会分崩离析.可能你可以通过条件注释触发的样式表来解决这个问题.(另见tereško的回答.)

测试用例

说明:

  1. 对于浮点数,您可以使用50%宽度的列,但不能使用水平边距或填充,因为在W3C(标准)CSS框模型中,框宽度等于width加水平填充.因此,任何(水平)填充必须由子元素创建.
  2. 为了有一个柱末端的在分离器框的边界的内容,你需要margin-rightmargin-left为孩子(DIV)左,右列的一半内的元素width的分离器(的5em分别). 如果不再涉及padding-right,padding-left也可能会有效width.
  3. 为了将分隔器定位在absolute左列和右列之间,必须定位容器relative.分隔符具有负边距(margin-left: -5em),以便其框width: 10em从中间(left: 50%)向左移动一半.
  4. 容器必须float: left使其为分隔符提供堆叠上下文,以显示在列的顶部(并始终具有正确的宽度).因此,您需要clear: leftclear: both容器之前和之后(后者DIV在这里使用零高度元素).

注意事项:

  1. 如果左右列的高度不同,您将看到垂直绿色.使用通常的技巧来模拟相同的高度.(另见tereško的回答.)
  2. 如果视口变浅,如果无法包装,列中的内容可能会水平溢出; 特别是替换了图像和长词等内联元素.声明与默认值()不同的值overflowoverflow-xvisible以防止这种情况发生.

更新:现在验证为HTML 4.01 Strict和CSS2; 清除BR为子BODY,而magenta颜色名称分别没有.此外,该position属性是与CSS2一起引入的.


小智 3

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:svg="http://www.w3.org/2000/svg"
      xml:lang="en">
  <head> <title>CASH REGISTER</title>
  <style type="text/css">
        @media all {
        body              { margin:0 ; padding:0 ; background:#000000 ; color:white }
        div               { margin:0 ; padding:0  ; font-size:2em       }
        }
  </style >
  </head>
  <body>
<div style="background-color: #888 ; width: 51em">
<div style="background-color:red;float:left;width:25em">1</div>
<div style="background-color:green;float:left;width:1em">2</div>
<div style="background-color:blue;float:left;width:25em">3</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)