Estou usando o Twitter Bootstrap em um projeto. Além dos estilos de inicialização padrão, também adicionei alguns dos meus
//My styles
@media (max-width: 767px)
{
//CSS here
}
Também estou usando o jQuery para alterar a ordem de certos elementos na página quando a largura da janela de exibição é menor que 767px.
$(document).load($(window).bind("resize", checkPosition));
function checkPosition()
{
if($(window).width() < 767)
{
$("#body-container .main-content").remove().insertBefore($("#body-container .left-sidebar"));
} else {
$("#body-container .main-content").remove().insertAfter($("#body-container .left-sidebar"));
}
}
O problema que estou tendo é que a largura calculada por $(window).width()
e a largura calculada pelo CSS não parecem ser iguais. Quando $(window).width()
retorna 767, o css calcula a largura da janela de visualização como 751, de modo que parece haver uma diferença de 16px.
Alguém sabe o que está causando isso e como eu poderia resolver o problema? As pessoas sugeriram que a largura da barra de rolagem não está sendo levada em consideração e o uso $(window).innerWidth() < 751
é o caminho a percorrer. No entanto, idealmente, quero encontrar uma solução que calcule a largura da barra de rolagem e que seja consistente com minha consulta de mídia (por exemplo, onde ambas as condições estão verificando o valor 767). Porque certamente nem todos os navegadores terão uma largura de barra de rolagem de 16px?
fonte
Respostas:
Se você não precisar dar suporte ao IE9, basta usar
window.matchMedia()
( documentação MDN ).window.matchMedia
é totalmente consistente com as consultas de mídia CSS e o suporte ao navegador é bastante bom: http://caniuse.com/#feat=matchmediaATUALIZAR:
Se você precisar dar suporte a mais navegadores, poderá usar o método mq do Modernizr , ele suporta todos os navegadores que entendem consultas de mídia em CSS.
fonte
Modernizr.mq
retorna apenas um valor booleano, então você deve chamá-lo você mesmo em umonresize
manipulador de eventos.window.matchMedia
é o caminho recomendado, porque não aciona um reflow , dependendo da frequência com que você chama a função, isso pode causar um problema de desempenho. Se você não quiser usar o Modernizr diretamente, poderá copiar o código fonte de src / mq.js e src / injectElementWithStyles.js .Verifique uma regra CSS em que a consulta de mídia seja alterada. Isso é garantido para sempre funcionar.
http://www.fourfront.us/blog/jquery-window-width-and-media-queries
HTML:
Javascript:
CSS:
fonte
<div id="xs-indicator" class="xs-visible">
Pode ser devido a
scrollbar
, use eminnerWidth
vez dewidth
comoAlém disso, você pode obter o
viewport
gostoCódigo acima Fonte
fonte
innerWidth()
ou você pode usá-lo como$('body').innerWidth();
Veja este stackoverflow.com/questions/8339377/…window.innerWidth
não é consistente com as consultas de mídia CSS no Safari 8 se as barras de rolagem estiverem ativadas nas preferências do sistema OSX.sim, isso é devido à barra de rolagem. Fonte da resposta correta: insira a descrição do link aqui
fonte
Talvez seja uma prática melhor não escopo JS da largura do documento, mas algum tipo de alteração feita pela consulta css @media. Com esse método, você pode ter certeza de que a função JQuery e a alteração de css acontecem ao mesmo tempo.
css:
jquery:
fonte
Eu estava enfrentando o mesmo problema recentemente - também com o Bootstrap 3.
Nem $ .width () nem $ .innerWidth () funcionarão para você.
A melhor solução que encontrei - e é especificamente adaptada ao BS3 -
é verificar a largura de um
.container
elemento.Como você provavelmente sabe como o
.container
elemento funciona,é o único elemento que fornecerá a largura atual definida pelas regras BS css.
Então é algo como
fonte
Usar
Isso resolveu meu problema
fonte
Aqui está uma alternativa aos métodos mencionados anteriormente, que dependem da alteração de algo via CSS e da leitura via Javascript. Este método não precisa
window.matchMedia
ou Modernizr. Ele também não precisa de elemento HTML extra. Ele funciona usando um pseudoelemento HTML para 'armazenar' as informações do ponto de interrupção:Eu usei
body
como exemplo, você pode usar qualquer elemento HTML para isso. Você pode adicionar qualquer sequência ou número que desejar aocontent
pseudoelemento. Não precisa ser 'móvel' e assim por diante.Agora podemos ler essas informações do Javascript da seguinte maneira:
Dessa forma, sempre temos certeza de que as informações do ponto de interrupção estão corretas, pois são provenientes diretamente do CSS e não precisamos incomodar em obter a largura de tela correta via Javascript.
fonte
querySelector()
ougetPropertyValue()
. Você também pode procurar aspas simples em regex (já que não é consistente). Este:window.getComputedStyle(document.body, ':after').content.replace(/"|'/g, '')
. E, para tornar isso um pouco mais barato, você pode colocá-lo em sublinhado / lodash._debounce()
com ~ 100ms de espera. Finalmente, anexar atributos a <html> torna a saída disponível para outras coisas, como cláusulas de desativação da dica de ferramenta à procura de sinalizadores / dados brutos fora dos vars. Exemplo: gist.github.com/dhaupin/f01cd87873092f4fe2fb8d802f9514b1Javascript fornece mais de um método para verificar a largura da janela de exibição. Como você notou, innerWidth não inclui a largura da barra de ferramentas, e as larguras da barra de ferramentas diferem entre os sistemas. Há também a opção outerWidth , que incluirá a largura da barra de ferramentas. A API Javascript da Mozilla declara:
O estado do javascript é tal que não se pode confiar em um significado específico para outerWidth em todos os navegadores em todas as plataformas.
outerWidth
não é bem suportado em navegadores móveis mais antigos , embora tenha suporte nos principais navegadores de desktop e nos navegadores de smartphones mais recentes.Como ausi apontou,
matchMedia
seria uma ótima opção, pois o CSS é melhor padronizado (o matchMedia usa JS para ler os valores de viewport detectados pelo CSS). Mas mesmo com os padrões aceitos, ainda existem navegadores retardados que os ignoram (neste caso, IE <10, o que torna o matchMedia não muito útil pelo menos até a morte do XP).Em resumo , se você estiver desenvolvendo apenas para navegadores de desktop e navegadores móveis mais recentes, a outerWidth deverá fornecer o que você está procurando, com algumas ressalvas .
fonte
Aqui está um truque menos envolvido para lidar com consultas de mídia. O suporte a vários navegadores é um pouco limitante, pois não suporta o IE móvel.
Veja a documentação do Mozilla para mais detalhes.
fonte
tente isso
fonte
Solução alternativa que sempre funciona e é sincronizada com consultas de mídia CSS.
Adicionar uma div ao corpo
Adicione estilo e altere-o inserindo uma consulta de mídia específica
Em seguida, no JS, verifique o estilo que você está alterando, inserindo na consulta de mídia
Portanto, geralmente você pode verificar qualquer estilo que está sendo alterado inserindo uma consulta de mídia específica.
fonte
A melhor solução para vários navegadores é usar o Modernizr.mq
link: https://modernizr.com/docs/#mq
Modernizr.mq permite verificar programaticamente se o estado atual da janela do navegador corresponde a uma consulta de mídia.
Nota O navegador não suporta consultas de mídia (por exemplo, IE antigo) mq sempre retornará false.
fonte
fonte
O que eu faço ;
e chame a variável aWidth em qualquer lugar posteriormente.
Você precisa colocar o getWidth () no corpo do documento para garantir que a largura da barra de rolagem seja contada; caso contrário, a largura da barra de rolagem do navegador subtraída de getWidth ().
fonte
Controle deslizante de implementação e exibir diferentes números de slides no bloco, dependendo da resolução (jQuery)
fonte
Tente isto
Para mais referência clique aqui
fonte