左右布局 - 多种实现方式

Avatar of Geoff Graham
Geoff Graham

DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 $200 的免费积分!

几年前,我们在 CSS-Tricks 上 发布了关于此想法的文章。 我们认为现在是时候更新它并详细地讨论这个主题了。

想象一下,您需要将布局分成两半。 左侧的内容和右侧的内容。 基本上需要在容器内创建两个等高列。 每一侧占据容器的正好一半,在两者之间形成明显的分割。 像 CSS 中的许多东西一样,实现这一点有很多方法,我们现在将介绍其中许多方法!

使用背景渐变

我们可以通过使用渐变来创建改变背景的外观。 一半的背景设置为一种颜色,另一半设置为另一种颜色。 而不是从一种颜色渐变到另一种颜色,在中间设置一个零空间颜色停顿点。

.container {
  background: linear-gradient(
    to right, 
    #ff9e2c 0%, 
    #ff9e2c 50%, 
    #b6701e 50%, 
    #b6701e 100%
  );
}

这适用于单个容器元素。 但是,这也意味着,如果内容需要填充容器的两侧,则需要使用浮动或其他布局方法。

查看 CodePen 上由 CSS-Tricks (@css-tricks) 创建的 左侧/右侧与背景渐变 示例。

使用绝对定位

另一种方法是,在父容器内设置两个容器,以绝对定位,使用百分比将它们分成两半,然后应用背景。 这里的好处是,我们现在有两个独立的容器,可以容纳它们自己的内容。

查看 CodePen 上由 CSS-Tricks (@css-tricks) 创建的 左侧/右侧与绝对定位 示例。

绝对定位有时是完美的解决方案,有时却不可行。 这里的父容器需要设置高度,而设置高度通常对内容来说是坏消息(内容会发生变化!)。 更不用说绝对定位的元素会脱离文档流。 因此,很难让它在将其他内容向下推的时候正常工作。

使用 (伪) 表格

是的,是的,表格太老派了(更不用说充满了可访问性问题和布局灵活性问题)。 好吧,使用 display: table-cell; 属性实际上是一种方便的方法,可以创建这种布局,而无需在 HTML 中编写表格标记。 简而言之,我们将语义父容器变成表格,然后将子容器变成表格内的单元格 - 全部在 CSS 中完成!

查看 CodePen 上由 CSS-Tricks (@css-tricks) 创建的 左侧/右侧与表格显示 示例。

您甚至可以在这里很容易地在断点处更改显示属性,使两侧在较小的屏幕上堆叠。 display: table; (以及它的朋友) 支持到 IE 8 甚至旧的 Android,所以它非常安全!

使用浮动

我们可以使用我们的好朋友 float 将容器排列在一起。 这里的好处是,它避免了绝对定位(正如我们所提到的,它可能很乱)。

查看 CodePen 上由 CSS-Tricks (@css-tricks) 创建的 左侧/右侧与浮动 示例。

在这个例子中,我们显式地设置高度,使它们保持一致。 但实际上,默认情况下,浮动并不能提供这种能力。 您可以使用我们已经介绍的背景渐变技巧,这样它们看起来就一致。 或者,看看 巧妙的负边距技巧等方法。

还要记住,您可能需要在父元素上 清除浮动,以保持文档流的正常运行。

使用行内块

如果清除浮动后的元素显得繁琐,那么使用 display: inline-block 则是另一种选择。 这里的诀窍是,确保用于单独侧面的元素在 HTML 中没有任何间断或空格。 否则,该空格将被渲染成文字空格,第二部分将断开并向下掉。

查看 CodePen 上由 CSS-Tricks (@css-tricks) 创建的 左侧/右侧与行内块 示例。

同样,行内块并没有任何方法可以帮助我们使两侧的高度保持一致,因此您必须明确地指定它。

还有 其他潜在的方法可以解决上面描述的间距问题。

使用 Flexbox

Flexbox 是一个非常棒的方法,但请注意,它仅限于 IE 10 及更高版本,您可能需要 使用前缀和值来实现最佳支持

使用这种方法,我们将父容器变成弹性盒子,子容器占据相同比例的空间。 无需设置宽度或高度! Flexbox 知道该怎么做,因为默认值非常适合此目的。 例如,flex-direction: row;align-items: stretch; 是我们想要的,但它们是默认值,因此我们不必设置它们。 为了确保它们保持一致,在两侧设置 flex: 1; 是一个好主意。 这将迫使它们占据相同的空间比例。

查看 CodePen 上由 CSS-Tricks (@css-tricks) 创建的 左侧/右侧与 Flexbox 示例。

在这个演示中,我们还将侧面容器设置为弹性容器,只是为了好玩,以便处理垂直和水平居中。

使用网格布局

对于那些生活在技术前沿的人来说,CSS 网格布局 技术就像将 Flexbox 和表格方法合并到一起。 换句话说,定义一个容器,然后将其分成列和单元格,这些单元格可以灵活地填充子元素。

如果下面的演示中的单元格堆叠在一起,则表示您的浏览器不支持 CSS 网格。 在撰写本文时,支持仅限于 Firefox、Chrome、Safari 和 Opera(Opera Mini 除外)。

查看 CodePen 上由 CSS-Tricks (@css-tricks) 创建的 左侧/右侧与网格布局 示例。

CSS 的强大功能真是令人惊叹,它为我们提供了多种实现方式!