Estoy usando Twitter Bootstrap en un proyecto. Además de los estilos de arranque predeterminados, también he agregado algunos de los míos.
//My styles
@media (max-width: 767px)
{
//CSS here
}
También estoy usando jQuery para cambiar el orden de ciertos elementos en la página cuando el ancho de la ventana gráfica es inferior a 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"));
}
}
El problema que tengo es que el ancho calculado por $(window).width()
y el ancho calculado por el CSS no parece ser el mismo. Cuando $(window).width()
devuelve 767, el CSS calcula el ancho de la ventana gráfica como 751, por lo que parece haber un 16px diferente.
¿Alguien sabe qué está causando esto y cómo podría resolver el problema? La gente ha sugerido que el ancho de la barra de desplazamiento no se tiene en cuenta y el uso $(window).innerWidth() < 751
es el camino a seguir. Sin embargo, idealmente quiero encontrar una solución que calcule el ancho de la barra de desplazamiento y que sea coherente con mi consulta de medios (por ejemplo, donde ambas condiciones se comparan con el valor 767). ¿Porque seguramente no todos los navegadores tendrán un ancho de barra de desplazamiento de 16px?
Respuestas:
Si no tiene que soportar IE9, simplemente puede usar
window.matchMedia()
( documentación de MDN ).window.matchMedia
es totalmente coherente con las consultas de medios CSS y el soporte del navegador es bastante bueno: http://caniuse.com/#feat=matchmediaACTUALIZAR:
Si tiene que admitir más navegadores, puede usar el método mq de Modernizr , es compatible con todos los navegadores que entienden las consultas de medios en CSS.
fuente
Modernizr.mq
solo devuelve un valor booleano, por lo que debe llamarlo usted mismo en unonresize
controlador de eventos.window.matchMedia
es la forma recomendada, ya que no activa un reflujo , dependiendo de la frecuencia con la que llame a la función, esto puede causar un problema de rendimiento. Si no desea utilizar Modernizr directamente, puede copiar el código fuente de src / mq.js y src / injectElementWithStyles.js .Verifique una regla CSS que cambia la consulta de medios. Esto está garantizado para trabajar siempre.
http://www.fourfront.us/blog/jquery-window-width-and-media-queries
HTML:
Javascript:
CSS:
fuente
<div id="xs-indicator" class="xs-visible">
Puede deberse a
scrollbar
, usar eninnerWidth
lugar dewidth
comoTambién puedes obtener el me
viewport
gustaCódigo anterior Fuente
fuente
innerWidth()
o úselo como$('body').innerWidth();
Vea este stackoverflow.com/questions/8339377/…window.innerWidth
no es consistente con las consultas de medios CSS en Safari 8 si las barras de desplazamiento están habilitadas en las preferencias del sistema OSX.Sí, eso se debe a la barra de desplazamiento. Fuente de respuesta correcta: ingrese la descripción del enlace aquí
fuente
Tal vez sea una mejor práctica no aplicar un alcance JS al ancho del documento, sino algún tipo de cambio realizado por la consulta css @media. Con este método puede estar seguro de que la función JQuery y el cambio de CSS ocurren al mismo tiempo.
css:
jquery:
fuente
Estaba enfrentando el mismo problema recientemente, también con Bootstrap 3.
Ni $ .width () ni $ .innerWidth () funcionarán para usted.
La mejor solución que se me ocurrió, y está específicamente diseñada para BS3,
es verificar el ancho de un
.container
elemento.Como probablemente sepa cómo funciona el
.container
elemento,es el único elemento que le dará el ancho actual establecido por las reglas BS css.
Entonces va algo como
fuente
Utilizar
Esto resolvió mi problema
fuente
Aquí hay una alternativa a los métodos mencionados anteriormente que se basan en cambiar algo a través de CSS y leerlo a través de Javascript. Este método no necesita
window.matchMedia
ni Modernizr. Tampoco necesita ningún elemento HTML adicional. Funciona mediante el uso de un pseudo-elemento HTML para 'almacenar' información de punto de interrupción:He utilizado
body
como un ejemplo, se puede utilizar cualquier elemento HTML para esto. Puede agregar cualquier cadena o número que desee encontent
el pseudo-elemento. No tiene que ser 'móvil', etc.Ahora podemos leer esta información de Javascript de la siguiente manera:
De esta manera, siempre estamos seguros de que la información del punto de interrupción es correcta, ya que proviene directamente de CSS y no tenemos que preocuparnos por obtener el ancho de pantalla correcto a través de Javascript.
fuente
querySelector()
ogetPropertyValue()
. También puede buscar comillas simples en regex (ya que no es consistente). Este:window.getComputedStyle(document.body, ':after').content.replace(/"|'/g, '')
. Y, para que sea un poco menos costoso, puede envolverlo en subrayado / lodash._debounce()
con ~ 100ms de espera. Finalmente, agregar atributos a <html> hace que la salida esté disponible para otras cosas, como las cláusulas de desactivación de información sobre herramientas que buscan indicadores / datos sin procesar fuera de vars. Ejemplo: gist.github.com/dhaupin/f01cd87873092f4fe2fb8d802f9514b1Javascript proporciona más de un método para verificar el ancho de la ventana gráfica. Como notó, innerWidth no incluye el ancho de la barra de herramientas, y los anchos de la barra de herramientas diferirán entre los sistemas. También está el opción externalWidth , que incluirá el ancho de la barra de herramientas. La API de Javascript de Mozilla dice:
El estado de javascript es tal que no se puede confiar en un significado específico para externalWidth en cada navegador en cada plataforma.
outerWidth
no es compatible con navegadores móviles más antiguos , aunque goza de soporte en los principales navegadores de escritorio y en la mayoría de los navegadores de teléfonos inteligentes más nuevos.Como señaló Ausi,
matchMedia
sería una gran opción ya que CSS está mejor estandarizado (matchMedia usa JS para leer los valores de viewport detectados por CSS). Pero incluso con los estándares aceptados, todavía existen navegadores retrasados que los ignoran (IE <10 en este caso, lo que hace que matchMedia no sea muy útil al menos hasta que XP muera).En resumen , si solo está desarrollando para navegadores de escritorio y navegadores móviles más nuevos, externalWidth debería darle lo que está buscando, con algunas advertencias .
fuente
Aquí hay un truco menos complicado para lidiar con las consultas de los medios. La compatibilidad entre navegadores es un poco limitante, ya que no es compatible con IE móvil.
Consulte la documentación de Mozilla para más detalles.
fuente
prueba esto
fuente
Solución alternativa que siempre funciona y se sincroniza con las consultas de medios CSS.
Agregar un div al cuerpo
Agregue estilo y cámbielos ingresando en una consulta de medios específica
Luego, en JS, verifique el estilo que está cambiando al ingresar a la consulta de medios
Por lo tanto, generalmente puede verificar cualquier estilo que se esté modificando ingresando en una consulta de medios específica.
fuente
La mejor solución entre navegadores es usar Modernizr.mq
enlace: https://modernizr.com/docs/#mq
Modernizr.mq le permite verificar mediante programación si el estado actual de la ventana del navegador coincide con una consulta de medios.
Nota El navegador no admite consultas de medios (p. Ej., IE antiguo) mq siempre devolverá falso.
fuente
fuente
Lo que hago ;
y llame a aWidth variable en cualquier lugar después.
Debe colocar getWidth () en el cuerpo del documento para asegurarse de que se cuenta el ancho de la barra de desplazamiento; de lo contrario, el ancho de la barra de desplazamiento del navegador se restará de getWidth ().
fuente
Deslizador deslizante de implementación y muestra diferentes números de diapositivas en el bloque dependiendo de la resolución (jQuery)
fuente
Prueba esto
Para más referencia haga clic aquí
fuente