it-swarm.com.ru

Заставьте гибкий контейнер брать ширину содержимого, а не ширину 100%

В приведенном ниже примере у меня есть кнопка со следующими стилями ...

.button-flexbox-approach {
    /* other button styles */
    display: flex;
    justify-content: center;
    align-items: center;
    padding: 1.5rem 2rem;
}

http://codepen.io/3stacks/pen/JWErZJ

Но он автоматически масштабируется до 100% вместо ширины контента. Вы можете установить явную ширину, но тогда это не позволит вашему тексту обернуться естественным образом.

Как создать кнопку, центрирующую внутренний текст с помощью flexbox, но не увеличивающуюся по размеру контейнера?

.container {
  width: 100%;
  height: 100%;
}

.button {
/*   Simply flexing the button makes it grow to the size of the container... How do we make it only the size of the content inside it? */
  display: flex;
  justify-content: center;
  align-items: center;
  -webkit-appearance: none;
  border-radius: 0;
  border-style: solid;
  border-width: 0;
  cursor: pointer;
  font-weight: normal;
  line-height: normal;
  margin: 0;
  position: relative;
  text-align: center;
  text-decoration: none;
  padding: 1rem 2rem 1.0625rem 2rem;
  font-size: 1rem;
  background-color: #D60C8B;
  border-color: #ab0a6f;
  color: #fff;
}

.one {
  margin-bottom: 1rem;
}

.two {
/* You can put an explicit width on that, but then you lose the flexibility with the content inside */
  width: 250px;
}
<div class="container">
  <p>
    Button one is flexed with no width and it grows to the size of its container
  </p>
  <p>
    <a class="button one" href="#">Button</a>
  </p>
  <p>
    Button two is flexed with an explicit width which makes it smaller, but we have no flexibility for changing the content
  </p>
  <p>
    <a class="button two" href="#">Button 2</a>
  </p>
</div>

6
3stacks

Вместо display: flex в контейнере используйте display: inline-flex.

Это переключает контейнер с уровня блока (который принимает полную ширину его родителя) на уровень inline (который принимает ширину его содержимого).

Такое поведение размеров похоже на display: block и display: inline-block.

Для связанной проблемы и решения см .:

10
Michael_B

Правка: Michael_B указал в своем ответе, что inline-flex на родителя является правильным свойством для этого варианта использования. Я обновил свой блог соответственно.

Это не идеально, но если вы поместите кнопку в контейнер, который встроен в блок, кнопка будет естественным образом масштабироваться с содержимым, например:

.button {
  /* other button styles */
  display: flex;
  justify-content: center;
  align-items: center;
  padding: 1.5rem 2rem;
}
<div style="display: inline-block;">
  <a class="button">Button</a>
</div>

Затем вы можете установить максимальную ширину контейнера, и текст будет перенесен на несколько строк, но при этом сохранится правильное вертикальное центрирование.

Я подробно рассказал об этом в своем последнем сообщении в блоге: https://lukeboyle.com/css-buttons-solved-flexbox/

1
3stacks