Antes de nos aprofundarmos no que você está perguntando, vamos revisar um pouco sobre por que a viewport
metatag existe em primeiro lugar. Aqui está o que eu recolhi.
Por que precisamos da viewport
tag?
Uma janela de visualização é uma área em que o conteúdo da web pode ser visto. Normalmente, a página renderizada (conteúdo da Web) é maior que a janela de visualização. Como resultado, geralmente usamos barras de rolagem para ver o conteúdo oculto (porque a janela de exibição não pode exibir tudo). Citado no Nível 1 do Módulo de adaptação de dispositivos CSS :
A janela de visualização estreita é um problema para documentos projetados para ficar bem em navegadores de desktop. O resultado é que os fornecedores de navegadores móveis usam uma inicial fixa que contém um tamanho de bloco diferente do tamanho da porta de visualização e próximo ao de uma janela típica do navegador de desktop. Além de rolar ou deslocar, o zoom costuma ser usado para alternar entre uma visão geral do documento e ampliar áreas específicas do documento para ler e interagir.
Em dispositivos móveis (e outros dispositivos menores), o bloco inicial contém geralmente maior que a janela de visualização. Por exemplo, um dispositivo móvel com largura de tela 640px
pode ter um bloco inicial de 980px
. Nesse caso, o bloco inicial de contenção é reduzido para 640px
que possa ser ajustado na tela do celular. Essa 640px
largura (largura da tela) é o que se chama initial-width
da janela de visualização que será pertinente à nossa discussão.
Então .... Por que precisamos dessa viewport
tag? Hoje em dia, temos consultas de mídia que nos permitem projetar para dispositivos móveis. No entanto, essa consulta de mídia depende da largura da janela de exibição real . Em dispositivos móveis, o agente do usuário estiliza automaticamente o tamanho da viewport inicial para um tamanho fixo diferente (geralmente maior que o tamanho da viewport inicial). Portanto, se a largura da viewport de um dispositivo móvel for fixa, as regras CSS usadas nas consultas de mídia não serão executadas simplesmente porque a largura da viewport nunca muda. Usando a viewport
tag, podemos controlar a largura real da janela de exibição (depois de ser estilizada pelo UA). Citado em MDN :
No entanto, esse mecanismo não é tão bom para páginas otimizadas para telas estreitas usando consultas de mídia - se a viewport virtual for de 980px, por exemplo, as consultas de mídia com 640px ou 480px ou menos nunca serão usadas, limitando a eficácia de tais técnicas de design responsivo.
Observe que a viewport
tag também pode alterar a altura real da viewport, não apenas a largura
viewport
Tag width
O width
em uma viewport
tag é traduzido para max-width
na @viewport
regra. Quando você declara o width
as device-width
, ele é traduzido 100%
na @viewport
regra. O valor da porcentagem é resolvido com base na initial-width
janela de exibição. Portanto, se ainda estamos usando o exemplo acima, o valor max-width
será resolvido 640px
. Como você descobriu, isso especifica apenas o max-width
. O min-width
será automaticamente extend-to-zoom
.
extend-to-zoom
Sua pergunta foi: qual é exatamente o valor da extensão para zoom ? Pelo que eu deduzi, é o valor usado para suportar a viewport se estendendo para caber na área de visualização em um determinado nível de zoom. Em outras palavras, é um valor de tamanho da janela de visualização que muda com base no valor de zoom especificado. Um exemplo? Dado que o max-zoom
valor da folha de estilo do UA é 5.0
e o initial-width
é 320px
, <meta name="viewport" content="width=10">
será resolvido com uma largura real inicial de 64px
. Isso faz sentido, porque se um dispositivo tiver apenas 320 px e puder apenas ampliar 5x
o valor normal, o tamanho mínimo da viewport seria 320px divided by 5
, o que significa mostrar apenas 64 px por vez ( e não 10px
porque isso exigiria o zoom de 32x!). Esse valor será usado pelo algoritmo para determinar como estender (alterar) os valores min-width
e max-width
, que desempenharão um papel na determinação da largura real da janela de exibição.
Juntando tudo
Então, essencialmente, qual é a diferença entre <meta name="viewport" content="width=device-width, initial-scale=1.0">
e <meta name="viewport" content="initial-scale=1.0">
? Simplesmente refaça as etapas do algoritmo ( isto e isto ). Vamos fazer o último (aquele sem width
atributo) primeiro. (Vamos assumir que o initial-width
da viewport é 640px
.)
width
não está definido, isso resulta max-width
e min-width
permanece extend-to-zoom
na @viewport
regra.
initial-scale
é 1.0
. Isso significa que o zoom
valor também é1.0
- Vamos resolver
extend-to-zoom
. Passos:
extend-zoom = MIN(zoom, max-zoom)
. A MIN
operação resolve para o valor que não é auto
. Aqui, zoom
é 1.0
e max-zoom
é auto
. Isso significa que extend-zoom
é1.0
extend-width = initial-width / extend-zoom
. Isso é facil; divida 640 por 1. Você recebe extend-width
é igual a640
- Como
extend-zoom
não é auto
, pularemos para a segunda condicional. max-width
é extend-to-zoom
, de fato , isso significa que max-width
será definido como extend-width
. Portanto,max-width = 640
min-width
é também extend-to-zoom
, isso significa definir min-width
como max-width
. Nós temosmin-width = 640
- Depois de resolver os valores não
auto
(ou seja, os extend-to-zoom
) para max-width
e min-width
. Podemos prosseguir para o próximo procedimento . Como min-width
ou max-width
não auto
, usaremos o primeiro if
no procedimento, configurando assim a viewport real inicial width
como MAX(min-width, MIN(max-width, initial-width))
, o que equivale a MAX(640, MIN(640, 640))
. Isso resolve 640
para sua viewport real inicialwidth
- Passando para o próximo procedimento . Nesta etapa,
width
não é auto
. O valor não é alterado e terminamos com a viewport real width
de640px
Vamos fazer o primeiro.
width
está definido, isso resulta em max-width
estar 100%
( 640px
no nosso caso) e min-width
estar extend-to-zoom
na @viewport
regra.
initial-scale
é 1.0
. Isso significa que o zoom
valor também é1.0
- Vamos resolver
extend-to-zoom
. Se você seguir as etapas com cuidado (quase o mesmo que acima), você terminará com um max-width
de 640px
e um min-width
de 640px
.
- Você provavelmente pode ver o padrão agora. Obteremos a largura real da janela de visualização de
640px
.
Então, qual é a diferença percebida? Essencialmente nenhum . Ambos fazem a mesma coisa. Espero que minha explicação ajude ;-) Se algo estava errado, diga-me.
1.0
, mas não tenho certeza disso. De qualquer forma, ótima resposta, obrigado!viewport
atributo tag é quando você não especifica oinitial-scale
. Por exemplo, quando você escreve<meta name="viewport" content="360px">
, sabe que não está controlando o nível de zoom inicial. Como tal, nos meus testes limitados, o estilo UA sempre diminui (através de algum procedimento que pode não ser normativo) a viewport. No entanto, a viewport real sempre permanecerá na largura de360px
, independentemente do tamanho inicial da viewport.<meta name="viewport" content="360px", initial-scale=1.0>
, está fazendo omin-width
toextend-to-zoom
e associado a umzoom
valor, isso sempre será resolvido com o maior valor entre a largura da viewport inicial dividida pelo valor do zoom e omax-width
. No procedimento de restrição (seção 7.2), você verá que owidth = MAX(min-width, MIN(max-width, initial-width))
. Dos meus testes limitados, minha inferência é que quando omax-width
especificado é menor que o ...max-width
valor for maior que a largura inicial da viewport, o valor mínimo será a largura inicial da viewport e o valor máximo será omax-width
valor. Oextend-to-zoom
semanticamente faz sentido, porque oextend-to-zoom
nomin-width
literalmente estende o valor para a largura da viewport quando o zoom é1.0
. E isso está alinhado com a resposta acima, queextend-to-zoom
altera / amplia / aumenta owidth
valor dado um nível de zoom.initial-scale
atributo, mas é uma das maneiras de produzir uma diferença percebida. Revisão para o meu primeiro comentário, o estilo do UA também pode aumentar o zoom (não apenas diminuir) a janela de visualização quando a largura do dispositivo for maior que 360px.