Ich arbeite mit mehreren Tablet-Geräten - beide Android und iOS. Derzeit habe ich folgende Auflösungsvarianten für alle Tablets.
- 1280 x 800
- 1280 x 768
1024 x 768 (iPad offensichtlich)- iPad hat dieses Problem nicht
Die einfachste Möglichkeit, einen auf Geräteorientierung basierenden Stil anzuwenden, besteht darin, die Ausrichtung der Medienabfrage mithilfe der folgenden Syntax zu verwenden.
@media all and (orientation:portrait)
{
/* My portrait based CSS here */
}
@media all and (orientation:landscape)
{
/* My landscape based CSS here */
}
Dies funktioniert auf allen Tablet-Geräten einwandfrei. ABER das Problem ist, wenn sich das Gerät im Hochformat befindet und der Benutzer auf ein Eingabefeld tippt (z. B. Suchen), wird die Softtastatur angezeigt. Dadurch wird der sichtbare Bereich der Webseite verkleinert und zum Rendern in CSS im Querformat gezwungen. Bei Android-Tablet-Geräten hängt dies von der Höhe der Tastatur ab. Letztendlich sieht die Webseite also kaputt aus. Daher kann ich die Orientierungsmedienabfrage von CSS3 nicht verwenden, um Stile basierend auf der Orientierung anzuwenden (es sei denn, es gibt eine bessere Medienabfrage für die Zielorientierung). Hier ist eine Geige http://jsfiddle.net/hossain/S5nYP/5/, die dies emuliert - für Gerätetests verwenden Sie die vollständige Testseite - http://jsfiddle.net/S5nYP/embedded/result/
Hier ist ein Screenshot des Verhaltens auf der Demoseite.
Gibt es eine Alternative, um dieses Problem zu lösen? Ich bin offen für JavaScript-basierte Lösungen, wenn native CSS-basierte Lösungen nicht funktionieren.
Ich habe auf http://davidbcalhoun.com/2010/dealing-with-device-orientation einen Ausschnitt gefunden, der vorschlägt, darauf basierend Klasse und Ziel hinzuzufügen. Beispielsweise:
<html class="landscape">
<body>
<h1 class="landscape-only">Element Heading - Landscape</h1>
<h1 class="portrait-only">Element Heading - Portrait</h1>
<!-- .... more... ->
# CSS
.landscape .landscape-only { display:block; }
.landspace .portrait-only { display:none; }
.portrait .portrait-only { display:block; }
.portrait .landscape-only { display:none; }
Was haltet ihr davon? Hast du eine bessere Lösung?
quelle
known limitation
.Antworten:
Ich weiß, dass dies ein paar Jahre zu spät ist, aber ich habe eine großartige Lösung gefunden
Für Landschaftsmedien:
Und für Porträtmedien:
Die vollständige Lösung und warum es funktioniert, finden Sie hier. Michael Barret - Herausforderungen für Android-Browser
Bearbeiten: Dieser Link ist jetzt abgelaufen, aber ein Schnappschuss kann im Internetarchiv gefunden werden: Michael Barret - Herausforderungen für Android-Browser
quelle
Das Problem liegt in der Art und Weise, wie die Orientierung berechnet wird:
http://www.w3.org/TR/css3-mediaqueries/#orientation
Da die Höhe / Breite im sichtbaren Ansichtsfenster berechnet wird, bewirkt die Softtastatur anscheinend, dass die Ausrichtung jetzt umgedreht wird, da die Breite des Ansichtsfensters kleiner als die Höhe ist. Eine Lösung wäre, stattdessen nur Ihre Medienabfragen zu
width
verwenden. Dies macht es geräteübergreifend flexibler, unabhängig von der Ausrichtung, ganz zu schweigen davon, dass Breite / Höhe stärker unterstützt wird als die Ausrichtung.Wenn Sie die Breite anstelle der Ausrichtung berücksichtigen möchten, verwende ich das iPhone als Beispiel:
Dieser Ansatz ist flexibler als die Ausrichtung, da die Abfragen nicht auf Geräte / Benutzeragenten beschränkt sind, die die Ausrichtung unterstützen, ganz zu schweigen davon, dass die Ausrichtung nur sehr wenig über die Breite aussagt.
Wenn Sie die Orientierung wirklich kennen müssen, scheint es natürlich so, als würden Sie die Klasse zunächst festlegen und nur diese Option verwenden.
quelle
@media all and (max-device-wdith:NNNpx){}
oder@media all and (min-device-wdith:NNNpx){}
oder@media all and (device-wdith:NNNpx){}
and (orientation:portrait)
Letztendlich wurde mein Problem durch Entfernen und Anwenden der maximalen und minimalen Breite behoben. !!!Eine Alternative könnte die Verwendung sein
device-aspect-ratio
, die unverändert bleibt. In Webkit löst das Drehen des Geräts jedoch keine Aktualisierung der CSS-Regeln mithilfe dieser Abfrage aus, obwohl JavaScript-Tests für das neue Seitenverhältnis true zurückgeben. Dies ist anscheinend auf einen Fehler zurückzuführen , aber ich kann keinen Fehlerbericht finden. Die Verwendung einer Kombination ausorientation
und{min,max}-device-aspect-ratio
scheint gut zu funktionieren:Die Verwendung von
orientation
löst Auslösungen wie erwartet aus, und die Verwendung vondevice-aspect-ratio
Einschränkungen wird auf tatsächliche Orientierungsänderungen aktualisiert.quelle
Ich habe die oben aufgeführten Optionen durchgearbeitet und keine hat die Probleme für mich ganz behoben. Ich habe auf screen.availHeight umgestellt, da es konsistente Höhenergebnisse liefert, um das Problem mit der Tastaturanzeige zu vermeiden.
quelle
Für mich war das der Trick:
Während
max-aspect-ratio
das Auslösen des Portrait-Modus durch einfaches Ändern der Fenstergröße (nützlich für PCs und andere Nur-Querformat-Geräte)max-device-aspect-ratio
erledigt wird , hilft dies bei Smartphones oder anderen Geräten mit variabler Ausrichtung. Und da ich keine spezifischen Einstellungen für den Querformatmodus deklarieremax-aspect-ratio
, wird der Hochformatmodus auch dann ausgelöst,max-device-aspect-ratio
wenn das Android-Gerät so ausgerichtet ist , auch wenn dem System> 1 gemeldet wird .Der
1/1
Teil bedeutet im Grunde, dass wenn das Verhältnis <= 1 ist, es in den Hochformatmodus wechselt, andernfalls geht es in den Querformatmodus.quelle
(max-aspect-ratio: 1/1)
. Es scheint, wir brauchen dieses Bit nur, um ein Porträt auf dem Desktop zu erkennen?Ich habe einen einfachen Trick benutzt, um dieses Problem zu lösen
Ich fand maximale Breite: 896px kann für alle mobilen Geräte verwendet werden. Probieren Sie diese Lösung aus, es funktioniert!
quelle
Ich habe einige der obigen Antworten durchgesehen und keine von ihnen hat genau das getan, was ich wollte, nämlich die iPhone-Funktionalität so genau wie möglich nachzuahmen. Folgendes funktioniert jetzt für mich in der Produktion.
Dabei wird die Fensterbreite und -höhe des Geräteansichtsfensters einem Datenattribut zur zukünftigen Überprüfung zugewiesen. Da Telefone beim Hochziehen der Tastatur die Größe nicht ändern, können Sie nur anhand der Höhe, wenn Sie das Verhältnis UND die Breite mit der ursprünglichen Breite vergleichen, feststellen, ob die Tastatur aktiv ist. Ich habe noch keinen Anwendungsfall gefunden, der fehlgeschlagen ist, aber ich bin mir sicher, dass ich es tun werde. Wenn Sie alle einen finden, lassen Sie es mich bitte wissen.
Ich verwende einige globale Elemente wie InitialRun und MobileOrientation, die für das js-Switching verwendet werden. Außerdem verwende ich HTML5-Datenattribute, um Informationen im DOM für die CSS-Manipulation zu speichern.
quelle
Schauen Sie sich diesen Link an: http://www.alistapart.com/articles/a-pixel-identity-crisis/
Verlassen Sie sich nicht nur auf die Orientierung, sondern auch auf
max-device-height
oderdevice-pixel-ratio
kann helfen. Wie auch immer, ich habe es nicht getestet, also nicht sicher, ob es helfen wird.quelle
Idee: Nehmen Sie den Porträtparameter aus Ihrer Medienabfrage und lassen Sie ihn nur mit einer minimalen Breite. Führen Sie in dieser Medienabfrage Ihr normales Styling für den Hochformatmodus durch. Erstellen Sie dann eine weitere Medienabfrage für den Querformatmodus mit einer Mindesthöhe, die groß genug ist, damit der Browser diese Abfrage nicht verwendet, wenn die Tastatur angezeigt wird. Sie müssten experimentieren, was diese "Mindesthöhe" ist, aber es sollte nicht zu schwierig sein, da die meisten (wenn nicht alle) Landschaftsmodi eine größere Höhe haben als beim Aufspringen einer Tastatur. Darüber hinaus können Sie der Querformatabfrage eine Mindestbreite hinzufügen, die größer ist als die der meisten Smartphones in der Hochformatansicht (dh ca. 400 Pixel), um den Umfang der Abfrage einzuschränken.
Hier ist eine alternative (und schwache) Lösung: - Fügen Sie Ihrem HTML-Code ein leeres beliebiges Element hinzu, das in einem anderen Modus als im Hochformat "display: none" enthält. - Erstellen Sie einen JQuery- oder Javascript-Listener für die Eingabe: focus. Wenn Sie auf eine Eingabe klicken, überprüft Ihr Javascript die Anzeigeeigenschaft des beliebigen Elements. Wenn "Block" zurückgegeben wird oder was auch immer Sie im Hochformat festgelegt haben, können Sie Ihr Styling mit JS für Ihre Abfragen im Hochformatmodus überschreiben. Umgekehrt hätten Sie eine Eingabe: Blur Listener, um die style.cssText-Eigenschaften der Elemente, die Sie fest codiert haben, auszublenden.
Ich experimentiere gerade selbst damit - ich werde Code veröffentlichen, was funktioniert, wenn ich etwas Festes und Verwaltbares bekomme. (Meine erste Lösung scheint die vernünftigste zu sein).
quelle
Das funktioniert bei mir zuverlässig. Ich verwende http://detectmobilebrowsers.com/ für die jQuery-Erweiterung, um $ .browser.mobile zu erkennen.
Hier ist mein Code zum Ändern des Ansichtsfensters basierend auf der Ausrichtung. Diese Funktion wird nur für mobile Geräte aufgerufen, nicht einmal für Tablets. Dadurch kann ich problemlos CSS für 400px und 800px (Portrait vs Landscape) schreiben.
Aufgrund der Art meiner Anforderungen konnte ich dies nicht allein in CSS Media-Abfragen tun, da das DOM selbst aufgrund der Ausrichtung geändert werden musste. Leider schreiben Geschäftsleute bei meiner Arbeit Softwareanforderungen, ohne vorher die Entwicklung zu konsultieren.
quelle
Ich hatte genau das gleiche Problem mit dem iPad.
dh; Wenn die Softtastatur im Hochformat angezeigt wird, wird das Gerät im Querformat erkannt und Stile für Querformat werden auf den Bildschirm angewendet, was zu einer fehlerhaften Ansicht führt.
Gerätespezifikation
Leider hat diese Lösung für mich nicht funktioniert.
Also habe ich eine solche Medienabfrage für meinen Porträtmodus geschrieben.
dh; Wenn die Softtastatur angezeigt wird, verringert sich die Bildschirmhöhe, die Bildschirmbreite bleibt jedoch auf 768 Pixel, was dazu führte, dass Medienabfragen den Bildschirm als Querformat erkennen. Daher ist die Umgehung wie oben angegeben.
quelle
Da das iPhone 11 Pro Max Viewport 414 x 896 PX groß ist, sollte dies ausreichen, um die Ausrichtung zu gewährleisten: Querformat mit minimaler Breite: 500 Pixel
quelle