Comment conserver le titre au-dessus de la fenêtre visuelle après des modifications de mise en page/de fenêtre visuelle dans le Web mobile Chrome ?
P粉833546953
P粉833546953 2024-03-28 00:24:35
0
1
316

Je sais qu'il y a plusieurs questions liées à cela, mais aucune d'entre elles ne semble plus valable puisque l'équipe du navigateur a apporté des modifications depuis que ces questions ont été posées. J'essaie de trouver la dernière solution à ce problème.

Objectif

Mon souhait est que l'en-tête fixe reste toujours en haut lors de l'utilisation d'un navigateur Web mobile, en particulier lorsque l'utilisateur se concentre sur un champ de saisie et que le clavier virtuel est affiché, pour une expérience semblable à celle d'une application.

Contexte de fond

Récemment, l'équipe mobile de Chrome a modifié la façon dont la mise en page Web mobile et les fenêtres visuelles sont redimensionnées pour être cohérentes avec Chrome sur iOS et Safari mobile sur iOS.

Ce GIF tiré de l'article de David Fedor illustre très succinctement l'état actuel de la plupart (mais pas de tous) les navigateurs mobiles, à savoir que la fenêtre d'affichage visuelle "monte" lorsqu'un clavier à l'écran (OSK, alias clavier virtuel) s'affiche lorsque le champ a du focus.

Le plus gros problème auquel je suis confronté est que je n'arrive pas à faire en sorte que l'élément de titre reste visuellement au premier plan lorsque OSK est affiché. C'est un gros problème lorsque la barre supérieure de votre application comporte une action principale sous la forme de "Enregistrer". Cela encombre l'expérience utilisateur et rend les clients frustrés, ce n'est donc pas une petite chose à mon avis.

J'ai essayé l'API VisualViewport recommandée par l'équipe Chrome, référencée env(keyboard-inset-height) , mais cela ne semble pas fonctionner, ce qui me fait penser que je fais quelque chose de bizarre avec la mise en page, comme ENV qui n'est pas défini correctement.

Mon code

Rien de trop fou, utilisez CSS Grid pour contrôler la mise en page.

HTML

<html>
<body>
  <div id="container">
    <header id="header">header</header>
    <main id="main">
      main
      <input type="text" />
    </main>
    <footer id="footer">footer</footer>
  </div>
</body>
</html>

Styles CSS

body {
  margin: 0;
}

#container {
  height: 100dvh;
  display: grid;
  grid-template:
    "header" 50px
    "main" 1fr
    "footer" 50px
    "keyboard" env(keyboard-inset-height, 0px); // does not seem to work?
}

#header {
  grid-area: header;
}

#main {
  grid-area: main;
  overflow-y: scroll;
}

#footer {
  grid-area: footer;
}

Ce que j'ai obtenu, ce sont les deux captures d'écran suivantes, la première pleine page est la mise en page que je veux et la seconde est que lorsque vous concentrez le curseur sur l'entrée près du bas, cela "pousse" toute la fenêtre visuelle vers le haut, ce qui fait que le titre est situé hors de l'écran.

Plein écran Centré sur la saisie

Existe-t-il actuellement un moyen de garantir que le titre reste toujours en haut de la fenêtre d'affichage visuelle ? Après la récente mise à jour de Chrome, je ne trouve actuellement pas de solution fonctionnelle.

P粉833546953
P粉833546953

répondre à tous(1)
P粉573943755

Pour Google Chrome 108 ou supérieur, définissez <meta name="viewport" content="width=device-width, initial-scale=1.0, Interactive-widget=resizes-content">.
Notez l'attribut viewport 元标记中的 interactive-widget.

J'ai trouvé la solution ici.
J'ai vérifié la dernière version de Chrome pour Android.

body {
  margin: 0;
}

#container {
  height: 100dvh;
  display: grid;
  grid-template:
    "header" 50px
    "main" 1fr
    "footer" 50px
  ;
}

#header {
  grid-area: header;
}

#main {
  grid-area: main;
  overflow-y: scroll;
}

#footer {
  grid-area: footer;
}


  Title
  


main 2

































footer
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!