Ich habe ein sehr merkwürdiges Problem ... in jedem Browser und jeder mobilen Version ist dieses Verhalten aufgetreten:
- Alle Browser verfügen über ein Hauptmenü, wenn Sie die Seite laden (z. B. mit der Adressleiste), das beim Scrollen der Seite nach oben verschoben wird.
- 100vh wird manchmal nur im sichtbaren Teil eines Ansichtsfensters berechnet. Wenn also die Browserleiste nach oben gleitet, erhöht sich 100vh (in Pixel).
- Alle Layouts werden neu gestrichen und angepasst, da sich die Abmessungen geändert haben
- Ein schlechter Jumpy-Effekt für die Benutzererfahrung
Wie kann dieses Problem vermieden werden? Als ich zum ersten Mal von der Höhe des Ansichtsfensters hörte, war ich aufgeregt und dachte, ich könnte es für Blöcke mit fester Höhe verwenden, anstatt Javascript zu verwenden, aber jetzt denke ich, dass der einzige Weg, dies zu tun, tatsächlich Javascript mit einem Größenänderungsereignis ist ...
Sie können das Problem unter folgender Adresse sehen: Beispielseite
Kann mir jemand bei einer CSS-Lösung helfen / diese vorschlagen?
einfacher Testcode:
html
css
viewport-units
Nereo Costacurta
quelle
quelle
transition: 0.5s
oder so hinzufügen , um die Änderung weniger abrupt zu machen?Antworten:
Leider ist das beabsichtigt ...
Dies ist ein bekanntes Problem (zumindest bei Safari Mobile), das beabsichtigt ist, da es andere Probleme verhindert. Benjamin Poulain antwortete auf einen Webkit-Fehler :
Nicolas Hoizey hat dies ziemlich genau untersucht: https://nicolas-hoizey.com/2015/02/viewport-height-is-taller-than-the-visible-part-of-the-document-in-some-mobile -browsers.html
Kein Fix geplant
Zu diesem Zeitpunkt können Sie nur die Höhe des Ansichtsfensters auf Mobilgeräten verwenden. Chrome hat dies auch 2016 geändert:
quelle
$(window).height()
ist dieser Fehler nicht betroffen, also gehe ich diesen Weg. Danke!position:fixed
. Dies ähnelt der Implementierung auf Safari. Lesen Sie mehr: developer.google.com/web/updates/2016/12/url-bar-resizingvh
oder<html> 100%
Höhe nach Anfangslast. Das ist wirklich großartig - da Layout-Thrashing / Reflow, wenn URL-Leisten versteckt sind, schrecklich aussehen kann.Firefox
undEdge
Mobile
immer noch dynamisch aktualisierenvh
und<html>
Höhe, was zu viel Zerreißen und Ändern der Größe aller Komponenten beim Scrollen führt, besonders schlecht, wenn SVGs für Hintergrundbilder verwendet werdenSie können
min-height: -webkit-fill-available;
in Ihrem CSS statt versuchen100vh
. Es sollte gelöst werdenquelle
min-height: 100vh;
als Fallback gehen, wo-webkit-fill-available
nicht unterstützt wird.min-height: 100vh;
da es sonst in Browsern wie Firefox kaputt geht (zumindest auf dem Desktop verwendet iOS das Webkit, egal welcher Browser).In meiner App mache ich das so (Typoskript und verschachtelte Postcss, also ändere den Code entsprechend):
in deinem css:
es funktioniert zumindest auf Chrome Mobile und iPad. Was nicht funktioniert, ist, wenn Sie Ihre App unter iOS zum Homescreen hinzufügen und die Ausrichtung einige Male ändern. Irgendwie beeinträchtigen die Zoomstufen den Wert von innerHeight. Ich kann ein Update veröffentlichen, wenn ich eine Lösung dafür finde.
Demo
quelle
Für viele der Websites, die ich erstelle, wird der Client nach einem 100-VH-Banner fragen. Wie Sie festgestellt haben, führt dies zu einer schlechten "nervösen" Erfahrung auf Mobilgeräten, wenn Sie mit dem Scrollen beginnen. So löse ich das Problem für eine reibungslose, konsistente Erfahrung auf allen Geräten:
Ich habe zuerst mein Bannerelement CSS auf gesetzt
height:100vh
Dann verwende ich jQuery, um die Höhe meines Bannerelements in Pixel zu ermitteln und mit dieser Höhe einen Inline-Stil anzuwenden.
Auf diese Weise wird das Problem auf Mobilgeräten behoben, da beim Laden der Seite das Bannerelement mithilfe von CSS auf 100 Vh gesetzt wird. JQuery überschreibt dies, indem Inline-CSS in mein Bannerelement eingefügt wird, wodurch die Größe geändert wird, wenn ein Benutzer mit dem Scrollen beginnt.
Wenn ein Benutzer auf dem Desktop die Größe seines Browserfensters ändert, wird die Größe meines Bannerelements jedoch nicht geändert, da aufgrund der obigen jQuery jetzt eine feste Höhe in Pixel festgelegt ist. Um dies zu beheben , verwende ich Mobile Detect , um dem Hauptteil meines Dokuments eine "mobile" Klasse hinzuzufügen. Und dann verpacke ich die obige jQuery in eine if-Anweisung:
Wenn sich ein Benutzer auf einem mobilen Gerät befindet, befindet sich die Klasse 'mobile' im Hauptteil meiner Seite und die obige jQuery wird ausgeführt. Mein Bannerelement erhält also nur das Inline-CSS, das auf Mobilgeräten angewendet wird, während auf dem Desktop die ursprüngliche 100-VH-CSS-Regel beibehalten wird.
quelle
$('.banner').css({ height: window.innerHeight });
stattdessen zu verwenden , was die "echte" Höhe des Ansichtsfensters ist. Beispiel, wie innerHeight funktioniertdocument.querySelector('.banner').style.height = window.innerHeight;
für Leute, die tatsächlich JavaScript schreiben.Schauen Sie sich diese Antwort an: https://css-tricks.com/the-trick-to-viewport-units-on-mobile/
quelle
Ich habe eine React-Komponente entwickelt. Überprüfen Sie, ob Sie React verwenden, oder durchsuchen Sie den Quellcode, wenn Sie dies nicht tun, damit Sie ihn an Ihre Umgebung anpassen können.
Es setzt die Höhe des Vollbild-Divs auf
window.innerHeight
und aktualisiert sie dann bei Fenstergrößenänderung.quelle
Da ich einige Tage nach einer Lösung gesucht habe, ist meine für alle, die VueJS mit Vuetify verwenden (meine Lösung verwendet V-App-Leiste, V-Navigations-Schublade und V-Fußzeile): Ich habe App.scss erstellt (in App verwendet). vue) mit folgendem Inhalt:
quelle
Für mich hat ein solcher Trick einen Job gemacht:
quelle
@nils erklärte es klar.
Was kommt dann als nächstes?
Ich bin gerade zurückgegangen, um den relativen "Klassiker"
%
(Prozentsatz) zu verwenden. in CSS zu verwenden.Es ist oft mehr Aufwand, etwas zu implementieren, als es verwenden würde
vh
, aber zumindest haben Sie eine ziemlich stabile Lösung, die auf verschiedenen Geräten und Browsern ohne seltsame Probleme mit der Benutzeroberfläche funktioniert.quelle
Ich habe gerade eine Web-App gefunden, die dieses Problem mit iPhones und iPads hat, und einen Artikel gefunden, in dem vorgeschlagen wird, das Problem mithilfe von Medienabfragen zu lösen, die auf bestimmte Apple-Geräte abzielen.
Ich weiß nicht, ob ich den Code aus diesem Artikel hier freigeben kann, aber die Adresse lautet: http://webdesignerwall.com/tutorials/css-fix-for-ios-vh-unit-bug
Zitat des Artikels: "Passen Sie einfach die Elementhöhe mit der Gerätehöhe an, indem Sie Medienabfragen verwenden, die auf ältere Versionen der iPhone- und iPad-Auflösung abzielen."
Sie haben nur 6 Medienabfragen hinzugefügt, um Elemente mit voller Höhe anzupassen, und es sollte funktionieren, da es vollständig CSS-implementiert ist.
Bearbeiten ausstehend: Ich kann es derzeit nicht testen, aber ich werde zurückkommen und meine Ergebnisse melden.
quelle
Da ich neu bin, kann ich keine anderen Antworten kommentieren.
Wenn jemand nach einer Antwort sucht, damit dies funktioniert (und Javascript verwenden kann - da dies derzeit erforderlich zu sein scheint), hat dieser Ansatz für mich ziemlich gut funktioniert und auch die Änderung der mobilen Ausrichtung berücksichtigt. Ich verwende Jquery für den Beispielcode, sollte aber mit vanillaJS machbar sein.
- Zuerst benutze ich ein Skript, um festzustellen, ob das Gerät berührt oder schwebt. Beispiel mit bloßen Knochen:
Dadurch wird dem Body-Element eine Klasse entsprechend dem Gerätetyp (Hover oder Touch) hinzugefügt, der später für das Höhenskript verwendet werden kann.
- Verwenden Sie diesen Code als Nächstes, um die Höhe des Geräts beim Laden und beim Ändern der Ausrichtung festzulegen:
-Zeitüberschreitung ist so eingestellt, dass das Gerät die neue Höhe bei einer Orientierungsänderung korrekt berechnet. Wenn es keine Zeitüberschreitung gibt, ist die Höhe meiner Erfahrung nach nicht korrekt. 500ms sind vielleicht übertrieben, haben aber für mich funktioniert.
-100vh auf Hover-Geräten ist ein Fallback, wenn der Browser das CSS 100vh überschreibt.
quelle
Der folgende Code löste das Problem (mit jQuery).
Und die anderen Elemente werden
%
als Einheit zum Ersetzen verwendetvh
.quelle
Hier ist eine Problemumgehung, die ich für meine React-App verwendet habe.
iPhone 11 Pro und iPhone Pro Max - 120px
iPhone 8 - 80px
Es ist ein Kompromiss, aber eine relativ einfache Lösung
quelle
Folgendes hat bei mir funktioniert:
Das
body
nimmt die sichtbare Höhe des Ansichtsfensters an und#your-app-container
mitheight: 100%
wird dieser Container die sichtbare Höhe des Ansichtsfensters annehmen.quelle
Hoffentlich ist dies eine UA-definierte CSS-Umgebungsvariable, wie hier vorgeschlagen: https://github.com/w3c/csswg-drafts/issues/2630#issuecomment-397536046
quelle
Da dies nicht behoben werden kann, können Sie Folgendes tun:
Für mich war es die schnellste und reinste Lösung als das Spielen mit JavaScript, das auf vielen Geräten und Browsern nicht funktionieren konnte.
Verwenden Sie einfach den richtigen Wert, der
vh
Ihren Anforderungen entspricht.quelle
Die Verwendung von vh auf Mobilgeräten funktioniert nicht mit 100vh, da das Design die gesamte Höhe des Geräts ohne Adressleisten usw. verwendet.
Wenn Sie nach einem Layout mit Div-Höhen suchen, die proportional zur tatsächlichen Ansichtshöhe sind, verwende ich die folgende reine CSS-Lösung:
Sie haben zwei Möglichkeiten, um die Höhe des Ansichtsfensters festzulegen. Stellen Sie --devHeight manuell auf eine Höhe ein, die funktioniert (Sie müssen diesen Wert jedoch für jeden Gerätetyp eingeben, für den Sie codieren).
oder
Verwenden Sie Javascript, um die Fensterhöhe zu ermitteln, und aktualisieren Sie dann --devheight beim Laden und Aktualisieren des Ansichtsfensters (dies erfordert jedoch die Verwendung von Javascript und ist keine reine CSS-Lösung).
Sobald Sie Ihre korrekte Ansichtshöhe erhalten haben, können Sie mehrere Divs mit einem genauen Prozentsatz der gesamten Ansichtsfensterhöhe erstellen, indem Sie einfach den Multiplikator in jedem Div ändern, dem Sie die Höhe zuweisen.
0,10 = 10% der Ansichtshöhe 0,57 = 57% der Ansichtshöhe
Hoffe das könnte jemandem helfen;)
quelle
Sie können dies tun, indem Sie das folgende Skript und den folgenden Stil hinzufügen
Stil
quelle
Versuchen Sie es
html, body { height: 100% }
mit etwas, das 100vh auf Mobilgeräten bewirkt.quelle
Sie können versuchen,
position: fixed; top: 0; bottom: 0;
Ihrem Container Eigenschaften zuzuweisen.quelle