J'utilise Twitter Bootstrap sur un projet. En plus des styles d'amorçage par défaut, j'ai également ajouté certains de mes propres styles
//My styles
@media (max-width: 767px)
{
//CSS here
}
J'utilise également jQuery pour modifier l'ordre de certains éléments sur la page lorsque la largeur de la fenêtre d'affichage est inférieure à 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"));
}
}
Le problème que j'ai est que la largeur calculée par $(window).width()
et la largeur calculée par le CSS ne semblent pas être les mêmes. Lorsque $(window).width()
renvoie 767, le CSS calcule la largeur de la fenêtre comme 751, il semble donc y avoir un 16px différent.
Quelqu'un sait-il ce qui cause cela et comment je pourrais résoudre le problème? Les gens ont suggéré que la largeur de la barre de défilement n'est pas prise en compte et que l'utilisation $(window).innerWidth() < 751
est la voie à suivre. Cependant, idéalement, je veux trouver une solution qui calcule la largeur de la barre de défilement et qui soit cohérente avec ma requête multimédia (par exemple, où les deux conditions sont vérifiées par rapport à la valeur 767). Parce que tous les navigateurs n'auront sûrement pas une largeur de barre de défilement de 16px?
Réponses:
Si vous n'avez pas à prendre en charge IE9, vous pouvez simplement utiliser
window.matchMedia()
( documentation MDN ).window.matchMedia
est parfaitement compatible avec les requêtes multimédias CSS et la prise en charge du navigateur est assez bonne: http://caniuse.com/#feat=matchmediaMETTRE À JOUR:
Si vous devez prendre en charge plus de navigateurs, vous pouvez utiliser la méthode mq de Modernizr , elle prend en charge tous les navigateurs qui comprennent les requêtes multimédias en CSS.
la source
Modernizr.mq
ne renvoie qu'une valeur booléenne, vous devez donc l'appeler vous-même dans unonresize
gestionnaire d'événements.window.matchMedia
est la méthode recommandée, car elle ne déclenche pas redistribution , en fonction de la fréquence à laquelle vous appelez la fonction, cela peut entraîner un problème de performances. Si vous ne souhaitez pas utiliser Modernizr directement, vous pouvez copier le code source depuis src / mq.js et src / injectElementWithStyles.js .Vérifiez une règle CSS que la requête multimédia change. Ceci est garanti pour toujours fonctionner.
http://www.fourfront.us/blog/jquery-window-width-and-media-queries
HTML:
Javascript:
CSS:
la source
<div id="xs-indicator" class="xs-visible">
Cela peut être dû à
scrollbar
, utilisezinnerWidth
plutôt quewidth
commeVous pouvez également obtenir le
viewport
semblableSource du code ci-dessus
la source
innerWidth()
ou vous pouvez l'utiliser comme$('body').innerWidth();
Voir ce stackoverflow.com/questions/8339377/…window.innerWidth
n'est pas compatible avec les requêtes multimédias CSS dans Safari 8 si les barres de défilement sont activées dans les préférences système OSX.oui, c'est dû à la barre de défilement. Bonne réponse: entrez la description du lien ici
la source
Il est peut-être préférable de ne pas définir avec JS la largeur du document, mais une sorte de changement effectué par la requête css @media. Avec cette méthode, vous pouvez être sûr que la fonction JQuery et le changement css se produisent en même temps.
css:
jquery:
la source
J'étais confronté au même problème récemment - également avec Bootstrap 3.
Ni $ .width () ni $ .innerWidth () ne fonctionneront pour vous.
La meilleure solution que j'ai trouvée - et est spécifiquement adaptée à BS3 -
est de vérifier la largeur d'un
.container
élément.Comme vous savez probablement comment fonctionne l'
.container
élément,c'est le seul élément qui vous donnera la largeur actuelle définie par les règles BS css.
Donc ça va quelque chose comme
la source
Utilisation
Cela a résolu mon problème
la source
Voici une alternative aux méthodes mentionnées précédemment qui reposent sur la modification de quelque chose via CSS et la lecture via Javascript. Cette méthode n'a pas besoin
window.matchMedia
ou Modernizr. Il n'a également besoin d'aucun élément HTML supplémentaire. Cela fonctionne en utilisant un pseudo-élément HTML pour `` stocker '' les informations de point d'arrêt:J'ai utilisé
body
comme exemple, vous pouvez utiliser n'importe quel élément HTML pour cela. Vous pouvez ajouter n'importe quelle chaîne ou nombre de votre choix danscontent
le pseudo-élément. N'a pas besoin d'être «mobile» et ainsi de suite.Nous pouvons maintenant lire ces informations à partir de Javascript de la manière suivante:
De cette façon, nous sommes toujours sûrs que les informations sur les points d'arrêt sont correctes, car elles proviennent directement de CSS et nous n'avons pas à nous soucier d'obtenir la bonne largeur d'écran via Javascript.
la source
querySelector()
ougetPropertyValue()
. Vous pouvez également rechercher des guillemets simples dans l'expression régulière (car ce n'est pas cohérent). Ceci:window.getComputedStyle(document.body, ':after').content.replace(/"|'/g, '')
. Et, pour rendre cela un peu moins cher, vous pouvez l'envelopper dans un trait de soulignement / lodash._debounce()
avec ~ 100 ms d'attente. Enfin, l'ajout d'attribs à <html> rend la sortie disponible pour d'autres éléments tels que les clauses de désactivation de l'info-bulle recherchant des indicateurs / données bruts en dehors des vars. Exemple: gist.github.com/dhaupin/f01cd87873092f4fe2fb8d802f9514b1Javascript fournit plus d'une méthode pour vérifier la largeur de la fenêtre. Comme vous l'avez remarqué, innerWidth n'inclut pas la largeur de la barre d'outils et les largeurs de la barre d'outils diffèrent selon les systèmes. Il existe également l' option externalWidth , qui inclura la largeur de la barre d'outils. L' API Mozilla Javascript déclare:
L'état de javascript est tel que l'on ne peut pas se fier à une signification spécifique pour externalWidth dans chaque navigateur sur chaque plate-forme.
outerWidth
n'est pas bien pris en charge sur les anciens navigateurs mobiles , bien qu'il bénéficie d'une prise en charge sur les principaux navigateurs de bureau et la plupart des navigateurs de téléphones intelligents les plus récents.Comme l'ausi l'a souligné, ce
matchMedia
serait un excellent choix car CSS est mieux standardisé (matchMedia utilise JS pour lire les valeurs de la fenêtre détectées par CSS). Mais même avec les normes acceptées, il existe encore des navigateurs retardés qui les ignorent (IE <10 dans ce cas, ce qui rend matchMedia peu utile au moins jusqu'à la mort de XP).En résumé , si vous développez uniquement pour des navigateurs de bureau et des navigateurs mobiles plus récents, externalWidth devrait vous donner ce que vous recherchez, avec quelques mises en garde .
la source
Voici une astuce moins complexe pour traiter les requêtes des médias. La prise en charge de plusieurs navigateurs est un peu limitative car elle ne prend pas en charge IE mobile.
Consultez la documentation de Mozilla pour plus de détails.
la source
essaye ça
la source
Solution de contournement qui fonctionne toujours et est synchronisée avec les requêtes multimédias CSS.
Ajouter un div au corps
Ajoutez du style et modifiez-les en entrant dans une requête multimédia spécifique
Ensuite, dans JS, vérifiez le style que vous modifiez en entrant dans la requête multimédia
Donc, généralement, vous pouvez vérifier n'importe quel style qui est modifié en entrant dans une requête multimédia spécifique.
la source
La meilleure solution multi-navigateurs consiste à utiliser Modernizr.mq
lien: https://modernizr.com/docs/#mq
Modernizr.mq vous permet de vérifier par programme si l'état actuel de la fenêtre du navigateur correspond à une requête multimédia.
Remarque Le navigateur ne prend pas en charge les requêtes multimédias (par exemple, l'ancien IE) mq retournera toujours false.
la source
la source
Ce que je fais ;
et appelez une variable Width n'importe où par la suite.
Vous devez mettre getWidth () dans le corps de votre document pour vous assurer que la largeur de la barre de défilement est comptée, sinon la largeur de la barre de défilement du navigateur soustraite de getWidth ().
la source
Slick de mise en œuvre et affichage de différents nombres de diapositives dans le bloc en fonction de la résolution (jQuery)
la source
Essaye ça
Pour plus de références, cliquez ici
la source