A questão parece ser que certas letras, como g
, y
, q
, etc. que têm uma cauda que se inclina para baixo, não permitem a centragem vertical. Aqui está uma imagem para mostrar o problema .
Os caracteres na caixa verde são basicamente perfeitos, pois não têm cauda descendente. Aqueles na caixa vermelha demonstram o problema.
Eu gostaria que todos os personagens estivessem perfeitamente centralizados na vertical. Na imagem, os caracteres com uma cauda descendente não são centralizados verticalmente. É possível corrigir isso?
Aqui está o violino que demonstra o problema por completo .
.avatar {
border-radius: 50%;
display: inline-block;
text-align: center;
width: 125px;
height: 125px;
font-size: 60px;
background-color: rgb(81, 75, 93);
font-family: "Segoe UI";
margin-bottom: 10px;
}
.character {
position: relative;
top: 50%;
transform: translateY(-50%);
line-height: 100%;
color: #fff;
}
<div class="avatar">
<div class="character">W</div>
</div>
<div class="avatar">
<div class="character">y</div>
</div>
javascript
html
css
vertical-alignment
Chron Bag
fonte
fonte
v
nay
eo
parte nag
estão na mesma linha que o ponto mais baixo para as letras maiúsculas. Com a sua lógica, Å, Ä, Ö seria alinhado como A e O, mas não podem ser. Se você quiser fazer algo especial a respeito, precisará usar o javascript para verificar se é uma letra minúscula e depois empurrar o personagem para alguns caracteres.Respostas:
Aqui está a minha solução usando JS. A idéia é transformar o elemento em uma imagem, a fim de obter seus dados como pixel, percorrê-los para encontrar as partes superior e inferior de cada caractere e aplicar uma tradução para corrigir o alinhamento. Isso funcionará com propriedades de fonte dinâmica.
O código não é otimizado, mas destaca a ideia principal:
Mostrar snippet de código
ATUALIZAR
Aqui está uma primeira otimização do código:
Estou usando o plugin dom-to-image para isso.
fonte
Â
para mostrar que sua centralização não é o ideal como eu comentei em sua resposta;) Ele provavelmente vai mudar de idéia depois de ver isso e aceitar as obras de fontes maneiraTalvez exista uma resposta melhor, mas parece que a única maneira é aplicar manualmente estilos diferentes, dependendo se é um dos seguintes:
Agora observe que, no meu entendimento, as alturas relativas de caudas e caules que eu acho que são definidas pela fonte. Não tenho certeza se existe uma maneira de acessar isso programaticamente - portanto, você pode precisar ajustar esses valores com a fonte.
Observe também que essa solução não funcionaria no suporte a vários idiomas - pois você precisaria definir em qual categoria cada caractere se encaixa em dezenas de conjuntos de caracteres diferentes.
fonte
ÂË
eâë
Esta é uma situação complicada!
Do que eu posso dizer, isso será mais difícil fazer escalável nativamente (ie
%
,vw
ouvh
valores em vez depx
ouem
). Se você precisar fazer isso parecer bonito no celular ou tablet, considere usar minha solução com@media
pontos de interrupção.Minha solução basicamente detecta se é um elemento minúsculo com uma cauda e adiciona uma classe para compensar a altura para compensar a cauda.
Em meus testes, ele não parece que qualquer manipuladores adicionais foram necessários para capital de letras ou minúsculas letras sem uma cauda . Fique à vontade para me corrigir se eu estiver errado.
Existe um JSFiddle se você quiser mexer e alterar / testar esta solução.
Deixe-me saber seus pensamentos e se eu perdi alguma coisa. Seria legal obter uma solução final para isso, pois eu já tive problemas semelhantes no passado!
fonte
Você provavelmente precisaria de uma classe auxiliar para isso, para poder traduzir mais as letras minúsculas do que as maiúsculas. Um script simples pode facilmente colocar essas classes auxiliares automaticamente.
Espero que isso resolva o problema para você :)
fonte
y
não está centrado. Tweek um pouco mais!o
ey
e você vai ter isso. Os caracteres com rabos criam o problema em primeiro lugar (mencionado no post).