Je développe actuellement un site réactif en utilisant Twitter Bootstrap.
Le site a une image d'arrière-plan plein écran sur mobile / tablette / bureau. Ces images tournent et disparaissent chacune, en utilisant deux divs.
C'est presque parfait, sauf un problème. En utilisant iOS Safari, le navigateur Android ou Chrome sur Android, l'arrière-plan saute légèrement lorsqu'un utilisateur fait défiler la page et fait masquer la barre d'adresse.
Le site est ici: http://lt2.daveclarke.me/
Visitez-le sur un appareil mobile et faites défiler vers le bas et vous devriez voir l'image redimensionner / déplacer.
Le code que j'utilise pour le DIV d'arrière-plan est le suivant:
#bg1 {
background-color: #3d3d3f;
background-repeat:no-repeat;
background-attachment:fixed;
background-position:center center;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover; position:fixed;
width:100%;
height:100%;
left:0px;
top:0px;
z-index:-1;
display:none;
}
Toutes les suggestions sont les bienvenues - cela me fait la tête depuis un moment !!
position: fixed
.Réponses:
Ce problème est dû au rétrécissement / glissement des barres d'URL et à la modification de la taille des divs # bg1 et # bg2 puisqu'elles sont à 100% de hauteur et "fixes". Étant donné que l'image d'arrière-plan est réglée sur «couverture», elle ajustera la taille / position de l'image à mesure que la zone contenante est plus grande.
En fonction de la nature réactive du site, l'arrière-plan doit être mis à l'échelle. J'envisage deux solutions possibles:
1) Réglez la hauteur # bg1, # bg2 sur 100vh. En théorie, c'est une solution élégante. Cependant, iOS a un bogue vh ( http://thatemil.com/blog/2013/06/13/viewport-relative-unit-strangeness-in-ios-6/ ). J'ai essayé d'utiliser une hauteur maximale pour éviter le problème, mais il est resté.
2) La taille de la fenêtre, lorsqu'elle est déterminée par Javascript, n'est pas affectée par la barre d'URL. Par conséquent, Javascript peut être utilisé pour définir une hauteur statique sur # bg1 et # bg2 en fonction de la taille de la fenêtre. Ce n'est pas la meilleure solution car ce n'est pas du CSS pur et il y a un léger saut d'image lors du chargement de la page. Cependant, c'est la seule solution viable que je vois compte tenu des bogues "vh" d'iOS (qui ne semblent pas être corrigés dans iOS 7).
Sur une note latérale, j'ai vu tellement de problèmes avec ces barres d'URL de redimensionnement dans iOS et Android. Je comprends le but, mais ils doivent vraiment réfléchir aux fonctionnalités étranges et aux ravages qu'ils apportent aux sites Web. Le dernier changement est que vous ne pouvez plus "masquer" la barre d'URL lors du chargement de la page sur iOS ou Chrome à l'aide d'astuces de défilement.
EDIT: Bien que le script ci-dessus fonctionne parfaitement pour empêcher le redimensionnement de l'arrière-plan, il provoque un écart notable lorsque les utilisateurs font défiler vers le bas. C'est parce qu'il maintient la taille de l'arrière-plan à 100% de la hauteur de l'écran moins la barre d'URL. Si nous ajoutons 60px à la hauteur, comme le suggère swiss, ce problème disparaît. Cela signifie que nous ne pouvons pas voir les 60 pixels inférieurs de l'image d'arrière-plan lorsque la barre d'URL est présente, mais cela empêche les utilisateurs de voir un écart.
la source
bg.height(jQuery(window).height() + 60);
qui fonctionne à merveille sur tous mes appareils! Merci :)vh
unités et bien sûr,100vh
c'est plus grand lorsque la barre d'adresse est masquée. C'est stupide que ce saut se produise après l'arrêt du défilement. Cela a juste l'air bogué. J'ai fini par utiliser la transition sur la hauteur pour la faire paraître intentionnelle.body
vers un wrapper<div>
enveloppant tout le contenu de la page. Pas d'arrière-plans sautants sur iOS ou Android!J'ai trouvé que la réponse de Jason ne fonctionnait pas vraiment pour moi et que j'obtenais toujours un saut. Le Javascript assurait qu'il n'y avait pas d'espace en haut de la page mais l'arrière-plan sautait toujours chaque fois que la barre d'adresse disparaissait / réapparaissait. Donc, en plus du correctif Javascript, j'ai appliqué
transition: height 999999s
au div. Cela crée une transition d'une durée si longue qu'elle fige virtuellement l'élément.la source
vw
ouvh
pour définir la taille de la police à l'intérieur de ce conteneur parent.J'ai un problème similaire sur un en-tête de notre site Web.
Cela se terminera par une expérience de défilement instable sur Android Chrome, car le .header-container sera redimensionné après que la barre d'url se soit masquée et que le doigt soit retiré de l'écran.
Solution CSS:
L'ajout des deux lignes suivantes empêchera que la barre d'url se cache et que le défilement vertical soit toujours possible:
la source
Le problème peut être résolu avec une requête multimédia et quelques mathématiques. Voici une solution pour une orientation de portrait:
Puisque vh changera lorsque la barre d'url disparaîtra, vous devez déterminer la hauteur d'une autre manière. Heureusement, la largeur de la fenêtre d'affichage est constante et les appareils mobiles ne sont proposés que dans quelques proportions différentes; si vous pouvez déterminer la largeur et le rapport hauteur / largeur, un peu de maths vous donnera la hauteur de la fenêtre exactement comme vh devrait fonctionner. Voici le processus
1) Créez une série de requêtes multimédias pour les proportions que vous souhaitez cibler.
utilisez le rapport d'aspect de l'appareil au lieu du rapport d'aspect car ce dernier se redimensionnera lorsque la barre d'URL disparaîtra
J'ai ajouté `` max '' au ratio d'aspect de l'appareil pour cibler tous les rapports d'aspect qui se trouvent entre les plus populaires. Ils ne seront pas aussi précis, mais ils ne le seront que pour une minorité d'utilisateurs et seront toujours assez proches du bon vh.
souvenez-vous de la requête multimédia en utilisant horizontal / vertical, donc pour le portrait, vous devrez inverser les chiffres
2) pour chaque requête multimédia, multipliez le pourcentage de hauteur verticale dans lequel vous voulez que l'élément vw soit par l'inverse du rapport hauteur / largeur.
3) Vous devez déterminer la hauteur de la barre d'URL, puis moins celle de la hauteur. Je n'ai pas trouvé de mesures exactes, mais j'utilise 9% pour les appareils mobiles en mode paysage et cela semble fonctionner assez bien.
Ce n'est pas une solution très élégante, mais les autres options ne sont pas non plus très bonnes, étant donné qu'elles sont:
Votre site Web semble bogué à l'utilisateur,
ayant des éléments de taille incorrecte, ou
Utilisation de javascript pour certains styles de base ,
L'inconvénient est que certains appareils peuvent avoir des hauteurs de barre d'URL ou des proportions différentes de celles des plus populaires. Cependant, en utilisant cette méthode si seul un petit nombre d'appareils subit l'ajout / la soustraction de quelques pixels, cela me semble beaucoup mieux que tout le monde ayant un site Web redimensionné lors du balayage.
Pour vous faciliter la tâche, j'ai également créé un mixin SASS:
la source
@mixin vh-fix($vh: 100)
=>height: calc(100vw * (1.333 * $vh / 100) - 9%)
height: calc(100vw * (1.333 * #{$vh} / 100) - 9%)
-9%
.Toutes les réponses ici utilisent la
window
hauteur, qui est affectée par la barre d'URL. Tout le monde a-t-il oublié lascreen
taille?Voici ma solution jQuery:
L'ajout de la
.css()
pièce modifie inévitablement l'élément positionné absolu aligné en haut en élément aligné en bas, il n'y a donc pas de saut du tout. Bien que, je suppose qu'il n'y a aucune raison de ne pas simplement ajouter cela directement au CSS normal.Nous avons besoin du renifleur de l'agent utilisateur car la hauteur de l'écran sur les ordinateurs de bureau ne serait pas utile.
De plus, tout cela suppose
#background
qu'un élément à position fixe remplit la fenêtre.Pour les puristes JavaScript (avertissement - non testé):
EDIT: Désolé que cela ne répond pas directement à votre problème spécifique avec plus d'un arrière-plan. Mais c'est l'un des premiers résultats lors de la recherche de ce problème d'arrière-plans fixes sautant sur mobile.
la source
J'ai également rencontré ce problème lorsque j'essayais de créer un écran d'entrée qui couvrirait toute la fenêtre. Malheureusement, la réponse acceptée ne fonctionne plus.
1) Les éléments dont la hauteur est définie pour
100vh
être redimensionnés chaque fois que la taille de la fenêtre change, y compris les cas où cela est causé par la (dés) apparition de la barre d'URL.2)
$(window).height()
renvoie des valeurs également affectées par la taille de la barre d'URL.Une solution est de "figer" l'élément en utilisant
transition: height 999999s
comme suggéré dans la réponse d'AlexKempton . L'inconvénient est que cela désactive effectivement l'adaptation à tous les changements de taille de la fenêtre, y compris ceux provoqués par la rotation de l'écran.Ma solution consiste donc à gérer manuellement les modifications de la fenêtre à l'aide de JavaScript. Cela me permet d'ignorer les petits changements qui sont susceptibles d'être causés par la barre d'URL et de ne réagir que sur les plus grands.
EDIT: J'utilise en fait cette technique avec
height: 100vh
. La page est rendue correctement dès le début, puis le javascript entre et commence à gérer la hauteur manuellement. De cette façon, il n'y a aucun scintillement pendant le chargement de la page (ou même après).la source
height: 100vh
dans le CSS initial, j'ai définimin-height:100vh
puis, lors du redimensionnement de la fenêtre, je calcule lemin-height
et le règle à la hauteur du port de vue. Ceci est pratique lorsque votre site est affiché sur de petits écrans et que le contenu est trop volumineux pour tenir dans la fenêtre. Un ensemble anti-rebond / accélérateur sur l'événement de redimensionnement permet d'améliorer les performances de certains navigateurs (le redimensionnement a tendance à se déclencher très souvent)min-height
place, mais j'ai rencontré un problème lorsque j'avais besoin de centrer verticalement le contenu interne. Le centrage vertical peut devenir délicat lorsque l'élément extérieur estheight
réglé surauto
. J'ai donc proposé une hauteur minimale fixe qui devrait être suffisante pour contenir tout type de contenu possible et la définir dans le CSS initial. Depuismin-height
a une priorité plus élevée queheight
, cela fonctionne plutôt bien.display: table
, puis en réglant le conteneur interne surdisplay: table-cell
avecvertical-align: middle
. A travaillé comme un charme.La solution que je utilise actuellement est de vérifier la
userAgent
sur$(document).ready
pour voir si elle est l' un des navigateurs fautifs. Si tel est le cas, procédez comme suit:$(window).resize
, ne mettez à jour les valeurs de hauteur pertinentes que si la nouvelle dimension horizontale de la fenêtre est différente de sa valeur initialeSi vous le souhaitez, vous pouvez également tester l'autorisation des redimensionnements verticaux uniquement lorsqu'ils sont au-delà de la hauteur des barres d'adresse.
Oh, et la barre d'adresse affecte
$(window).height
. Voir: Modification de la barre d'adresse du navigateur Webkit mobile (chrome) $ (window) .height (); faire background-size: la couverture est remise à l'échelle à chaque fois JS "Window" largeur-hauteur vs "écran" largeur-hauteur?la source
J'ai trouvé une solution vraiment simple sans utiliser Javascript:
Tout cela retarde le mouvement pour qu'il soit incroyablement lent qu'il ne soit pas perceptible.
la source
100%
-à- dire100vh
. IE8 est le seul navigateur majeur qui ne prend pas en charge les transitions.Ma solution impliquait un peu de javascript. Gardez le 100% ou 100vh sur le div (cela évitera que le div n'apparaisse au chargement initial de la page). Ensuite, lorsque la page se charge, saisissez la hauteur de la fenêtre et appliquez-la à l'élément en question. Évite le saut car maintenant vous avez une hauteur statique sur votre div.
la source
J'ai créé une solution javascript vanille pour utiliser les unités VH. L'utilisation de VH à peu près n'importe où est effectuée par des barres d'adresse minimisées lors du défilement. Pour corriger le jank qui apparaît lorsque la page se redessine, j'ai ce js ici qui va saisir tous vos éléments en utilisant des unités VH (si vous leur donnez la classe
.vh-fix
) et leur donner des hauteurs de pixels en ligne. Essentiellement les congeler à la hauteur que nous voulons. Vous pouvez le faire lors de la rotation ou lors du changement de taille de la fenêtre pour rester réactif.Cela a résolu tous mes cas d'utilisation, j'espère que cela aide.
la source
c'est ma solution pour résoudre ce problème, j'ai ajouté des commentaires directement sur le code. J'ai testé cette solution et fonctionne très bien. J'espère que nous serons utiles pour tout le monde a le même problème.
la source
C'est la meilleure solution (la plus simple) au-dessus de tout ce que j'ai essayé.
... Et cela ne garde pas l'expérience native de la barre d'adresse !
Vous pouvez définir la hauteur avec CSS à 100% par exemple, puis définir la hauteur à 0,9 * de la hauteur de la fenêtre en px avec javascript, lorsque le document est chargé.
Par exemple avec jQuery:
$("#element").css("height", 0.9*$(window).height());
)
Malheureusement, il n'y a rien qui fonctionne avec du CSS pur: P, mais soyez aussi minuscule
vh
etvw
bogue sur les iPhones - utilisez des pourcentages.la source
J'ai défini mon élément width, avec javascript. Après avoir réglé le de vh.
html
css
javascript
Cela fonctionne pour moi. Je n'utilise pas jquery ect. parce que je veux qu'il se charge dès que possible.
la source
Il a fallu quelques heures pour comprendre tous les détails de ce problème et trouver la meilleure implémentation. Il s'avère qu'en avril 2016, seul iOS Chrome a ce problème. J'ai essayé sur Android Chrome et iOS Safari - les deux allaient bien sans ce correctif. Donc, le correctif pour iOS Chrome que j'utilise est:
la source
Réponse simple si votre arrière-plan le permet, pourquoi ne pas définir background-size: à quelque chose couvrant juste la largeur de l'appareil avec des requêtes multimédias et à utiliser à côté de: après position: fixe; pirater ici .
IE: taille de fond: 901px; pour tous les écrans <900px? Pas parfait ou réactif, mais cela a fonctionné un charme pour moi sur mobile <480px car j'utilise un BG abstrait.
la source
J'utilise cette solution de contournement: corrigez la hauteur de bg1 lors du chargement de la page en:
Ensuite, attachez un écouteur d'événement de redimensionnement à Window qui fait ceci: si la différence de hauteur après le redimensionnement est inférieure à 60px (rien de plus que la hauteur de la barre d'URL), ne faites rien et si elle est supérieure à 60px, redéfinissez la hauteur de bg1 à la hauteur de son parent! code complet:
PS: Ce bug est tellement irritant!
la source
Similaire à la réponse @AlexKempton. (impossible de commenter désolé)
J'ai utilisé de longs délais de transition pour empêcher le redimensionnement de l'élément.
par exemple:
Le compromis avec ceci est qu'il empêche le redimensionnement de l'élément, y compris sur la rotation de l'appareil, cependant, vous pouvez utiliser un peu de JS pour détecter
orientationchange
et réinitialiser la hauteur s'il s'agissait d'un problème.la source
Pour ceux qui souhaitent écouter la hauteur intérieure réelle et le défilement vertical de la fenêtre pendant que le navigateur mobile Chrome fait la transition de la barre d'URL de montré à masqué et vice versa, la seule solution que j'ai trouvée est de définir une fonction d'intervalle, et mesurer l'écart de la
window.innerHeight
avec sa valeur précédente.Ceci introduit ce code:
J'espère que ce sera pratique. Quelqu'un connaît-il une meilleure solution?
la source
La solution que j'ai trouvée en cas de problème similaire était de définir la hauteur de l'élément à
window.innerHeight
chaque foistouchmove
qu'un événement était déclenché.Cela permet à l'élément de couvrir exactement 100% de l'écran disponible à tout moment, ni plus ni moins. Même pendant le masquage ou l'affichage de la barre d'adresse.
Néanmoins, il est dommage que nous devions trouver ce genre de correctifs, où le simple
position: fixed
devrait fonctionner.la source
Avec la prise en charge des propriétés personnalisées CSS (variables) dans iOS, vous pouvez les définir avec JS et les utiliser uniquement sur iOS.
la source
Ma réponse est pour tous ceux qui viennent ici (comme moi) pour trouver une réponse à un bug causé par le masquage de l'adresse nue / de l'interface du navigateur.
La barre d'adresse masquée provoque le déclenchement de l'événement de redimensionnement. Mais différent des autres événements de redimensionnement, comme le passage en mode paysage, cela ne change pas la largeur de la fenêtre. Ma solution est donc de m'accrocher à l'événement de redimensionnement et de vérifier si la largeur est la même.
la source