Eu estava estourando meu cérebro sobre a criação de um alinhamento vertical em css usando o seguinte
.base{
background-color:green;
width:200px;
height:200px;
overflow:auto;
position:relative;
}
.vert-align{
padding-top:50%;
height:50%;
}
<!-- and used the following div structure. -->
<div class="base">
<div class="vert-align">
Content Here
</div>
</div>
Embora isso parecesse funcionar para este caso, fiquei surpreso que, quando aumentava ou diminuía a largura da minha base div, o alinhamento vertical se encaixava. Eu esperava que, ao definir a propriedade padding-top, o padding fosse considerado como uma porcentagem da altura do contêiner pai, que é a base do nosso caso, mas o valor acima de 50% é calculado como uma porcentagem da largura. :(
Existe uma maneira de definir o preenchimento e / ou margem como uma porcentagem da altura, sem recorrer ao JavaScript?
fonte
top
funciona muito bem para redimensionar com base na altura do navegador / janela. Que tal ter um div embaixo desse div? Como você podeclear
o 2º div estar abaixo do div que é deslocado para baixo por umtop:50%
??top: 50%
não é muito útil se você precisar alinhar o conteúdo por seu próprio centro.Resposta a uma pergunta um pouco diferente: Você pode usar
vh
unidades para colocar elementos no centro da janela de exibição :fonte
vh
é quase o mesmo que porcentagens ... ainda pior em alguns casos. Esta resposta é irrelevante para a perguntaAqui estão duas opções para emular o comportamento necessário. Não é uma solução geral, mas pode ajudar em alguns casos. O espaçamento vertical aqui é calculado com base no tamanho do elemento externo, não no pai, mas esse tamanho em si pode ser relativo ao pai e, dessa forma, o espaçamento também será relativo.
Primeira opção: use pseudoelementos, aqui os espaçamentos vertical e horizontal são relativos ao externo. Demo
Mover o espaçamento horizontal para o elemento externo o torna relativo ao pai do externo. Demo
Segunda opção: use posicionamento absoluto. Demo
fonte
Para tornar o elemento filho posicionado absolutamente a partir de seu elemento pai, você precisa definir a posição relativa no elemento pai E a posição absoluta no elemento filho.
Em seguida, no elemento filho 'top' é relativo à altura do pai. Então você também precisa 'traduzir' para cima a criança 50% da sua própria altura.
Existe outra solução usando a caixa flexível.
Você encontrará vantagens / desvantagens para ambos.
fonte
Isso pode ser alcançado com a
writing-mode
propriedade Se você definir um elementowriting-mode
para um modo de gravação vertical, como, por exemplovertical-lr
, os valores percentuais de preenchimento e margem de seus descendentes em ambas as dimensões, tornar-se-á relativo à altura em vez da largura.Das especificações :
A definição de tamanho embutido :
Exemplo, com um elemento redimensionável, em que as margens horizontais são relativas à largura e as margens verticais são relativas à altura.
O uso de um modo de escrita vertical pode ser particularmente útil nas circunstâncias em que você deseja que a proporção de um elemento permaneça constante, mas que seu tamanho seja dimensionado em correlação com a altura em vez da largura.
fonte
-webkit-
prefixo, mas, de acordo com a caniuse , não é necessário o prefixo desde o Safari 11. Você tentou com algum navegador no qual não funcionava?Outra maneira de centralizar o texto de uma linha é:
ou apenas
fonte
Um estofamento de 50% não irá centralizar seu filho, ele o colocará abaixo do centro. Eu acho que você realmente quer 25% de preenchimento. Talvez você esteja ficando sem espaço à medida que seu conteúdo fica mais alto? Você também tentou definir o margin-top em vez de padding-top?
EDIT: Nevermind, diz o site w3schools
Então, talvez ele sempre use largura? Eu nunca tinha notado.
O que você está fazendo pode ser obtido usando display: table (pelo menos para navegadores modernos). A técnica é explicada aqui .
fonte
line-height
, ou seja, crie 200px de altura de linha?Este é um bug muito interessante. (Na minha opinião, é um bug de qualquer maneira) Bom achado!
Sobre como configurá-lo, eu recomendaria a resposta de Camilo Martin. Mas, por que , eu gostaria de explicar um pouco se vocês não se importam.
Nas especificações CSS encontrei:
... o que é estranho, mas tudo bem.
Assim, com pai
width: 210px
e filhopadding-top: 50%
, recebo um valor calculado / calculado depadding-top: 96.5px
- que não é o esperado105px
.Isso ocorre no Windows (não tenho certeza sobre outros sistemas operacionais), o tamanho das barras de rolagem comuns é por padrão
17px × 100%
(ou100% × 17px
para barras horizontais). Aqueles17px
são subtraídos antes de calcular o50%
, portanto50% of 193px = 96.5px
.fonte