J'ai un problème très étrange... dans chaque navigateur et version mobile, j'ai rencontré ce comportement :
- tous les navigateurs ont un menu supérieur lorsque vous chargez la page (montrant la barre d'adresse par exemple) qui glisse vers le haut lorsque vous commencez à faire défiler la page.
- 100vh parfois n'est calculée que sur la partie visible d'un viewport, donc lorsque la barre du navigateur glisse vers le haut, 100vh augmente (en termes de pixels)
- toute la mise en page doit être repeinte et réajustée car les dimensions ont changé
- un mauvais effet de saut pour l'expérience utilisateur
Comment éviter ce problème ? Quand j'ai entendu parler de viewport-height pour la première fois, j'étais enthousiaste et je pensais pouvoir l'utiliser pour des blocs de hauteur fixe au lieu d'utiliser javascript, mais maintenant je pense que le seul moyen de le faire est en fait javascript avec un événement de redimensionnement...
vous pouvez voir le problème à : site de prélèvement
Quelqu'un peut-il m'aider ou me suggérer une solution CSS ?
code de test simple :
/* maybe i can track the issue whe it occours... */
$(function(){
var resized = -1;
$(window).resize(function(){
$('#currenth').val( $('.vhbox').eq(1).height() );
if (++resized) $('#currenth').css('background:#00c');
})
.resize();
})
*{ margin:0; padding:0; }
/*
this is the box which should keep constant the height...
min-height to allow content to be taller than viewport if too much text
*/
.vhbox{
min-height:100vh;
position:relative;
}
.vhbox .t{
display:table;
position:relative;
width:100%;
height:100vh;
}
.vhbox .c{
height:100%;
display:table-cell;
vertical-align:middle;
text-align:center;
}
<div class="vhbox" style="background-color:#c00">
<div class="t"><div class="c">
this div height should be 100% of viewport and keep this height when scrolling page
<br>
<!-- this input highlight if resize event is fired -->
<input type="text" id="currenth">
</div></div>
</div>
<div class="vhbox" style="background-color:#0c0">
<div class="t"><div class="c">
this div height should be 100% of viewport and keep this height when scrolling page
</div></div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
2 votes
Si j'ai bien compris la question, le problème auquel vous êtes confronté est que dans le navigateur mobile, la hauteur est supérieure à la hauteur du viewport visible n'est-ce pas ?
0 votes
Intéressant, je n'avais jamais remarqué ça avant. C'est principalement l'image d'arrière-plan qui est sensiblement instable. Et si vous ajoutiez un
transition: 0.5s
ou plus, pour que le changement soit moins brutal ?1 votes
@GauravAggarwal non, c'est exactement le contraire : la hauteur réelle du viewport est supérieure à celle fournie par le navigateur lorsque sa barre d'adresse est visible...
2 votes
Puisque ma question devient populaire, je voudrais donner mes 5 centimes : ne serait-il pas plus intelligent de maintenir la hauteur réelle de la fenêtre et de ne faire glisser que la barre de menu vers le haut ? cela ne semble pas si difficile. En fait, ça devrait être plus facile... un doigt vers le haut -> la barre de menu glisse vers le haut jusqu'à ce qu'elle soit invisible, un doigt vers le bas -> la barre de menu glisse vers le bas jusqu'à ce qu'elle soit complètement visible... le tout avec le corps sans aucun réajustement ni effet de saut...
7 votes
Google a de bonnes informations à ce sujet : developers.google.com/web/updates/2016/12/url-bar-resizing Vous pouvez utiliser 100% au lieu de 100vh SI vous avez changé la hauteur du corps à 100%.
2 votes
J'ai remarqué le contraire. Malheureusement,
100vh
dans Chrome sur iOS égaleouterWidth
au lieu de deinnerWidth
ce qui me pose des problèmes puisque ces barres de navigation ne disparaissent que lorsque l'on fait défiler la page.body
élément. Malheureusement, c'est un élément enfant qui défile sur mon site Web, de sorte que les barres ne disparaissent jamais et que la navigation sur mon site Web est masquée par ces barres de navigation...0 votes
@Benisburgers cela casse complètement ma mise en page. Je cache les barres de défilement sur un élément avec un débordement, de sorte qu'au lieu de faire défiler la fenêtre entière, vous ne faites défiler que l'élément avec un débordement.
1 votes
Je pense avoir trouvé une très bonne solution à cette "fonctionnalité" : stackoverflow.com/questions/58886797/