Wie kann ich Felder mit gleicher Breite/Höhe erstellen, die zur Bildschirmbreite passen? [duplicate]

Lesezeit: 6 Minuten

Kevins Benutzeravatar
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.

Hier ist ein Beispiel meines Problems

body {
    margin: 0;
    padding: 0;
}

.container {
    width: 100vw;
}

.box {
    float: left;
    width: 50vw;
    height: 50vw;
}

.red {
    background-color: red;
}

.green {
    background-color: green;
}

.lotta-content {
    height: 10000px;
}
<div class="container">
    <div class="box red"></div>
    <div class="box green"></div>
</div>
<div class="lotta-content"></div>

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:

body {
    margin: 0;
    padding: 0;
}

.container {
    width: 100%;
}

.box {
    float: left;
    width: 50%;
    height: 50vw;
}

.red {
    background-color: red;
}

.green {
    background-color: green;   
}

.lotta-content {
    height: 10000px;   
}
}
<div class="container">
    <div class="box red"></div>
    <div class="box green"></div>
</div>
<div class="lotta-content"></div>

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“.

    – mems

    26. Juni 2015 um 15:54

  • @Dachi Dennoch ist es gut, es aufzunehmen

    – Tristan Vorwärts

    30. April 2021 um 2:39

Benutzeravatar von ZJR
ZJR

Eine einfache (vereinfachte) Problemumgehung besteht darin, die Bildlaufleiste immer verfügbar zu lassen und damit umzugehen

html,body {margin:0;padding:0}
html{overflow-y:scroll}

(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

Shikkediels Benutzeravatar
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:

http://www.mademyday.de/css-height-equals-width-with-pure-css.html

Ergibt auch in Ihrem Beispiel ein Quadrat:

https://jsfiddle.net/3z887swo/4/

.box {
    float: left;
    width: 50%;
}

.box::before {
    content: "";
    display: block;
    padding-top: 100%;
}

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“.

http://www.w3.org/TR/CSS2/box.html#padding-properties


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.

Jeffersons Benutzeravatar
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);
    
})();
:root {
    --scrollbar: 0px;
}

body {
    overflow: scroll;
}

.demobox {
    display: grid;
    grid: auto / var(--scrollbar) max-content;
    width: calc(10em + var(--scrollbar) );
    margin: 0 auto;
}

.demobox > div {
    background: red;
}

.demobox > p {
    padding: 1em;
    text-align: center;
    width: 10em;
}
<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

1454770cookie-checkWie kann ich Felder mit gleicher Breite/Höhe erstellen, die zur Bildschirmbreite passen? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy