将div在flex项目中水平居中

时间:2019-02-15 18:00:41

标签: html css css3 flexbox position

我有3个flex项目(每个项目都是一个div)。每个flex项目都包含一个图像,2个段落标签和一个div(用于按钮)。我试图在每个flex项目中将每个按钮水平居中。

我尝试在flex容器中设置justify-content:center;,但这没有用。 (我也不认为这是我想要的,因为我只希望div水平居中)我也尝试将margin: 0 auto;设置为按钮。这些似乎都不起作用。当前,每个flex项目的宽度为33%,因此我将内部div设置为position: absolute;left: 16.5%;(容器宽度的一半)。但这看起来不对。这是我最接近的。关于如何使它看起来更好的任何想法?

HTML:

<section class="overview-section">
  <h2>Overview</h2>

  <div class="row">
    <div class="box">
      <img src="https://images.unsplash.com/photo-1550129460-d47c2040f9df?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=282&q=80">
      <p class="under-text">TITLE GOES HERE</p>
      <p class="txt">adsf adsf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf </p>
      <div class="btn">Learn more</div>
    </div>
    <div class="box">
      <img src="https://images.unsplash.com/photo-1550129460-d47c2040f9df?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=282&q=80">
      <p class="under-text">TITLE GOES HERE</p>
      <p class="txt">adsf adsf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf
      </p>
      <div class="btn">Learn More</div>
    </div>
    <div class="box">
      <img src="https://images.unsplash.com/photo-1550129460-d47c2040f9df?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=282&q=80">
      <p class="under-text">TITLE GOES HERE</p>
      <p class="txt">adsf adsf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf
      </p>
      <div class="btn">Learn more</div>
    </div>
  </div>

</section>

CSS:

@import url("https://fonts.googleapis.com/css?family=Oswald:300,400,500");
@import url("https://fonts.googleapis.com/css?family=Lato:400,700");
@import url("https://fonts.googleapis.com/css?family=Staatliches");

.row {
  display: flex;
  margin: 0 -50px;
}

.box {
  position: relative; /* button will be positioned relative to this container */
  border: 2px solid blue;
  width: 33%;
  height: 450px;
  margin: 0 50px;
}

.box img {
  width: 100%;
  height: 250px;
}

.under-text {
  font-family: "Staatliches", cursive;
  color: red;
  text-align: center;
}

.txt {
  padding-left: 20px;
}

.btn {
  position: absolute;
  left: 16.5%;
  bottom: 0;

  background-color: #4caf50;
  border: none;
  color: black;
  padding: 15px 32px;
  text-align: center;
  text-decoration: none;
  display: inline-block;
  font-size: 16px;
  margin: 4px 2px;
  cursor: pointer;
  background-color: white;
  color: black;
  border: 2px solid #4caf50;
}



Codepen:https://codepen.io/anon/pen/rPqgVm

预期结果:弹性项目中的每个div应该水平居中。

4 个答案:

答案 0 :(得分:1)

删除
.btn {
  position: absolute;
  left: 16.5%;
  bottom: 0;
}

并添加

.box {
display: flex;
flex-direction: column;
align-items: center;
}

答案 1 :(得分:0)

我认为您所说的.btn对吗?如果是这样,您有两个选择。

删除绝对位置并为其提供自动边距。 (“自动”意味着您可以获得同等的收益)

.btn {
 // margin top & bottom - margin left& right
 margin: 10px auto;
}

或者,如果您保持绝对位置,则需要将其左侧设置为50%,然后将div的左角向后拉其宽度的50%

.btn {
  position: absolute;
  left: 50%;
  transform: translatex(-50%);
}

答案 2 :(得分:0)

您还可以将btn div包装在另一个div中并添加

 display: flex;
 justify-content: center;

并从现有btn div中删除绝对值和剩余值。

修改后的代码笔:https://codepen.io/anon/pen/ErOYPw

答案 3 :(得分:0)

我使用Grid,但也许这个建议会有所帮助。将按钮放在它自己的容器中,然后将其放在该容器中居中。

<div class = 'btncontainer'>
    <div class="btn">Learn more</div>
</div>