Como posso detectar o nível de zoom da página em todos os navegadores modernos? Embora este tópico explique como fazê-lo no IE7 e IE8, não consigo encontrar uma boa solução entre navegadores.
O Firefox armazena o nível de zoom da página para acesso futuro. No carregamento da primeira página, seria possível obter o nível de zoom? Em algum lugar que li, funciona quando ocorre uma alteração de zoom após o carregamento da página.
Existe uma maneira de interceptar o
'zoom'
evento?
Preciso disso porque alguns dos meus cálculos são baseados em pixels e podem variar quando ampliados.
Amostra modificada fornecida por @tfl
Esta página alerta diferentes valores de altura quando ampliada. [jsFiddle]
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js" type="text/javascript"/></script>
</head>
<body>
<div id="xy" style="border:1px solid #f00; width:100px;">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque sollicitudin tortor in lacus tincidunt volutpat. Integer dignissim imperdiet mollis. Suspendisse quis tortor velit, placerat tempor neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent bibendum auctor lorem vitae tempor. Nullam condimentum aliquam elementum. Nullam egestas gravida elementum. Maecenas mattis molestie nisl sit amet vehicula. Donec semper tristique blandit. Vestibulum adipiscing placerat mollis.</div>
<button onclick="alert($('#xy').height());">Show</button>
</body>
</html>
javascript
browser
zoom
detection
subestimar
fonte
fonte
Respostas:
Agora é uma bagunça ainda maior do que era quando essa pergunta foi feita pela primeira vez. Da leitura de todas as respostas e postagens do blog que pude encontrar, aqui está um resumo. Também configurei esta página para testar todos esses métodos de medir o nível de zoom .
Edit (12/12/2011): adicionei um projeto que pode ser clonado: https://github.com/tombigel/detect-zoom
screen.deviceXDPI / screen.logicalXDPI
(ou, para o nível de zoom em relação ao zoom padrãoscreen.systemXDPI / screen.logicalXDPI
)var body = document.body,r = body.getBoundingClientRect(); return (r.left-r.right)/body.offsetWidth;
(graças a este exemplo ou a esta resposta )screen.width
/ largura da tela de consulta de mídia (veja abaixo) (aproveita o fato descreen.width
usar pixels do dispositivo, mas a largura do MQ usar pixels CSS - graças às larguras do modo Quirks )-webkit-text-size-adjust:none
.document.width / jQuery(document).width()
(graças a Dirk van Oosterbosch acima ). Para obter uma proporção em termos de pixels do dispositivo (em vez de em relação ao zoom padrão), multiplique porwindow.devicePixelRatio
.parseInt(getComputedStyle(document.documentElement,null).width) / document.documentElement.clientWidth
( desta resposta )document.documentElement.offsetWidth
/ largura de umaposition:fixed; width:100%
div. daqui ( a tabela de larguras do Quirksmode diz que é um bug; innerWidth deve ser px de CSS). Usamos a posição: elemento fixo para obter a largura da janela de visualização, incluindo o espaço onde estão as barras de rolagem ; document.documentElement.clientWidth exclui essa largura. Isso está quebrado desde que em 2011; Não sei mais como obter o nível de zoom no Opera.Aqui está uma pesquisa binária do Firefox 4, pois não conheço nenhuma variável em que ela esteja exposta:
fonte
zoom: screen.deviceXDPI / screen.logicalXDPI,
, em vez dezoom: screen.systemXDPI / screen.logicalXDPI,
matchMedia
. Paul Irish também escreveu um polyfill matchMedia semelhante que faz parte do Modernizr .Podes tentar
Isso fornecerá o nível percentual de zoom do navegador em telas que não sejam da retina. Para exibições altas de DPI / retina, produziria valores diferentes (por exemplo, 200 para Chrome e Safari, 140 para Firefox).
Para capturar um evento de zoom, você pode usar
fonte
devicePixelRatio
. Isso também me ajudou muito a mudar umfixed
elemento para um elementoabsolute
posicionado quando o evento de zoom ocorre ou quando o valor inicial dasdevicePixelRatio
alterações. Perfeito! Obrigado!!Math.round(window.devicePixelRatio * 100)
funciona no Chrome, IE, Edge e Firefox. Safari no iMac sempre retorna 200.Para mim, para o Chrome / Webkit,
document.width / jQuery(document).width()
não funcionou. Quando reduzi a janela e ampliei o zoom no site, de forma que as barras de rolagem horizontais aparecessem,document.width / jQuery(document).width()
não era igual a 1 no zoom padrão. Isto é porquedocument.width
inclui parte do documento fora da janela de exibição.Usando
window.innerWidth
ewindow.outerWidth
trabalhado. Por alguma razão, no Chrome, a largura externa é medida em pixels da tela e a largura interna é medida em pixels css.fonte
isZoomed = (screenCssPixelRatio < .98 || screenCssPixelRatio > 1.02)
switch
declaração pode ser melhor do que muitas declarações if else.Eu e meu colega de trabalho usamos o script em https://github.com/tombigel/detect-zoom . Além disso, também criamos dinamicamente um elemento svg e verificamos sua propriedade currentScale. Funciona muito bem no Chrome e provavelmente na maioria dos navegadores. No FF, o recurso "somente texto de zoom" deve ser desativado. O SVG é suportado na maioria dos navegadores. No momento da redação deste artigo, testado no IE10, FF19 e Chrome28.
fonte
Achei este artigo extremamente útil. Um enorme obrigado a yonran. Eu queria transmitir um aprendizado adicional que encontrei ao implementar algumas das técnicas que ele forneceu. No FF6 e no Chrome 9, foi adicionado suporte para consultas de mídia do JS, o que pode simplificar bastante a abordagem de consulta de mídia necessária para determinar o zoom no FF. Veja os documentos no MDN aqui . Para meus propósitos, eu só precisava detectar se o navegador estava com mais ou menos zoom, não era necessário o fator de zoom real. Consegui obter minha resposta com uma linha de JavaScript:
Combinando isso com as soluções IE8 + e Webkit, que também eram linhas únicas, consegui detectar o zoom na grande maioria dos navegadores que acessam nosso aplicativo com apenas algumas linhas de código.
fonte
devicePixelRatio
: leva em consideração o dimensionamento da exibição.É tudo o que você precisa.
fonte
10
a partirouterWidth
?Eu tenho uma solução para isso a partir de janeiro de 2016. Testado trabalhando nos navegadores Chrome, Firefox e MS Edge.
O princípio é o seguinte. Colete 2 pontos MouseEvent que estão distantes. Cada evento do mouse vem com coordenadas de tela e documento. Meça a distância entre os 2 pontos nos dois sistemas de coordenadas. Embora existam deslocamentos fixos variáveis entre os sistemas de coordenadas devido à mobília do navegador, a distância entre os pontos deve ser idêntica se a página não for ampliada. A razão para especificar "distantes" (eu coloquei isso como 12 pixels) é para que pequenas alterações de zoom (por exemplo, 90% ou 110%) sejam detectáveis.
Referência: https://developer.mozilla.org/en/docs/Web/Events/mousemove
Passos:
Adicionar um ouvinte de movimentação do mouse
Capture 4 medidas dos eventos do mouse:
Meça a distância d_c entre os 2 pontos no sistema do cliente
Meça a distância d_s entre os 2 pontos no sistema de tela
Se d_c! = D_s, o zoom será aplicado. A diferença entre os dois indica a quantidade de zoom.
Nota: Apenas faça os cálculos de distância raramente, por exemplo, quando você pode experimentar um novo evento de mouse que está longe do anterior.
Limitações: pressupõe que o usuário mova o mouse pelo menos um pouco e o zoom não é conhecido até esse momento.
fonte
Você pode usar a API do Visual Viewport :
É padrão e funciona tanto em computadores quanto em dispositivos móveis: suporte ao navegador .
fonte
No Internet Explorer 7, 8 e 9, isso funciona:
O "+0.9" é adicionado para evitar erros de arredondamento (caso contrário, você obteria 104% e 109% quando o zoom do navegador estiver definido para 105% e 110%, respectivamente).
No IE6, o zoom não existe; portanto, não é necessário verificar o zoom.
fonte
O que eu vim com é:
1) Faça um
position:fixed
<div>
comwidth:100%
( id = zoomdiv )2) quando a página carrega:
E funcionou para mim
ctrl+
ectrl-
amplia.ou posso adicionar a linha a um
$(window).onresize()
evento para obter o nível de zoom ativoCódigo:
PS: este é o meu primeiro post, perdoe qualquer erro
fonte
screen.availWidth
informa a largura da tela em pixels da tela, não na janela do navegador).Isso funcionou muito bem para mim em navegadores baseados em webkit (Chrome, Safari):
Parece não funcionar no Firefox.
Isso também funciona no WebKit:
fonte
document.width
retorna indefinidoBasicamente, temos:
window.devicePixelRatio
que leva em consideração o zoom no nível do navegador * e a densidade do zoom / pixel do sistema.* - no nível de zoom do Mac / Safari não é levado em consideração
vw
/vh
Unidades CSSresize
evento, que é acionado após a alteração do nível de zoom, causa mudanças efetivas no tamanho das janelasisso deve ser suficiente para UX normal . Se você precisar detectar o nível de zoom, isso pode ser um sinal de mau design da interface do usuário.
O zoom de inclinação é mais difícil de rastrear e não é considerado atualmente.
fonte
Em dispositivos móveis (com Chrome para Android ou Opera Mobile), você pode detectar o zoom em window.visualViewport.scale . https://developer.mozilla.org/en-US/docs/Web/API/Visual_Viewport_API
Detectar no Safari: document.documentElement.clientWidth / window.innerWidth (retorne 1 se não houver zoom no dispositivo).
fonte
Seus cálculos ainda são baseados em vários pixels CSS. Eles são apenas um tamanho diferente na tela agora. Esse é o ponto do zoom da página inteira.
O que você gostaria que acontecesse em um navegador em um dispositivo de 192 dpi que, portanto, normalmente exibia quatro pixels de dispositivo para cada pixel em uma imagem? Com 50% de zoom, este dispositivo agora exibe um pixel de imagem em um pixel.
fonte
No Chrome
fonte
Não testou isso no IE, mas se você criar um elemento
elem
comentão
fornece o nível de zoom do navegador (incluindo o
document.body.style.zoom
fator).fonte
Isso é para o Chrome , na sequência da resposta do usuário800583 ...
Passei algumas horas nesse problema e não encontrei uma abordagem melhor, mas:
window.outerWidth/window.innerWidth
, e quando não é, a proporção parece ser(window.outerWidth-16)/window.innerWidth
, no entanto, o primeiro caso pode ser abordado pelo segundo.Então eu vim para o seguinte ...
Mas essa abordagem tem limitações: por exemplo, se você tocar acordeão com a janela do aplicativo (aumentar e reduzir rapidamente a largura da janela), haverá intervalos entre os níveis de zoom, embora o zoom não tenha sido alterado (pode ser a largura externa e a largura interna não são exatamente atualizado ao mesmo tempo).
E se você quiser o fator:
fonte
Eu tenho esta solução apenas para celular (testada com Android):
Se você quiser o nível de zoom logo após a movimentação da pitada, provavelmente terá que definir um tempo limite devido ao atraso na renderização (mas não tenho certeza porque não o testei).
fonte
Esta resposta é baseada em comentários sobre o devicePixelRatio retornando incorretamente na resposta do usuário1080381.
Descobri que esse comando também estava retornando incorretamente em alguns casos ao trabalhar com uma área de trabalho, o Surface Pro 3 e o Surface Pro 4.
O que descobri é que funcionava na minha área de trabalho, mas o SP3 e o SP4 estavam fornecendo números diferentes um do outro e da área de trabalho.
Percebi, porém, que o SP3 estava voltando com uma vez e meia o nível de zoom que eu esperava. Quando dei uma olhada nas configurações de vídeo, o SP3 estava realmente definido para 150% em vez dos 100% que eu tinha na minha área de trabalho.
Portanto, a solução para os comentários deve ser dividir o nível de zoom retornado pela escala da máquina em que você está atualmente.
Consegui obter a escala nas configurações do Windows, fazendo o seguinte:
Portanto, no caso do meu SP3, é assim que esse código parece com 100% de zoom:
Multiplicando os 100 na resposta original do usuário1080381, você obteria um zoom de 100 (%).
fonte
Tê-lo funcionando atualmente, no entanto ainda precisa separar pelo navegador. Testado com sucesso no Chrome (75) e Safari (11.1) (ainda não encontrou caminho para o FF). Ele também obtém o valor de zoom correto na exibição da retina e os cálculos são acionados no evento de redimensionamento.
fonte
aqui isso não muda !:
Para criar um arquivo html simples, clique no botão independentemente do nível de zoom: ele mostrará a largura de 400px (pelo menos no Firefox e ie8)
fonte
Isso pode ou não ajudar ninguém, mas eu tinha uma página que não conseguia acessar corretamente, não importando quais truques de Css eu tentei, então escrevi um arquivo de chamada JQuery na Central de Página:
O problema ocorreu com o nível de zoom do navegador; a página mudaria com base em se você fosse 100%, 125%, 150% etc.
O código abaixo está em um arquivo JQuery chamado centerpage.js.
Na minha página, tive que vincular ao JQuery e esse arquivo para fazê-lo funcionar, mesmo que minha página mestre já tivesse um link para o JQuery.
centerpage.js
:Além disso, se você deseja centralizar um painel:
fonte
Esta pergunta foi publicada há muito tempo, mas hoje, quando eu estava procurando a mesma resposta "Como detectar eventos de aumento e redução de zoom", não consegui encontrar uma resposta adequada para todos os navegadores.
Como agora: no Firefox / Chrome / IE8 e IE9, o zoom in e out dispara um evento window.resize. Isso pode ser capturado usando:
fonte
Uma solução alternativa para o FireFox 16+ encontrar o DPPX (nível de zoom) apenas com JavaScript:
fonte
fonte
O problema está nos tipos de monitor usados, um monitor 4K e um monitor padrão. O Chrome é de longe o mais inteligente em nos dizer qual é o nível de zoom usando
window.devicePixelRatio
, aparentemente ele pode dizer qual é a densidade de pixels e relata o mesmo número para importar o que for.Outros navegadores, nem tanto. O IE e o Edge são provavelmente os piores, pois lidam com os níveis de zoom de maneira muito diferente. Para obter o mesmo tamanho de texto em um monitor de 4k, é necessário selecionar 200%, em vez de 100% em um monitor padrão.
Em maio de 2018, eis o que tenho para detectar os níveis de zoom em alguns dos navegadores mais populares, Chrome, Firefox e IE11. Eu tenho que me dizer qual é a porcentagem de zoom. Para o IE, ele relata 100%, mesmo para monitores 4K que estão realmente em 200%, mas o tamanho do texto é realmente o mesmo.
Aqui está um violino: https://jsfiddle.net/ae1hdogr/
Se alguém quiser dar uma facada em outros navegadores e atualizar o violino, faça isso. Meu principal objetivo era cobrir esses três navegadores para detectar se as pessoas estavam usando um fator de zoom maior que 100% para usar meu aplicativo da web e exibir um aviso sugerindo um fator menor de zoom.
fonte