Wie kann ich Felder mit gleicher Breite/Höhe erstellen, die zur Bildschirmbreite passen? [duplicate]
Lesezeit: 6 Minuten
Kevin
Ich versuche, eine Website zu erstellen, die viele Felder mit gleicher Breite und Höhe enthält. Ich habe zum Beispiel eine Seite mit zwei gleich großen Feldern nebeneinander.
Die einfache Lösung bestand darin, die Breite und Höhe auf 50 vw einzustellen. Das funktioniert großartig, bis es eine Bildlaufleiste gibt. Ich habe stundenlang gegoogelt und kann nicht verstehen, warum um alles in der Welt vw und vh die Bildlaufleisten als Teil des Ansichtsfensters einbeziehen.
Beachten Sie die unerwünschte horizontale Bildlaufleiste.
Eine mögliche Lösung wäre, Prozentangaben für die Breite, aber vw für die Höhe zu verwenden, aber es wird nie eine perfekte Box sein, die nicht das Schlimmste auf der Welt ist, aber immer noch nicht ideal. Hier ist ein Beispiel:
Warum enthält vw/vh Bildlaufleisten als Teil des Ansichtsfensters? Gibt es eine bessere Lösung als meine eigene? Ich suche eine reine CSS-Lösung. Ich habe lieber kein JavaScript.
Haben Sie im Kopf enthalten?
– Dachi
10. April 2015 um 1:14
@Dachi Das wird keinen Unterschied machen.
– Josh Crozier
10. April 2015 um 1:14
w3.org/TR/css3-values/#viewport-relative-lengths sagt: „Wenn der Wert von ‚overflow‘ im Stammelement ‚auto‘ ist, wird davon ausgegangen, dass keine Bildlaufleisten vorhanden sind.“ overflow: auto ist der Standardwert für das Stammelement. Ich denke, die Entscheidung wurde getroffen, um das folgende Problem zu lösen, eine Endlosschleife: den „Abhängigkeitszyklus“ von „Anwesenheit oder Abwesenheit der Bildlaufleiste abhängig von den Werten der Ansichtsfenstereinheiten“.
(verwenden overflow-x für ein Layout, das verwendet vh)
Leider lässt sich das Problem immer noch nicht beheben, wenn die Bildlaufleiste immer vorhanden ist. 100vw, unabhängig davon, ob die Bildlaufleiste sichtbar ist oder nicht, ändert den tatsächlichen Endwert von 100vw nicht. Jeder Browser geht auch anders mit Bildlaufleisten um. Safari und andere Mac OS X-Browser überlagern sie, Edge und ich glaube, auch neuere IE-Browser überlagern sie. Während einige tatsächlich Platz im Ansichtsfenster beanspruchen und Ihren Inhalt verschieben. Aber danke für den Vorschlag und ich teile Ihre Frustration
– Kevin
11. Okt. 2015 um 1:21
Sie sollten ein vw2 machen, das ohne Bildlaufleisten ist, ahhha!
– Miguel
24. August 2016 um 16:16 Uhr
+1 für die Frustration. Habe das gerade auch entdeckt und mein Layout wird komplett zerstört, wenn eine Bildlaufleiste vorhanden ist. Zum Glück war mein Layout so, dass ich es ersetzen konnte calc(100vw - 50px) mit calc(100% - 50px)aber leider ist die Verwendung von Prozentsätzen im Vergleich zur bisher absolut soliden Lösung eine sehr unvollständige Lösung vw Einheiten – nicht mehr so grundsolide… 🙁 Aus praktischer Sicht wäre es vielleicht das Richtige, eine PR oder einen Fehlerbericht einzureichen oder so?
– Gilad Barner
30. Okt. 2016 um 14:52 Uhr
Der Inhalt innerhalb des Div, das hat vh Und vw kann nicht wirklich zentralisiert werden. Das ist so seltsam.
– Benutzer7075574
8. April 2019 um 6:39
Link zur Meta: meta.stackoverflow.com/questions/425340
– Der Meister
25. Juni um 16:00 Uhr
Shikkediel
Es wäre praktisch, wenn die Ansichtsfenstereinheiten dies nicht tun würden enthalten verursachen Bildlaufleisten, aber es ist schließlich die Anzeigegröße (Bildschirm). Schauen Sie sich diese Lösung jedoch mit einem Pseudoelement an:
Bearbeiten – falls sich jemand fragt, warum das funktioniert (vertikale Auffüllung entsprechend der Breite des ursprünglichen Elements) … im Grunde ist es in der Spezifikation so definiert:
Der Prozentsatz wird in Bezug auf die Breite des enthaltenden Blocks der generierten Box berechnet, auch für „padding-top“ und „padding-bottom“.
Nachdem ich auf meine eigene Antwort gestoßen bin, denke ich, dass sie etwas verfeinert werden muss. Semantische Mehrdeutigkeit ist der Grund, warum ich das Wort „einschließen“ oben durch „Ursache“ ersetzt habe. Weil es eher die Tatsache ist vw Einheiten berücksichtigen nur die Größe des Ansichtsfensters – nicht einschließlich aller Bildlaufleisten und verursachend Überlauf und eine Bildlaufleiste in die andere Richtung, wenn die Breite hinzugefügt wird 100vw (Der insgesamt benötigte Platz entspricht dem Ansichtsfenster plus der Bildlaufleistenbreite und überschreitet den Bildschirm.)
Wie bei der Frage hier: Wie geht man damit am besten um? vw Units werden sie wahrscheinlich nach Möglichkeit meiden, da sie einfach nicht sehr kompatibel mit Desktop-Browsern sind (die keine überlagernden Bildlaufleisten haben).
Ich habe die Idee herausgeschnitten, die eine CSS-Variable enthielt, so hoffnungsvoll sie auch schien.
Jefferson
Diese Frage ist alt und wurde oben bereits beantwortet. Daher werde ich mich darauf konzentrieren, die Breite der Bildlaufleiste zu ermitteln, um sie dann zur Berechnung der Elementbreiten zu verwenden. Aus diesem Grund bin ich hier gelandet. Hoffentlich hilft das anderen Google-Mitarbeitern.
Eine schlampige CSS-Lösung
Ich habe mit dem Schreiben der reinen CSS-Lösung basierend auf der folgenden Berechnung begonnen, aber sobald Sie anfangen, Elemente in Containern mit variabler Breite zu berücksichtigen, insbesondere wenn sie nicht 100 % der sichtbaren Breite haben, wird die calc Funktionen werden kompliziert und unleserlich.
Für alle Interessierten hier calc auf dem Wurzelelement (<html>) (vorausgesetzt, das Dokument hat die volle Breite und ist nicht breiter) gibt Ihnen die Breite der Bildlaufleiste oder 0, wenn keine Bildlaufleiste angezeigt wird.
calc( 100vw - 100% );
Eine robuste Lösung
Persönlich würde ich in diesem Fall nicht gegen CSS ankämpfen. Verwenden Sie das richtige Werkzeug für den Job:
(function get_scrollbar_width() {
// Get window width including scrollbar.
const withScrollBar = window.innerWidth;
// Get window width excluding scrollbar.
const noScrollBar = document.querySelector("html").getBoundingClientRect().width;
// Calc the scrollbar width.
scrollbarWidth = parseInt((withScrollBar - noScrollBar), 10) + 'px';
// Update the CSS custom property value.
let root = document.documentElement;
root.style.setProperty('--scrollbar', scrollbarWidth);
})();
<div class="demobox">
<div></div>
<p>
This red grid cell represents the scrollbar width as set
on the CSS custom property by the JavaScript function.
</p>
</div>
html { overflow-x: hidden; }
scheint zu funktionieren
Ich habe hier eine Lösung. Wenn Sie 100vw verwenden, wird die Breite der Bildlaufleiste berücksichtigt, oder? Wenn wir es also nicht richtig machen können, können wir die Bildlaufleiste entfernen und sie unsichtbar machen. so: Bildlaufleiste ausblenden, aber weiterhin scrollen können
14547700cookie-checkWie kann ich Felder mit gleicher Breite/Höhe erstellen, die zur Bildschirmbreite passen? [duplicate]yes
Haben Sie im Kopf enthalten?
– Dachi
10. April 2015 um 1:14
@Dachi Das wird keinen Unterschied machen.
– Josh Crozier
10. April 2015 um 1:14
w3.org/TR/css3-values/#viewport-relative-lengths sagt: „Wenn der Wert von ‚overflow‘ im Stammelement ‚auto‘ ist, wird davon ausgegangen, dass keine Bildlaufleisten vorhanden sind.“
overflow: auto
ist der Standardwert für das Stammelement. Ich denke, die Entscheidung wurde getroffen, um das folgende Problem zu lösen, eine Endlosschleife: den „Abhängigkeitszyklus“ von „Anwesenheit oder Abwesenheit der Bildlaufleiste abhängig von den Werten der Ansichtsfenstereinheiten“.– mems
26. Juni 2015 um 15:54
@Dachi Dennoch ist es gut, es aufzunehmen
– Tristan Vorwärts
30. April 2021 um 2:39