使浮动的CSS div居中

时间:2019-02-08 02:37:01

标签: html css

我正在做一个练习,尝试重新创建它:https://ibb.co/Nx48VbD

* {
  box-sizing: border-box;
}

.row-1 {
  background-color: grey;
  border: 1px solid black;
  width: 1178px;
  height: 146px;
  margin: 96px auto 0 auto;
  position: relative;
  right: 12px;
}

.row-2 {
  float: left;
  margin: 0 auto;
}

.b1 {
  background-color: grey;
  border: 1px solid black;
  width: 346px;
  height: 248px;
  margin-top: 24px;
  float: left;
}

.b1:nth-of-type(1) {
  margin-right: 90px;
}

.b1:nth-of-type(2) {
  margin-right: 46px;
}

.b1:nth-of-type(3) {
  bottom: 12px;
  right: 12px;
}

.row-3 {
  background-color: grey;
  border: 1px solid black;
  width: 1188px;
  height: 326px;
  margin: 24px auto;
  border-radius: 36px;
}

.b2 {
  background-color: gray;
  border: 1px solid black;
  height: 202px;
  border-radius: 24px;
  float: left;
}

.b2:nth-of-type(1) {
  width: 726px;
  margin-right: 24px;
}

.b2:nth-of-type(2) {
  width: 438px;
}

.b3 {
  background-color: gray;
  border: 1px solid black;
  height: 202px;
  margin-top: 24px;
  float: left;
}

.b3:nth-of-type(1) {
  width: 436px;
  margin-right: 84px;
  border-radius: 24px;
}

.b3:nth-of-type(2) {
  width: 666px;
}
<div class="row-1"></div>
<div class="row-2">
  <div class="b1"></div>
  <div class="b1"></div>
  <div class="b1"></div>
</div>
<div style="clear: both;"></div>
<div class="row-3"></div>
<div class="row-4">
  <div class="b2"></div>
  <div class="b2"></div>
</div>
<div style="clear: both;"></div>

<div class="row-5">
  <div class="b3"></div>
  <div class="b3"></div>
</div>

我可以使用margin:0 auto;使第一行和第三行居中。但是,当我在第二行,第四行和第五行尝试此操作时,它似乎不起作用。如何像图像中显示的那样居中放置它们?

我还有背景色:灰色;边框:1px纯黑色;在很多地方。有什么办法可以使我干燥吗?

由于每个框都有12px的边框,所以我还有很多margin-top margin-bottoms。有没有办法我也可以做这个DRY-er?

注意:本练习应该在不使用flexbox或CSS网格的情况下完成。

谢谢!

4 个答案:

答案 0 :(得分:2)

使用display: inline-block代替.b1上的浮点数

使用calc将它们设置为相等的宽度,然后设置text-align:第2行居中

.row-2{
  text-align: center;
}

.b1{
  display: inline-block;
  vertical-align: top;
  width: calc(100%/3 - 10px);
  height: 100px;
  border: 2px solid grey;
}
<div class="row-2">
    <div class="b1"></div>
    <div class="b1"></div>
    <div class="b1"></div>
</div>

如果您想使颜色/边界变干,我建议您学习SASS / SCSS,然后就可以使用变量和mixins

https://sass-lang.com/guide

答案 1 :(得分:1)

我不是要为您解决问题,这不是一个确切的例子。这暗示您要注意flex

Flex不会取消边距或填充,对于flex子代也有规则。可以毫无保留地指出容器的位置和空间。.有很多有趣的规则

* {
  box-sizing: border-box;
}

.root {
  display: flex;
  flex-direction: column;
  align-items: stretch;
}

.row-1 {
  background-color: grey;
  border: 1px solid black;
  width: 1178px;
  height: 146px;
}

.row-2 {
  display: flex;
  align-items: center;
  display: flex;
  align-items: center;
}

.b1 {
  background-color: grey;
  border: 1px solid black;
  width: 346px;
  height: 248px;
}

.row-3 {
  background-color: grey;
  border: 1px solid black;
  width: 1188px;
  height: 326px;
  border-radius: 36px;
}

.row-4 {
  display: flex;
}

.row-5 {
  display: flex;
}

.b2 {
  background-color: gray;
  border: 1px solid black;
  height: 202px;
  border-radius: 24px;
}

.b2:nth-of-type(1) {
  width: 726px;
}

.b2:nth-of-type(2) {
  width: 438px;
}

.b3 {
  background-color: gray;
  border: 1px solid black;
  height: 202px;
}

.b3:nth-of-type(1) {
  width: 436px;
  border-radius: 24px;
}
<div class="root">
  <div class="row-1">row-1</div>
  <div class="row-2">
    <div class="b1">b1 in row-2</div>
    <div class="b1">b1 in row-2</div>
    <div class="b1">b1 in row-2</div>
  </div>
  <div class="row-3">row-3</div>
  <div class="row-4">
    <div class="b2">b2 in row-4</div>
    <div class="b2">b2 in row-4</div>
  </div>
  <div class="row-5">
    <div class="b3">b3 in row-5</div>
    <div class="b3">b3 in row-5</div>
  </div>
</div>

答案 2 :(得分:0)

从您的图像看来,您实际上似乎并不希望任何行浮动。 float的作用是将元素从文档流中移出,并将它们放入新的分离流中,该流仅受同一上下文中其他浮动元素的影响。

您似乎想要拥有的所有行都以相同的宽度居中,一个接一个,并且行内的元素浮动。

我将执行以下操作,而不是执行row-2的操作:

.row-2, .row-4, .row-5 {
   width: 1178px;
   margin: 0 auto;
}

这是一个显示固定代码的jsfiddle:https://jsfiddle.net/fvzaujob/1/

顺便说一句,如今,一种更广泛使用的解决方案是使用flex或grids而不是float来控制文档中元素的流动,因为它使您可以更好地控制元素。

答案 3 :(得分:0)

您可以按照此代码分隔列。无需为每一列设置任何边距空间。您可以根据需要调整容器的宽度。 此代码中未使用Bootstrap和flexbox 。我希望这个答案会有所帮助。

* {
    box-sizing: border-box;
}

.container {
    max-width: 1178px;
    margin: 0 auto;
}

.row-3 {
    background-color: grey;
    border: 1px solid black;
    border-radius: 15px;
}

.row-1 {
    background-color: grey;
    border: 1px solid black;
    margin: 50px 0 0;
}

.col-4 {
    background-color: grey;
    border: 1px solid black;
    width: 32.26%;
    height: 250px;
    display: inline-block;
    padding: 0 0;
}

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

.row {
    clear: both;
    padding: 0px;
    margin: 0 0 15px;
    overflow: hidden;
    height: 140px;
}

.col-4:first-child,
.col-9:first-child,
.col-3:first-child {
    margin-left: 0;
}

.col-4,
.col-9,
.col-3 {
    display: block;
    float: left;
    margin: 0 0 0 1.6%;
    height: 140px;
}

.col-9 {
    background-color: grey;
    border: 1px solid black;
    width: 60%;
    display: inline-block;
    padding: 0 0;
    border-radius: 15px;
}

.col-3 {
    background-color: grey;
    border: 1px solid black;
    width: 38.26%;
    display: inline-block;
    padding: 0 0;
    border-radius: 15px;
}
<div class="container">
    <div class="row row-1"></div>
  
    <div class="row">
        <div class="col-4"></div>
        <div class="col-4"></div>
        <div class="col-4"></div>
    </div>

    <div class="row row-3"></div>
  
    <div class="row">
        <div class="col-9"></div>
        <div class="col-3"></div>
    </div>

    <div class="row">
        <div class="col-3"></div>
        <div class="col-9"></div>
    </div>
</div>