Estou tendo dificuldades para entender minha escala de fonte.
Atualmente, tenho este site com um corpo font-size
de 100%. 100% do que? Isso parece calcular em 16 pixels.
Fiquei com a impressão de que 100% de alguma forma se referiria ao tamanho da janela do navegador, mas aparentemente não porque sempre tem 16 pixels, se a janela é redimensionada para uma largura móvel ou área de trabalho widescreen completa.
Como posso fazer a escala do texto no meu site em relação ao seu contêiner? Eu tentei usar em
, mas isso também não aumenta.
Meu raciocínio é que coisas como o meu menu ficam esmagadas quando você redimensiona, então preciso reduzir o px
font-size
de .menuItem
entre outros elementos em relação à largura do contêiner. (Por exemplo, no menu em uma área de trabalho grande, 22px
funciona perfeitamente. Mova para a largura da mesa gráfica e 16px
é mais apropriado.)
Estou ciente de que posso adicionar pontos de interrupção, mas realmente quero que o texto seja dimensionado, além de ter pontos de interrupção extras; caso contrário, acabarei com centenas de pontos de interrupção para cada 100pixels de diminuição na largura para controlar o texto.
fonte
font-size: 100%;
significa 100% do tamanho do texto (isto é, o que ele herda de seu pai). Por padrão, isso é 16px. Portanto, se você usasse 50%, seria o tamanho da fonte: 8pxRespostas:
EDIT: Se o contêiner não for o corpo, o CSS Tricks cobre todas as suas opções em Ajustando texto a um contêiner .
Se o contêiner for o corpo, o que você está procurando é o tamanho da porcentagem da viewport :
Os valores são:
vw
(% da largura da janela de visualização)vh
(% da altura da janela de visualização)vi
(1% do tamanho da viewport na direção do eixo embutido do elemento raiz)vb
(1% do tamanho da janela de exibição na direção do eixo do bloco do elemento raiz)vmin
(o menor devw
ouvh
)vmax
(o maior ouvw
ouvh
)1 v * é igual a 1% do bloco inicial.
Usá-lo é assim:
Como você pode ver, quando a largura da janela de exibição aumenta, o mesmo ocorre
font-size
sem a necessidade de usar consultas de mídia.Esses valores são uma unidade de dimensionamento, exatamente como
px
ouem
, para que também possam ser usados para dimensionar outros elementos, como largura, margem ou preenchimento.O suporte ao navegador é muito bom, mas você provavelmente precisará de um substituto, como:
Confira as estatísticas de suporte: http://caniuse.com/#feat=viewport-units .
Além disso, confira Truques CSS para uma visão mais ampla: Tipografia de tamanho de viewport
Aqui está um bom artigo sobre como definir tamanhos mínimo / máximo e exercer um pouco mais de controle sobre os tamanhos: Controle preciso sobre tipografia responsiva
E aqui está um artigo sobre como definir seu tamanho usando calc () para que o texto preencha a janela de visualização: http://codepen.io/CrocoDillon/pen/fBJxu
Além disso, consulte este artigo, que usa uma técnica apelidada de 'derretido' para ajustar também a altura da linha. Liderança derretida em CSS
fonte
FitText.js
alternativa fornecida na parte inferior do artigo fornecida por @jbenjohnson.Mas e se o contêiner não for a viewport (corpo)?
Esta pergunta é feita em um comentário por Alex sob a resposta aceita .
Esse fato não significa
vw
que não possa ser utilizado, até certo ponto, no tamanho desse contêiner. Agora, para ver qualquer variação, é preciso supor que o contêiner seja de alguma forma flexível em tamanho. Seja por porcentagem diretawidth
ou por 100% menos margens. O ponto se torna "discutível" se o contêiner estiver sempre definido como, digamos,200px
largo - então apenas defina umfont-size
que funcione para essa largura.Exemplo 1
Com um contêiner de largura flexível, no entanto, deve-se perceber que, de alguma forma, o contêiner ainda está sendo dimensionado para fora da viewport . Como tal, é uma questão de ajustar uma
vw
configuração com base nessa diferença percentual de tamanho na janela de visualização, o que significa levar em consideração o tamanho dos wrappers pai. Veja este exemplo :Supondo que aqui
div
é filho dobody
, é50%
dessa100%
largura, que é o tamanho da janela de visualização neste caso básico. Basicamente, você deseja definir umvw
que ficará bem para você. Como você pode ver no meu comentário no conteúdo CSS acima, você pode "pensar" matematicamente com relação ao tamanho total da janela de exibição, mas não precisa fazer isso. O texto vai "flexionar" com o contêiner porque ele está flexionando com o redimensionamento da viewport. UPDATE: veja um exemplo de dois contêineres de tamanhos diferentes .Exemplo 2
Você pode ajudar a garantir o dimensionamento da viewport forçando o cálculo com base nisso. Considere este exemplo :
O dimensionamento ainda é baseado na janela de exibição, mas é essencialmente configurado com base no próprio tamanho do contêiner.
O tamanho do contêiner deve mudar dinamicamente ...
Se o dimensionamento do elemento do contêiner acabasse alterando dinamicamente sua relação percentual, seja por
@media
pontos de interrupção ou por JavaScript, qualquer que fosse o "destino" base, seria necessário recalcular para manter o mesmo "relacionamento" para o tamanho do texto.Veja o exemplo 1 acima. Se a largura
div
foi alterada25%
por um@media
ou outro JavaScript, ao mesmo tempo,font-size
seria necessário ajustar a consulta de mídia ou o JavaScript para o novo cálculo de5vw * .25 = 1.25
. Isso colocaria o tamanho do texto no mesmo tamanho que teria sido se a "largura" do50%
contêiner original tivesse sido reduzida pela metade do tamanho da janela de exibição, mas agora foi reduzida devido a uma alteração no seu próprio cálculo de porcentagem.Um desafio
Com a
calc()
função CSS3 em uso, seria difícil ajustar dinamicamente, pois essa função não funciona parafont-size
propósitos no momento. Portanto, você não poderá fazer um ajuste puro do CSS 3 se a largura estiver mudandocalc()
. Obviamente, um pequeno ajuste de largura das margens pode não ser suficiente para justificar qualquer alteraçãofont-size
, por isso pode não ser importante.fonte
@media
ponto de interrupção para alterar a forma como a fonte é dimensionada nesse ponto (essencialmente, fornecendo um tamanho fixo no alcancemax-width
) . Apenas um pensamento para trabalhar com umamax-width
situação.Solução com SVG:
https://jsfiddle.net/qc8ht5eb/
Solução com SVG e quebra de texto usando
foreignObject
:https://jsfiddle.net/2rp1q0sy/
fonte
Em um dos meus projetos, uso uma "mistura" entre vw e vh para ajustar o tamanho da fonte às minhas necessidades, por exemplo:
Sei que isso não responde à pergunta do OP, mas talvez possa ser uma solução para qualquer outra pessoa.
fonte
vmin
e / ou emvmax
vez disso.Solução Pure-CSS com
calc()
, unidades CSS e matemáticaIsso não é exatamente o que o OP pede, mas pode tornar o dia de alguém. Essa resposta não é fácil e precisa de algumas pesquisas sobre o desenvolvedor.
Eu vim finalmente para obter uma solução de CSS puro para isso usando
calc()
unidades diferentes. Você precisará de algum entendimento matemático básico de fórmulas para definir sua expressãocalc()
.Quando resolvi isso, tive que obter um cabeçalho responsivo de largura de página inteira com alguns pais que preenchiam poucos pais no DOM. Vou usar meus valores aqui, substituí-los pelos seus.
Para matemática
Você precisará de:
padding: 3em
e a largura total, então isso chegou a100wv - 2 * 3em
X é a largura do contêiner; portanto, substitua-o por sua própria expressão ou ajuste o valor para obter texto de página inteira.
R
é a proporção que você terá. Você pode obtê-lo ajustando os valores em alguma viewport, inspecionando a largura e a altura do elemento e substituindo-os por seus próprios valores. Além disso, éwidth / heigth
;)E bang! Funcionou! eu escrevi
para o meu cabeçalho e se ajustou bem em todas as janelas de exibição.
Mas como isso funciona?
Precisamos de algumas constantes aqui em cima.
100vw
significa a largura total da janela de visualização, e meu objetivo era estabelecer um cabeçalho de largura total com algum preenchimento.A proporção. Obter uma largura e altura em uma viewport me proporcionou uma proporção para brincar, e com a relação eu sei qual deve ser a altura na outra largura da viewport. Calculá-los com a mão levaria muito tempo e pelo menos muita largura de banda, portanto, não é uma boa resposta.
Conclusão
Eu me pergunto por que ninguém descobriu isso e algumas pessoas estão dizendo que isso seria impossível de mexer com CSS. Não gosto de usar JavaScript para ajustar elementos, por isso não aceito respostas em JavaScript (e esqueço o jQuery) sem precisar cavar mais. Em suma, é bom que isso tenha sido descoberto e este seja um passo para implementações de CSS puro no design de sites.
Peço desculpas por qualquer convenção incomum no meu texto, não sou nativo em inglês e também sou bastante novo ao escrever respostas do Stack Overflow.
Também deve-se notar que temos barras de rolagem ruins em alguns navegadores. Por exemplo, ao usar o Firefox, notei que isso
100vw
significa toda a largura da janela de exibição, estendendo-se sob a barra de rolagem (onde o conteúdo não pode ser expandido!); Portanto, o texto da largura total deve ser cuidadosamente marginado e, de preferência, testado em vários navegadores e dispositivos.fonte
x
é de 640 e a relaçãor
de 16: 9, de modo que:x = 640px, r = 16 / 9, y = x / r = 640px / (16 / 9) = 360px
Existe uma grande filosofia para esse problema.
A coisa mais fácil a fazer seria fornecer um determinado tamanho de fonte ao corpo (eu recomendo 10) e, em seguida, todo o outro elemento teria sua fonte em
em
ourem
. Vou dar um exemplo para entender essas unidades.Em
é sempre relativo ao seu pai:Rem
é sempre relativo ao corpo:E então você pode criar um script que modifique o tamanho da fonte em relação à largura do seu contêiner. Mas não é isso que eu recomendaria. Porque em um contêiner de 900 pixels de largura, por exemplo, você teria um
p
elemento com um tamanho de fonte de 12 pixels, digamos. E, na sua ideia, isso se tornaria um contêiner de 300 pixels de largura e tamanho de fonte de 4 pixels. Tem que haver um limite inferior.Outras soluções seriam com consultas de mídia, para que você possa definir a fonte para diferentes larguras.
Mas as soluções que eu recomendaria é usar uma biblioteca JavaScript que o ajude com isso. E o fittext.js que encontrei até agora.
fonte
rem
unidade é relativa ao elemento raiz, significando ohtml
elemento, não obody
elemento. O elemento raiz no DOM é ahtml
tag. developer.mozilla.org/pt-BR/docs/Web/CSS/length ..rem
sempre é relativo àhtml
tag, que é o elemento raiz, não a tag body. mas a boa resposta :)Aqui está a função:
Em seguida, converta todos os tamanhos de fonte do elemento filho dos documentos em
em
's ou'%
.Em seguida, adicione algo assim ao seu código para definir o tamanho da fonte base.
http://jsfiddle.net/0tpvccjt/
fonte
return this
no final da função. Para o desempenho, você também pode querer renunciar ao redimensionamento para que não seja redesenhado à medida que você arrasta. É um código bastante simples, para que alguém possa basear sua solução aprimorada com pouco esforço.Existe uma maneira de fazer isso sem JavaScript!
Você pode usar uma imagem SVG embutida. Você pode usar CSS em um SVG se estiver embutido. Você deve se lembrar que o uso desse método significa que sua imagem SVG responderá ao tamanho do contêiner.
Tente usar a seguinte solução ...
HTML
CSS
Exemplo: https://jsfiddle.net/k8L4xLLa/32/
Quer algo mais chamativo?
As imagens SVG também permitem fazer coisas legais com formas e lixo. Confira este ótimo caso de uso para texto escalável ...
https://jsfiddle.net/k8L4xLLa/14/
fonte
vw
dimensionamento. se você alterar o texto, tudo sairá do limite.Isso pode não ser super prático, mas se você deseja que uma fonte seja uma função direta do pai, sem ter JavaScript que escute / faça um loop (intervalo) para ler o tamanho da div / página, existe uma maneira de fazê-lo. . Iframes.
Qualquer coisa dentro do iframe considerará o tamanho do iframe como o tamanho da viewport. Portanto, o truque é criar um iframe cuja largura seja a largura máxima que você deseja que o seu texto e cuja altura seja igual à altura máxima * a proporção de aspecto do texto específico.
Deixando de lado a limitação de que as unidades de janela de exibição também não podem aparecer nas unidades-mãe laterais para texto (como em ter o tamanho% se comportando como todo mundo), as unidades de janela de exibição fornecem uma ferramenta muito poderosa: conseguir a dimensão mínima / máxima . Você não pode fazer isso em nenhum outro lugar - você não pode dizer ... faça com que a altura dessa div seja a largura do pai *.
Dito isso, o truque é usar vmin e definir o tamanho do iframe para que [fração] * altura total seja um bom tamanho de fonte quando a altura for a dimensão limitadora e [fração] * largura total quando a largura for a dimensão limitadora. É por isso que a altura deve ser um produto da largura e da proporção.
Para o meu exemplo particular, você tem
O pequeno incômodo com esse método é que você precisa definir manualmente o CSS do iframe. Se você anexar o arquivo CSS inteiro, isso exigiria muita largura de banda para muitas áreas de texto. Então, o que faço é anexar a regra que desejo diretamente do meu CSS.
Você pode escrever uma função pequena que obtém a regra CSS / todas as regras CSS que afetariam a área de texto.
Não consigo pensar em outra maneira de fazer isso sem ter algum JavaScript de ciclismo / escuta. A solução real seria os navegadores fornecerem uma maneira de escalar o texto em função do contêiner pai e também fornecer a mesma funcionalidade do tipo vmin / vmax.
JSFiddle: https://jsfiddle.net/0jr7rrgm/3/ (clique uma vez para bloquear o quadrado vermelho do mouse e clique novamente para liberar)
A maior parte do JavaScript no violino é apenas a minha função de arrastar e clicar personalizada.
fonte
srcdoc
: jsfiddle.net/wauzgob6/3Usando
vw
,em
& co. funciona com certeza, mas na IMO sempre precisa do toque de um humano para o ajuste fino.Aqui está um script que eu escrevi com base na resposta @ tnt-rox ' que tenta automatizar o toque daquele humano:
Basicamente, reduz o tamanho da fonte
1em
e começa a aumentar em 0,1 até atingir a largura máxima.JSFiddle
fonte
ems
exige um toque humano e um ritmo vertical não é algum tipo de feitiçaria.100% é relativo ao tamanho da fonte base, que, se você não a definiu, seria o padrão de agente do usuário do navegador.
Para obter o efeito desejado, eu usaria um código JavaScript para ajustar o tamanho da fonte base em relação às dimensões da janela.
fonte
Dentro do seu CSS, tente adicionar isso na parte inferior, alterando a largura de 320 pixels para onde quer que seu design comece a quebrar:
Em seguida, forneça o tamanho da fonte em "px" ou "em" como desejar.
fonte
Minha própria solução, baseada em jQuery, funciona aumentando gradualmente o tamanho da fonte até que o contêiner obtenha um grande aumento de altura (o que significa que houve uma quebra de linha).
É bem simples, mas funciona muito bem e é muito fácil de usar. Você não precisa saber nada sobre a fonte que está sendo usada, tudo é tratado pelo navegador.
Você pode brincar com ele em http://jsfiddle.net/tubededentifrice/u5y15d0L/2/
A mágica acontece aqui:
fonte
Esse componente da Web altera o tamanho da fonte para que a largura do texto interno corresponda à largura do contêiner. Confira a demonstração .
Você pode usá-lo assim:
fonte
Você pode estar procurando algo parecido com isto:
http://jsfiddle.net/sijav/dGsC9/4/
http://fiddle.jshell.net/sijav/dGsC9/4/show/
Eu usei flowtype e está funcionando muito bem (no entanto, é JavaScript e não uma solução CSS pura):
fonte
Eu preparei uma função de escala simples usando transformação CSS em vez de tamanho da fonte. Você pode usá-lo dentro de qualquer contêiner, não precisa definir consultas de mídia etc. :)
Postagem no blog: cabeçalho escalável em CSS e JS de largura total
O código:
Demonstração de trabalho: https://codepen.io/maciejkorsan/pen/BWLryj
fonte
Usar variáveis CSS
Ninguém mencionou variáveis CSS ainda, e essa abordagem funcionou melhor para mim, então:
Digamos que você tenha uma coluna em sua página com 100% da largura da tela de um usuário móvel, mas com
max-width
800 px, portanto, na área de trabalho, há espaço nos dois lados da coluna. Coloque isso no topo da sua página:E agora você pode usar essa variável (em vez da
vw
unidade embutida ) para definir o tamanho da sua fonte. Por exemploNão é uma abordagem CSS pura , mas é bem próxima.
fonte
Tente http://simplefocus.com/flowtype/ . É isso que eu uso nos meus sites e funcionou perfeitamente.
fonte
Meu problema era semelhante, mas relacionado à escala de texto em um cabeçalho. Tentei o Fit Font, mas precisava alternar o compressor para obter resultados, pois estava resolvendo um problema um pouco diferente, como era o Text Flow.
Então, escrevi meu próprio pequeno plug-in que reduziu o tamanho da fonte para caber no contêiner, supondo que você tenha
overflow: hidden
ewhite-space: nowrap
, mesmo que reduzir a fonte ao mínimo não permita exibir o cabeçalho completo, apenas corta o que pode ser mostrado.fonte
Artisticamente, se você precisar ajustar duas ou mais linhas de texto na mesma largura, independentemente da contagem de caracteres, terá boas opções.
É melhor encontrar uma solução dinâmica para que, seja qual for o texto digitado, tenhamos uma boa exibição.
Vamos ver como podemos nos aproximar.
Tudo o que fazemos é obter a largura (
els[0].clientWidth
) e o tamanho da fonte (parseFloat(window.getComputedStyle(els[0],null).getPropertyValue("font-size"))
) da primeira linha como referência e, em seguida, apenas calcular o tamanho da fonte das linhas subsequentes de acordo.fonte
Tente usar o plug- in fitText , porque o tamanho da Viewport não é a solução para esse problema.
Basta adicionar a biblioteca:
E altere o tamanho da fonte para corrigir por configurações o coeficiente de texto:
Você pode definir valores máximos e mínimos de texto:
fonte
Dê uma olhada no meu código. Faz o
font size smaller
quefit
quer que esteja lá.Mas acho que isso não leva a uma boa experiência do usuário
fonte
Como fallback do JavaScript (ou sua única solução), você pode usar meu plug-in jQuery Scalem , que permite escalar em relação ao elemento pai (contêiner) passando a
reference
opçãofonte
Caso seja útil para qualquer pessoa, a maioria das soluções nesse segmento estava agrupando texto em várias linhas, formulário e.
Mas então eu encontrei isso e funcionou:
https://github.com/chunksnbits/jquery-quickfit
Exemplo de uso:
$('.someText').quickfit({max:50,tolerance:.4})
fonte
Sempre tenha seu elemento com este atributo:
JavaScript:
element.style.fontSize = "100%";
ou
CSS:
style = "font-size: 100%;"
Quando você entra em tela cheia, já deve ter uma variável de escala calculada (escala> 1 ou escala = 1). Em seguida, em tela cheia:
Funciona muito bem com pouco código.
fonte
Para texto dinâmico, este plugin é bastante útil:
http://freqdec.github.io/slabText/
Basta adicionar CSS:
E o script:
fonte
Isso funcionou para mim:
Eu tento aproximar o tamanho da fonte com base em uma largura / altura obtida com a definição de `tamanho da fonte: 10 px '. Basicamente, a idéia é "se eu tiver 20 pixels de largura e 11 pixels de altura com` font-size: 10px`, então qual seria o tamanho máximo da fonte para calcular um contêiner de 50 pixels de largura e 30 pixels de altura? "
A resposta é um sistema de dupla proporção:
{20: 10 = 50: X, 11: 10 = 30: Y} = {X = (10 * 50) / 20, Y = (10 * 30) / 11}
Agora X é um tamanho de fonte que corresponderá à largura e Y é um tamanho de fonte que corresponderá à altura; pegue o menor valor
Nota: o argumento da função deve ser um elemento de amplitude ou um elemento menor que seu pai, caso contrário, se filhos e pai tiverem a mesma função largura / altura falharão.
fonte
Não vejo nenhuma resposta com referência à propriedade CSS flex, mas também pode ser muito útil.
fonte
Para ajustar o tamanho da fonte ao seu contêiner, e não à janela, veja a
resizeFont()
função que compartilhei nesta pergunta (uma combinação de outras respostas, a maioria das quais já está vinculada aqui). É acionado usandowindow.addEventListener('resize', resizeFont);
.Vanilla JavaScript: redimensionar fontes incríveis para caber no contêiner
JavaScript:
Talvez você possa usar vw / vh como um substituto, para atribuir dinamicamente
em
ourem
unidades usando JavaScript, assegurando que as fontes fazer escala para a janela se JavaScript está desativado.Aplique a
.resize
classe a todos os elementos que contêm o texto que você deseja dimensionar.Ative a função antes de adicionar o ouvinte de redimensionamento de janela. Em seguida, qualquer texto que não se encaixe no contêiner será reduzido quando a página for carregada e redimensionada.
NOTA: O padrão
font-size
deve ser definida paraem
,rem
ou%
para alcançar resultados adequados.fonte
HTML
Código JavaScript para maximizar o tamanho da fonte:
fonte