Em vez de usar align-self: center
use align-items: center
.
Não há necessidade de alterar flex-direction
ou usar text-align
.
Aqui está o seu código, com um ajuste, para fazer tudo funcionar:
ul {
height: 100%;
}
li {
display: flex;
justify-content: center;
/* align-self: center; <---- REMOVE */
align-items: center; /* <---- NEW */
background: silver;
width: 100%;
height: 20%;
}
A align-self
propriedade se aplica aos itens flexíveis . Exceto que o li
item não é um item flexível porque o pai - o ul
- não possui display: flex
ou se display: inline-flex
aplica.
Portanto, ul
não é um contêiner flexível, li
não é um item flexível e align-self
não tem efeito.
A align-items
propriedade é semelhante a align-self
, exceto se aplica a contêineres flexíveis .
Como o li
container é flexível, align-items
pode ser usado para centralizar verticalmente os elementos filhos.
* {
padding: 0;
margin: 0;
}
html, body {
height: 100%;
}
ul {
height: 100%;
}
li {
display: flex;
justify-content: center;
/* align-self: center; */
align-items: center;
background: silver;
width: 100%;
height: 20%;
}
<ul>
<li>This is the text</li>
</ul>
demo codepen
Tecnicamente, aqui está como align-items
e como align-self
funciona ...
A align-items
propriedade (no contêiner) define o valor padrão de align-self
(nos itens). Portanto, align-items: center
significa que todos os itens flexíveis serão definidos como align-self: center
.
Mas você pode substituir esse padrão ajustando os align-self
itens individuais.
Por exemplo, você pode querer colunas de altura igual, para que o contêiner esteja definido como align-items: stretch
. No entanto, um item deve ser fixado na parte superior, para que esteja definido como align-self: flex-start
.
exemplo
Como o texto é um item flexível?
Algumas pessoas podem estar se perguntando como uma sequência de texto ...
<li>This is the text</li>
é um elemento filho do li
.
O motivo é que o texto que não é explicitamente quebrado por um elemento de nível embutido é quebrado por algoritmos por uma caixa embutida. Isso o torna um elemento inline anônimo e filho do pai.
A partir da especificação CSS:
9.2.2.1 Caixas em linha anônimas
Qualquer texto que esteja diretamente contido em um elemento de contêiner de bloco deve ser tratado como um elemento inline anônimo.
A especificação flexbox fornece um comportamento semelhante.
4. Itens Flex
Cada filho em fluxo de um contêiner flexível se torna um item flexível e cada execução contígua de texto que está diretamente contida dentro de um contêiner flexível é agrupada em um item flexível anônimo.
Portanto, o texto no li
é um item flexível.
align-items: baseline
. Bom para diferentes alturas provenientes de diferentes caracteres unicode etc.