Dieser Artikel vom Juli 2013 beschreibt eine Methode, mit Pseudoelementen das Seitenverhältnis eines Elements beizubehalten, auch wenn es skaliert.
Hier ist ein Sass-Mixin, das die Mathematik etwas vereinfacht.
@mixin aspect-ratio($width, $height) {
position: relative;
&:before {
display: block;
content: "";
width: 100%;
padding-top: ($height / $width) * 100%;
}
> .content {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
}
Das Mixin geht davon aus, dass Sie ein Element mit der Klasse "content" innerhalb Ihres anfänglichen Blocks verschachteln. So:
<div class="sixteen-nine">
<div class="content">
insert content here
this will maintain a 16:9 aspect ratio
</div>
</div>
Die Verwendung des Mixins ist so einfach wie:
.sixteen-nine {
@include aspect-ratio(16, 9);
}
Ergebnis
.sixteen-nine {
position: relative;
}
.sixteen-nine:before {
display: block;
content: "";
width: 100%;
padding-top: 56.25%;
}
.sixteen-nine > .content {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
Demo
Hier ist eine Demo, die den obigen Code in Aktion zeigt. Die Animation wurde hinzugefügt, um zu zeigen, wie das Element beim Ändern der Größe das zugewiesene Seitenverhältnis beibehält.
Siehe den Pen Maintain Aspect Ratio Demo von Sean Dempsey (@seanseansean) auf CodePen.
Danke an Sean Dempsey (@thatseandempsey) dafür!
Diese Technik kann zu etwas Allgemeinerem vereinfacht werden, indem man data-Attribute verwendet und den Kindselektor verallgemeinert.
Das ist eine schöne Technik. Das einzige Problem ist, dass sich die Höhe nicht anpasst, wenn sich der Inhalt der Box aus irgendeinem Grund erweitert. Wenn die Box also mit ein paar mehr Wörtern gefüllt ist, als hineinpassen, oder ein Benutzer die Textgröße erhöht, kann der Text aus der Box überlaufen. Es wäre schön, das Beste aus beiden Welten zu haben: Seitenverhältnis beibehalten, wenn möglich, aber auch bei Bedarf erweitern.
Hallo Matt,
Sie können eine Version "Seitenverhältnis beibehalten oder an Inhalt anpassen" wie diese erstellen
...und den Wrapper entfernen :-)
Pen: http://codepen.io/jakob-e/pen/LEdWNB
Hallo Jakob,
Das ist eine sehr saubere Lösung! Sehr nett, danke
Jakobs Lösung funktioniert zur Kompilierungszeit, was bedeutet, dass das Seitenverhältnis unabhängig von der Bildschirmgröße ist. Aber das ist immer noch kein echtes responsives Seitenverhältnis, das die Dehnung zulässt, wenn die Höhe die limitierende Dimension ist.
Gibt es vielleicht noch andere Lösungsvorschläge?
Hallo Jakob, gute Arbeit an diesem Ansatz. Ich habe ihn verwendet und heute ein Problem in FF festgestellt. Wenn das Element mit dem angewendeten Seitenverhältnis `display:flex;` hat, funktioniert es in FF nicht.
http://codepen.io/robertwbradford/pen/gMYZeV
Ich habe versucht, eine Lösung zu finden, aber bisher nicht geschafft.
Robert, ich hatte dieses Problem mit Flex und Firefox, und eine Lösung, die ich gefunden habe, war, das Element mit dem Seitenverhältnis in eine div zu verpacken, sodass Flexbox diesen Wrapper und nicht das Element mit dem Seitenverhältnis selbst beeinflusst. Das behebt das Problem in FF
(PS: Entschuldigung für mein Englisch)
Ich habe gerade deinen Pen geforkt
http://codepen.io/italodr/pen/wzmxxB
Als verwandte Anmerkung habe ich dieses Sass-Mixin geschrieben, um ein CSS-Hintergrundbild sein Seitenverhältnis beibehalten zu lassen.
Dies ermöglicht es Ihnen, das Bild auf kleineren (mobilen) Bildschirmen über Breakpoints nicht herunterzuladen/anzuzeigen, sondern es wie ein HTML-
<img>zu verhalten und sein Seitenverhältnis responsiv beizubehalten, wenn Sie es anzeigenKönnen Sie mir bitte sagen, wie ich dieses Mixin für eine Div mit CSS-Hintergrundbild verwenden kann?
@Zolu
div{
@include intrinsic-ratio-bg-img(“/path-to-image/image.jpg”)
}
War es das, wonach Sie gefragt haben?
Genial! Danke, das hat mir Stunden Frustration erspart!
Dies hat mir geholfen, ein Problem zu lösen, bei dem die Höhe eines Kindelements in einer Bootstrap-Spalte festgelegt werden musste, um eine zusammenhängende Verteilung von Spalten in einem Masonry-Layout zu gewährleisten. Vielen Dank!
Ein Freund hat mir diesen Trick gezeigt, und er schien gut zu funktionieren, während ich in Chrome entwickelt habe. Aber als ich ihn dann in Firefox getestet habe, funktionierte er nicht. Haben Sie eine Ahnung, warum? Es scheint, als ob die vorhergehende Polsterung nicht respektiert wird.
Es stellte sich heraus, dass mein übergeordnetes Div den Stil "display:flex" hatte, und ich habe es behoben, indem ich den Stil auf "display:block" geändert habe.
Das funktioniert! Sehr geschätzt :)
Ich liebe euch für diese Lösung!! Bin wegen Firefox durchgedreht hier :D
Das hat super funktioniert! Ich bin kein Programmierer, also stelle ich meine Website Stück für Stück zusammen und füge Dinge hinzu, die ich hier und da finde, und versuche, sie zu verstehen. Das war vollständig verständlich! Ich habe dies verwendet, um zu verhindern, dass meine Diashow oben auf der Seite springt. Großartig!!
Vielen Dank.
Thora
Sehr cool! Sie können auch einfach CSS `calc()` verwenden, um das zu berechnen, wenn Sie keinen CSS-Präprozessor verwenden. Funktionierendes Beispiel: http://codepen.io/anon/pen/bBLGWL
Vergessen Sie nicht, das Viewport zu vergrößern/verkleinern!
Es gibt ein seltsames Verhalten, wenn diese Methode verwendet wird und entweder ein bottom-Margin oder ein border auf das Eltern-Element angewendet wird. Wenn es nur 1 Pixel beträgt, sehen Sie in einigen Fällen, dass Safari die Eigenschaft nicht entsprechend rendert, was zu keinem Abstand oder Rand führt. Vergrößern Sie Ihr Fenster in Safari, um zu sehen, was ich meine.
Demo: http://codepen.io/mjoanisse/pen/zZNOGr/
Um das zu umgehen, können Sie die Pseudoklasse `::after` verwenden und das Element absolut positionieren, sodass es am unteren Rand Ihrer Box fixiert ist. Das ist jedoch eine Notlösung und hat seine Grenzen.
Ich bin neugierig, von jemandem zu hören, der vielleicht eine clevere Lösung für dieses Problem hat.
Ich hätte gerne eine DIV, die sich bei Höhenänderungen des Containers proportional anpasst.
Weiß jemand, wie das geht?
Vielen Dank im Voraus!
Zugehörige CSS-Tickets
https://github.com/w3c/csswg-drafts/issues/333
https://github.com/w3c/csswg-drafts/issues/1173
Es ist auch ohne das `::before`-Pseudoelement möglich. Es kann mit `calc()` und der `vw`-Einheit anstelle der `%`-Einheit gemacht werden.
Ein weiterer Vorteil ist, dass Sie zum Beispiel Flexbox oder Grid verwenden können.
Demo:
Ich habe ein Mixin aus der Lösung von Sérgio Gomes gemacht, die Sie hier erwähnen
Bisher ist das definitiv das beste. Es erfordert keine Wrapper-Elemente und erweitert sich bei Bedarf. Wunderbar!