it-swarm.com.ru

Flexbox - центрировать текст по вертикали

У меня есть квадратный flexbox, который полностью покрыт одной гиперссылкой. 

Теперь я хочу расположить по центру содержимое flexbox.

Однако использование элемента div со свойством display: table и вложенного div со свойством display: table-cell; vertical-align: middle не работает, поскольку я теряю квадратную форму.

Если я использую divs вместо ul и li, я теряю свойство щелкать везде.

Я хотел бы, чтобы «Текст» был выровнен по горизонтали и вертикали в центре красного поля:

body {
  margin: 0px;
  width: 100%;
}
main {
  width: 100%;
  display: flex;
  flex-wrap: wrap;
}
.flex-container {
  width: 100%;
}
ul {
  display: flex;
  flex-wrap: wrap;
  list-style: none;
  -webkit-padding-start: 0px;
  -webkit-margin-before: 0px;
  -webkit-margin-after: 0px;
}
li {
  display: flex;
  flex-direction: column;
  width: 50%;
}
.red {
  background-color: red;
}
.white {
  background-color: white;
}
.tile:before {
  content: '';
  float: left;
  padding-top: 100%;
}
.tile {
  text-align: center;
}
<main>
  <div class="flex-container">
    <ul>
      <li class="red">
        <a href="/">
          <div class="tile">
            Text
          </div>
        </a>
      </li>
    </ul>
  </div>
</main>

6
Skrodde

main {
  height: 200px;
  width: 200px;
}
a {
  display: flex;
  align-items: center;
  justify-content: center;
  background-color: red;
  height: 100%;
}
<main>
  <a href="/">
    <div class="tile">Text</div>
  </a>
</main>

12
Michael_B

В вашей декларации .tile вам нужен код flexbox следующим образом:

justify-content: center;
display: flex;
align-items: center;

Ваша декларация LI должна быть просто display: block, так как она не использует свойства flexbox.

2
Zack Kirby

Я удалил часть :before из .tile и переместил ее в тег a (теперь это редактор класса click-container. Так как он не похож на тот, где он должен быть. Вы хотите, чтобы сам элемент a был квадратным, а не его содержимое.

Теперь, когда у нас есть квадратный якорь, вы можете использовать любые приемы вертикального выравнивания для центрирования контента, в этом примере я использовал трюк absolute + translate:

body {
  margin: 0px;
  width: 100%;
}
main {
  display:flex; 
  flex-wrap:wrap;
}
.flex-container {
  width: 100%;
}
ul {
  display: flex;
  flex-wrap:wrap;
  list-style: none;
  -webkit-padding-start:0px;
  -webkit-margin-before: 0px;
  -webkit-margin-after: 0px;
}
li {
  display: flex;
  flex-direction: column;
  width: 50%;
}
.red {
  background-color: red;
}
.white {
  background-color: white;
}

/* edited code */
.tile {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
.click-container {
  display: block;
  text-align: center;
  position: relative;
}
.click-container:before{
  float: left;
  padding-top: 100%;
  content: "";
}
<body>    
  <main>
    <div class="flex-container">
      <ul>
        <li class="red">
          <a class="click-container" href="/">
            <div class="tile">
              Text
            </div>
          </a>
        </li>
      </ul>
    </div>
  </main>
</body>

0
AVAVT

Измените свой CSS следующим образом:

    .tile:before {
        content: '';
        float: left;
    }
    .tile {
        text-align: center;
        padding-top: 50%;
        padding-bottom: 50%;
    }

Вы не потеряете свою квадратную форму, а отступы всегда будут центрировать текст.

Вы можете проверить это здесь:

https://plnkr.co/edit/BgPW9exwJpyxHFn5fMBP?p=preview

0
FioleNana