【问题标题】:How is .row class defined in Bootstrap?Bootstrap 中如何定义 .row 类?
【发布时间】:2016-06-23 12:41:36
【问题描述】:

当我在 bootstrap.css 文件中搜索 .row 时,我得到了以下定义:

...
.row:before,
.row:after,
... {
  display: table;
  content: " ";
}

...
.row:after  
... {
  clear: both;
}
.row {
  margin-right: -15px;
  margin-left: -15px;
}

有了这些定义,我希望.row 类的行为如下:

  • 在任何行之前和之后都应该有一个包含一个空格 的块级元素。 .row 之前的空白不应清除.row. 之后的空白应清除。 -- 这一切实际上都没有发生。

  • 任何具有.row 类的div 元素都应从其包含元素向左和向右扩展15px。 -- 这对于通常包含的 div 是可观察到的,但对于 body 元素则不是。例如。如果body 元素内有两个 div 类行:

@import url("https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css");  

 .row div:nth-of-type(even) {
  background-color: darkgray
}
.row div:nth-of-type(odd) {
  background-color: lightgray
}
<div class="row">
  <div class="col-xs-12 col-md-8">.col-xs-12 .col-md-8</div>
  <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
</div>
<div class="row">
  <div class="col-xs-12 col-md-8">.col-xs-12 .col-md-8</div>
  <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
</div>

可以看出,文本不会超出视口左侧 15 像素。此外,两行都在渲染,中间没有任何间隙。 .row:after {display: table; content: " ";} 怎么了?

请解释一下。

P.S:我不知道 @import url 规则在 SO 编辑器中是如何工作的。

【问题讨论】:

标签: html css twitter-bootstrap twitter-bootstrap-3


【解决方案1】:

如果你将整个东西包装在一个 div 中,并添加overflow: hidden;,你会得到以下内容,这与你在上面实现的相同,但没有容器。

@import url("https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css");

.row div:nth-of-type(even) {
  background-color: rgba(168, 172, 176, 0.6);
}

.row div:nth-of-type(odd) {
  background-color: rgba(88, 86, 84, 0.6);
}

#wrapper {
  margin: 50px; 
  background: orange; 
  overflow: hidden;
}
<div id="wrapper">
  <div class="row">
    <div class="col-xs-12 col-md-8">.col-xs-12 .col-md-8</div>
    <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
  </div>
  <div class="row">
    <div class="col-xs-12 col-md-8">.col-xs-12 .col-md-8</div>
    <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
  </div>
</div>

但是,如果您删除 overflow: hidden;,您将看到以下内容:

@import url("https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css");

.row div:nth-of-type(even) {
  background-color: rgba(168, 172, 176, 0.6);
}

.row div:nth-of-type(odd) {
  background-color: rgba(88, 86, 84, 0.6);
}

#wrapper {
  margin: 50px; 
  background: orange; 
}
<div id="wrapper">
  <div class="row">
    <div class="col-xs-12 col-md-8">.col-xs-12 .col-md-8</div>
    <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
  </div>
  <div class="row">
    <div class="col-xs-12 col-md-8">.col-xs-12 .col-md-8</div>
    <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
  </div>
</div>

您会注意到这些行位于米色容器之外。这意味着负边距正在实现,但它被应用于body 的任何默认样式隐藏,并被.rows 上的填充抵消,所以看起来边距不起作用。您可以使用浏览器中的开发工具进一步观察这一点。

【讨论】:

  • 设置overflow: visible(或auto)时,为什么只有行的背景向外延伸?为什么内容不从行的最左侧开始?似乎有一些 padding-left 应用于行。
  • 我相信这就是正在发生的事情,是的。
  • 我在他们的 css 文件中找到了它。他们为.col-xs-*.col-sm-*.col-lg-* 应用了15px 的内边距。你能解释一下应用于每一行的.clearfix吗?
  • 如果没有应用 clearfix,那么所有行(浮动的)都会导致父级折叠。
【解决方案2】:
.row {
  margin-right: -15px;
  margin-left: -15px;
 }

在上述情况下,正如您所说,即使将行添加到 body 标签,它也会向左和向右扩展 15px 的边距。

 .row:before,
 .row:after,
 {
 display: table;
 content: " ";
  }


.row:after  
{
 clear: both;
}

在第二种情况下,它实际上将 clearfix 添加到类行,因为 class col's('col-lg-12') 具有 float left 属性,您必须为父类添加 clearfix。

【讨论】:

  • 是的,它正在添加 clearfix。但它不使用visibility: none,也不使用height:0 到clearfix。
  • @user31782 是的,我们不需要这些属性。它仍然可以工作。
  • 我们需要它们,这样clearfix 就不会占用任何空间。但由于某种原因,在引导程序 .row 类中它仍然隐藏没有 visibility: hidden
  • @user31782 实际上它没有隐藏它没有任何高度和宽度,或者它根本不是块级元素。检查小提琴jsfiddle.net/kcby4xmk
  • 一个带有height: auto的块级元素(注意display: table)。在您的 jsfiddle 中,我认为我们必须导入 bootstrap.css。
【解决方案3】:
.row:before, .row:after{
    display: table;
    content: " ";
    clear:both
}

【讨论】:

  • 他引用了 bootstrap css 的源代码,但在:before:after 中都添加了clear:both;,而在 bootstrap 源中,明确的只有@@:after
猜你喜欢
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 2016-03-18
  • 2021-04-06
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多