Was ist der effizienteste Weg, um die Breite eines Bildes relativ zu seinem enthaltenden div in CSS zu berechnen?
Ich habe das folgende Snippet, das setzt #image1.width auf einen Prozentsatz, der relativ zur Breite des übergeordneten Elements ist. Ich verwende einen Prozentsatz, weil ich den brauche Bild proportional zum übergeordneten Bild zu skalieren, wenn die Größe des Bildschirms geändert wird.
Was ich wissen möchte, ist, ob es eine id gibt calc() Methode oder ähnliches, die ich implementieren kann, um diesen Prozess zu vereinfachen/rationalisieren?
Ich wollte verwenden width: calc(100% / 700) Dies funktioniert jedoch offensichtlich nicht, wenn sich die Bildschirmgröße ändert.
Ziele
Um es noch einmal zu wiederholen, es ist zwingend erforderlich, dass die #under Bild skaliert mit der Bildschirmgröße und der #image bleibt verhältnismäßig.
Ich möchte, dass die natürlichen Bildverhältnisse zueinander erhalten bleiben (dh ein Bild, das ein Viertel so groß ist wie das andere, bleibt bei allen Browserbreiten so).
Notiz: Das html kann in irgendeiner Weise umkonfiguriert werden, um dies zu erreichen.
Zielbrowser: Chrom, Firefox, Rand.
Prämienüberprüfung posten
Kommentieren Sie die Antwort von @Obsidian Age (Ende des ersten Kopfgelds am 31.03.17):
Leider ist die Antwort von @Obsidian Age nicht korrekt – sie ist nah dran, aber nicht ganz und ich wollte das hier nur klarstellen … Unten ist ein Ausschnitt aus seiner Antwort … Beachten Sie, dass ich denke, dass es eine gute Antwort ist, nur um zu klären, warum es so ist wurde nicht angenommen:
:root {
--width: 90vw; // Must be viewport-driven
}
#image1 {
width: calc(var(--width) / 3); // The 3 can be replaced with any float
}
Einstellung --width: 90vw was passiert wenn body oder div haben eine max-width einstellen? Auch das ist bei der Einrechnung für alle Geräte sehr schwer zu berechnen viewport-scaling.
#image1 { width:calc(var(--width) / 3); } Dies entspricht calc(90vw / 3) welches ist 30vw was 30 % der Bildbreite entsprechen würde. Aber wie berechnen wir die Zahl, durch die wir dividieren? Nun, es ist wieder da, wo wir angefangen haben … width:calc(var(--width) * calc(206/700*100)); Und deshalb habe ich diese Antwort nicht akzeptiert.
Was ist die Logik hinter 206/700?
– Hämant
14. März 2017 um 5:20 Uhr
@Anonymous Ich habe die Frage bearbeitet, die dies hoffentlich für Sie klären wird.
– Zze
14. März 2017 um 5:26 Uhr
Wie wird Ihr HTML generiert? Sie könnten die Bildgrößen ähnlich wie bei medium.com backen.
– Stummel
28. März 2017 um 15:44 Uhr
@Erevald es wird leider nicht generiert, nur du bist alt html.
– Zze
28. März 2017 um 21:26 Uhr
Ich bin mir nicht sicher, ob ich Ihre Frage verstehe. Auf welchen Prozentsatz gehst du? Möchten Sie, dass die natürlichen Bildverhältnisse zueinander erhalten bleiben (dh ein Bild, das ein Viertel so groß ist wie das andere, bleibt bei allen Browserbreiten so)? Oder nur eine Möglichkeit, das Verhältnis kleinerer Bilder beizubehalten und gleichzeitig wachsen zu lassen?
– David Mann
29. März 2017 um 2:03 Uhr
Obsidian-Zeitalter
Leider hat CSS keinen übergeordneten Selektor. Während Sie ein Element nicht relativ zum übergeordneten Element erstellen können direkt mit CSS, was Sie kann tun mit reinem CSS wird eine Variable gesetzt, die von beiden Elementen verwendet wird:
:root {
--width: 90vw; // Must be viewport-driven
}
Jetzt können Sie diese Variable sowohl als (feste) Breite des übergeordneten Elements verwenden, und die rechnerische Weite des Kindes:
#under {
width: var(--width);
}
#image1 {
width: calc(var(--width) / 3); // The 3 can be replaced with any float
}
Beachten Sie, dass die Variable entweder eine feste Einheit oder relativ zum Ansichtsfenster sein muss. Wenn es prozentual wäre, beides #under und #image1 würden ihre Breite von ihren jeweiligen Eltern stützen. Damit dies responsiv funktioniert, muss es auf dem Darstellungsbereich basieren.
Ich habe auch ein JSFiddle davon erstellt hierwo Sie sehen können, wie beide Elemente skaliert werden, wenn die Größe des Ansichtsfensters geändert wird.
Hoffe das hilft! 🙂
Dies ist eine sehr interessante Antwort. Haben Sie eine Ergänzung, die dies in etwas Responsives verwandeln könnte? Denn ich brauche die #under mit der Bildschirmgröße zu skalieren … da Sie ein % nicht als Division verwenden können calc()
– Zze
14. März 2017 um 5:51 Uhr
Richtig; Das ist mir gerade klar geworden. Sie müssten eine Viewport-gesteuerte Breite in der Variablen verwenden und beide Elemente darauf basieren. Ich habe gerade meine Antwort aktualisiert, um dies abzudecken 🙂
– Obsidianalter
14. März 2017 um 6:01 Uhr
Was Sie tun, ist genau dasselbe wie das Einstellen der Breite von #under bis 90% und die Breite von #image1 bis 30%
– Robby Cornelissen
14. März 2017 um 6:13 Uhr
@RobbyCornelissen ist richtig, das löst das Problem leider nicht.
– Zze
14. März 2017 um 22:26 Uhr
@Caramiriel – Es bedeutet, dass es ein ist CSS-Variablesodass Sie denselben Wert für mehrere verschiedene Attribute verwenden können 🙂
– Obsidianalter
6. April 2017 um 20:07 Uhr
Robby Cornelissen
Mir ist klar, dass die Frage nach einer reinen CSS-Lösung fragt, aber ich habe das großzügig als “kein JavaScript” interpretiert.
In diesem Sinne ist hier eine Lösung mit einem eingebetteten SVG:
Ihre Interpretation ist richtig – das funktioniert perfekt in Chrome, scheint aber in anderen Browsern nicht zu funktionieren, Gedanken? Dies ist bei weitem die beste Option, wenn es auch in anderen Browsern funktioniert.
– Zze
14. März 2017 um 8:53 Uhr
Scheint, dass die automatische Größenanpassung für <image/> elements ist ein SVG 2.0-Feature, das leider noch nicht von den meisten Browsern unterstützt wird. Benötigen Sie dies vor 2019? 🙂
– Robby Cornelissen
14. März 2017 um 9:51 Uhr
haha uhhh ja am liebsten – seufz das ist so enttäuschend, es sah super vielversprechend aus!
– Zze
14. März 2017 um 10:00 Uhr
Sie haben noch keine Enthüllungen in dieser Hinsicht gehabt, oder? So etwas wie deine Methode ist genau das, was ich will!
– Zze
28. März 2017 um 21:27 Uhr
Wenn es Ihnen nichts ausmacht, die tatsächlichen Abmessungen der Bilder hinzuzufügen, dann funktioniert dies bereits jetzt: Demo. Nicht sicher, ob das Ihre Frage beantwortet? Es erspart Ihnen zumindest die Berechnung des Prozentsatzes.
– Nur ein Student
6. April 2017 um 13:05 Uhr
Der beste Ansatz wäre meiner Meinung nach, die Breite zu eliminieren und die Skalierung zu verwenden, um sie an das div anzupassen, aber das Problem ist, dass die Skalierungstransformation keinen Einheitswert akzeptiert, wie z. B. % oder px oder vw/vh!
.common_img_class{
transform: scale(calc(100vw/700)); /* this won't work! */
/* Idea here is to let image take is original width & then scale with respact to base image scaling. Base image scaling is detenined by *window_width/base_image _width*, here base image width is 700 as per you example */
}
Das zweitbeste, was ich mir vorstellen kann, ist, die manuelle Prozentberechnung zu eliminieren. Verwenden calc() Funktion, dies für Sie zu tun.
Hier muss man für alle noch Breite schreiben, wird aber zumindest von Prozent- oder Verhältnisrechnung verschont.
Notiz: Wenn jemand bei der ersten Annäherung helfen kann, sind seine Beiträge willkommen.
Vielen Dank für die Antwort. Ich versuche, eine Lösung zu finden, die eher Ihrem ersten Vorschlag entspricht, da das manuelle Eingeben aller Algorithmen im Grunde dasselbe ist, da meine derzeitige Lösung nur potenziell Leistungseffekte hat calc mit einer großen Menge an Bildern.
<!-- parent -->
<div class="row">
<div class="col-md-6">
<img src="">
<!-- this is 50% of the screen for min 992px, a full line otherwise -->
</div>
<div class="col-md-3">
<img src="">
<!-- this is 25% of the screen for min 992px, a full line otherwise-->
</div>
<div class=col-md-3>
<img src="">
<!-- this is 25% of the screen for min 992px, a full line otherwise -->
</div>
</div>
Sie können diese nach Belieben gruppieren, denken Sie nur daran, dass sich die Zahlen zu 12 addieren müssen (in meinem Beispiel 6+3+3). Mit col-md-12 können Sie einen 100%igen Breiteneffekt erzielen. Außerdem ist das md-Infix nur eine von mehreren Abschneidemöglichkeiten zwischen dem Anordnen von allem auf einer Linie und dem Stapeln von Elementen. Sie können auschecken http://getbootstrap.com/css/#grid für weitere Details sowie ein paar Beispiele.
Inspiriert von der Antwort von Robby Cornelissen ist hier ein Ansatz, der derzeit in den Zielbrowsern funktioniert. Der einzige Nachteil ist, dass die Abmessungen der Bilder im HTML (naja, eigentlich im SVG) explizit angegeben werden müssen.
Der Ansatz verwendet, wie Robbys Antwort, das SVG image Element. Dies hat derzeit standardmäßig eine Breite und Höhe von null, wenn keine Abmessungen explizit angegeben sind, aber wird sich verändern in SVG 2. Das bedeutet, sobald SVG 2 von Browsern unterstützt wird, könnten wir anstelle der Angabe der Bildabmessungen festlegen width="auto" height="auto" und fertig sein.
Was ist die Logik hinter 206/700?
– Hämant
14. März 2017 um 5:20 Uhr
@Anonymous Ich habe die Frage bearbeitet, die dies hoffentlich für Sie klären wird.
– Zze
14. März 2017 um 5:26 Uhr
Wie wird Ihr HTML generiert? Sie könnten die Bildgrößen ähnlich wie bei medium.com backen.
– Stummel
28. März 2017 um 15:44 Uhr
@Erevald es wird leider nicht generiert, nur du bist alt
html
.– Zze
28. März 2017 um 21:26 Uhr
Ich bin mir nicht sicher, ob ich Ihre Frage verstehe. Auf welchen Prozentsatz gehst du? Möchten Sie, dass die natürlichen Bildverhältnisse zueinander erhalten bleiben (dh ein Bild, das ein Viertel so groß ist wie das andere, bleibt bei allen Browserbreiten so)? Oder nur eine Möglichkeit, das Verhältnis kleinerer Bilder beizubehalten und gleichzeitig wachsen zu lassen?
– David Mann
29. März 2017 um 2:03 Uhr