Forum: PC-Programmierung Div im Div mit Maximalabmessungen und festem Seitenverhältnis


von Chris S. (-fx-)


Lesenswert?

Hey,
ich stehe vor einem Rätsel. Auf des Wesentliche Vereinfacht habe ich 3 
in einer Spalte (Flexbox) angeordnete DIVs, welche genau die verfügbare 
Viewporthöhe und Breite einehmen sollen. DIV 1 und 3 haben irgendeinen 
Inhalt, das mittlere DIV soll in der verbleibenden zur Verfügung 
stehenden Höhe maximiert werden.
Weiterhin soll das mittlere DIV ein weiteres DIV mit einem festen 
Seitenverhältnis von 1:1 enthalten, welches auf das Maß der kleineren 
zur verfügung stehenden Dimension (Breite oder Höhe des darüberliegenden 
DIVs)
maximiert werden soll.

Versuche es jetzt selber seit geraumer Zeit, benutze google, frage 
ChatGPT, nichts will so richtig funktionieren.

Geht das überhaupt nur mit HTML und CSS und wenn ja wie?

Danke

von Weingut P. (weinbauer)


Lesenswert?

Also Du hast n äußeres DIV, das die Anderen beinhaltet
mit 100vh und 100vw
darin 3 DIV in nebeneinander, Quasi wie Tabellenspalten jeweils Höhe 
100% vom Außenrahmen und Breite 33% vom Außenrahmen.

Da ist eigentlich

div.spalte {
display: inline-block;
height: 100%;
width: 33.3%;
}

Der Außenrahmen:

div.aussen {
height: 100vh;
width: 100vw;
}

<div class="aussen">
<div class="spalte">
blafasel
</div>
<div class="spalte">
blafasel
</div>
<div class="spalte">
blafasel
</div>
</div>

von Weingut P. (weinbauer)


Lesenswert?

achso, im mittleren noch n Kästchen:

<style>
div.spalte {
display: inline-block;
height: 100%;
width: 33%;
margin: 0;
padding: 0;
}

div.aussen {
display: block;
height: 100vh;
width: 100vw;
margin: 0;
padding: 0;
}
div.innen {
width: 100%;
height: 33vw;
background-color: #009900;
}
</style>
</head>
<body>
<div class="aussen">
<div class="spalte">
blafasel
</div>
<div class="spalte">
<div class="innen">
blafasel
</div>
</div>
<div class="spalte">
blafasel
</div>
</div>
</body>

von Chris S. (-fx-)


Lesenswert?

Hallo,
danke für die Info. Nicht ausprobiert aber rein vom lesen hjer erfüllt 
das leider nicht den gewünschten Zweck.

Ich habe mich entschieden den das mittlere, zu maximierende Element 
umschließenden DIVs eine feste Größe zuzuweisen, so dass mich nun die 
einfachen mathematischen Fähigkeiten von CSS mitnutzen kann und so 
klappt es.

Danke
Chris

von Weingut P. (weinbauer)


Lesenswert?

Hab’s so aus Ihrer Beschreibung interpretiert … nächstes mal evtl. ne 
Zeichnung beifügen ;)

von Kolja L. (kolja82)


Lesenswert?

Ohne code fällt es mir schwer, aber ich versuche es aus dem Bauch raus.
Versuche es mit flex-grow.
Aber wirklich, mach mal n codepen dann lösen wir dein Rätsel schon 😃

von Daniel A. (daniel-a)


Lesenswert?

https://jsfiddle.net/vsmjnxad/1/

Die aspect-ratio Eigenschaft ist nur wenigen bekannt, und wird selten 
verwendet, ist hierfür aber ideal. Da hat chat-gpt natürlich keine 
Chance :)

Alternativ wären auch einige hacks mit margin möglich gewesen 
(prozentuale vertikal, horizontal margin gehen respektive auf breite, 
höhe. Ja, vertikal auf breite!), aber das erspare ich mir und euch mal.

Es hilft, immer mal wieder alle CSS Eigenschaften, Elemente, Attribute, 
JS APIs, etc. zu überfliegen, ob es was neues gibt, oder was das man 
noch nicht kennt. Kennt man die Bausteine ist das ganze ein leichtes.
Und die Hacks kennt man, wenn man schon länger dabei ist, und etwas 
Erfahrung gesammelt hat.

So ein Chat-Bot kann das niemals Toppen.


Ok, etwas hab ich nicht geschafft. Ich kann das Quadrat nicht vertikal 
zentrieren, wenn ich es versuche, ist es entweder kein Quadrat mehr, 
oder ist zu hoch / breit, je nach Seitenverhältnis des Containers. Das 
hier ging immerhin in firefox: https://jsfiddle.net/3sao5ehb/2/
Aber für Chrome habe ich dafür momentan keine Lösung für vertikale 
Zentrierung. Ok, man könnte etwas SVG hinein mixen 
https://jsfiddle.net/vsmjnxad/2/ aber dann stimmt die Grösse vom Inhalt 
des div nicht mehr. Man kann halt nicht alles haben.

Edit: Ich sehe gerade, spalte statt Zeile: 
https://jsfiddle.net/4j3mbhyp/1/

: Bearbeitet durch User
von Weingut P. (weinbauer)


Lesenswert?

Also das wäre dann n 4-Zeiler in JS,

window.innerHeight, dann die Höhe des DIV, bisschen rechnen und 
margin-top setzen voila

von Daniel A. (daniel-a)


Lesenswert?

Weingut P. schrieb:
> window.innerHeight, dann die Höhe des DIV, bisschen rechnen und
> margin-top setzen voila

Dann braucht man noch einen ResizeObserver, weil die Grösse des 
Containers sich ja ändern könnte. Und dann merkt man, dass die Grösse 
des Quadrat die Grösse des Containers beeinflusst. Und wenn man all das 
mal behoben hat merkt man, dass es nicht flüssig läuft, wenn man die 
Grösse & Position anpasst.

von Daniel A. (daniel-a)


Lesenswert?

Jetzt hab ich es mit vertikaler Zentrierung. Braucht die noch recht 
neuen container queries.

Variante 1 | Variante 2
https://jsfiddle.net/w9v6o2ed/2/ | https://jsfiddle.net/w9v6o2ed/1/ | 
Zeile
https://jsfiddle.net/eb9s5g6L/ | https://jsfiddle.net/w9v6o2ed/3/   | 
Spalte

von Weingut P. (weinbauer)


Lesenswert?

Daniel A. schrieb:
> Weingut P. schrieb:
>> window.innerHeight, dann die Höhe des DIV, bisschen rechnen und
>> margin-top setzen voila
>
> Dann braucht man noch einen ResizeObserver, weil die Grösse des
> Containers sich ja ändern könnte. Und dann merkt man, dass die Grösse
> des Quadrat die Grösse des Containers beeinflusst. Und wenn man all das
> mal behoben hat merkt man, dass es nicht flüssig läuft, wenn man die
> Grösse & Position anpasst.

onload onresize im <body>

bin eher n Freund von althergebrachtem und dem kleinsten gemeinsamen 
Nenner von wegen Abwärtskompatibilität.
Hatt erst das Thema mit webp und älteren Applegeräten in denen der 
Safari das nicht unterstützt -> bin wieder zurück auf jpg, sind noch 
viele davon im Umlauf.

von Daniel A. (daniel-a)


Lesenswert?

Naja, Safari ignoriere ich einfach immer komplett. Das ist heute das, 
was früher mal der IE war.

von Weingut P. (weinbauer)


Lesenswert?

Ja, so eine Agentur wollte mir unlängst n neues CMS verkaufen für meinen 
Betrieb und da auch gut Asche dafür. Hab ich dann dankend abgelehnt 
genau darum :D

Als Kunde ist diese Sicht für mich geschäftsschädigend wenn wiederum 
meine Kunden meine Site nicht nutzen können. M.E. n Nogo.

von Der Bundestrollaner -. (Firma: Troll Republik GmbH) (der_bundestrollaner)


Lesenswert?

Daniel A. schrieb:
> Naja, Safari ignoriere ich einfach immer komplett. Das ist heute das,
> was früher mal der IE war.

Man sieht halt bei so codeklopfenden Kellerkindern wie dir, die nur ein 
paar halbgegarte git Repos mit nichtfunktionierenden Codebrocken haben, 
dass man sie immer an die Kandare nehmen muss, sonst ist kein Geld zu 
verdienen mit euch; für Kundenkontakt völlig unbrauchbar.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.