Das Web ist ein fließender Ort. Bildschirme unterschiedlicher Größe, yadda yadda yadda. Glücklicherweise für uns ist das Web darauf vorbereitet. Textumbruch. CSS gibt uns die Kontrolle darüber, wie Dinge dimensioniert werden. Was wir (zumindest einfach) nicht bekommen, ist eine Möglichkeit, ganze Elemente (und ihre Kinder) proportional zu skalieren – und dabei ihr exaktes Layout beizubehalten, wenn sie ihre Größe ändern.
Das können wir aber trotzdem tun.
Die proportionale Skalierung eines *Containers* ist ziemlich einfach
Onkel Davids alter gepolsterter Kasten
.parent {
height: 0;
padding-bottom: 56.25%; /* 16:9 */
position: relative;
}
Wenn Sie dann Inhalt darin haben möchten, können Sie einen abdeckenden Container absolut darin positionieren
.child {
position: absolute;
top: 0; left: 0;
width: 100%; height: 100%;
}
Das kann sehr nützlich sein für Dinge wie Bilder, Container, die unabhängig voneinander scrollen können, oder Container mit so viel Freiraum, dass sie dramatische Formänderungen verkraften können.
Wenn der Inhalt dieses Containers beispielsweise ein Bild wäre, funktioniert das hervorragend!

Aber die Dinge sind nicht so erfreulich, wenn es eine Menge HTML-Element-Kinder gibt, die einfach nur tun, was normale HTML-Elemente eben tun.

Proportionale Skalierung von allem
Nehmen wir an, das ist die Art von Sache, die wir anstreben

CSS allein kann das nicht wirklich. Aber CSS ist immer noch die Antwort! transform: scale(); ist das, was wir brauchen. Es skaliert Dinge perfekt proportional. Wir müssen ihm nur eine Zahl zum Skalieren geben, und diese Skalierung können wir mit etwas JavaScript ermitteln.
Der Trick ist
var scale = Math.min(
availableWidth / contentWidth,
availableHeight / contentHeight
);
Hier ist ein möglicher Ansatz dafür, mit jQuery und jQuery UI Resizeable (weil das für mich einfach und bequem ist)
Siehe den Pen Resize with Scale von Chris Coyier (@chriscoyier) auf CodePen.
Andere Wege…
SVG macht das von sich aus. Das behandeln wir bald in einem Artikel. Ich habe ein paar *Dinge zu sagen*. ;)
Außerdem kann man vielleicht alles mit vw/vh-Einheiten skalieren, aber das klingt nach einer Menge Arbeit und einer ganzen Menge magischer Zahlen.
Das braucht man wahrscheinlich eher selten
Der Grund, warum ich diese Idee so gut finde, ist, dass ich bemerkt habe, dass von Slides.com eingebettete Diashows so funktionieren.
@chriscoyier Danke! Inhalte werden proportional skaliert, aber die Hintergrundgröße ist flexibel, um 100 % des verfügbaren Platzes auszufüllen. pic.twitter.com/1CybHUBdoS
— Slides (@slides) 18. November 2015
Das ist ein perfekter Anwendungsfall. Slides.com gibt Ihnen eine feste Leinwand, auf der Sie Ihre Folien erstellen können, was absolut Sinn macht. Dann können diese Folien bei Bedarf skaliert werden, um in einem größeren Raum präsentiert zu werden. Oder sie werden kleiner skaliert, um auf kleinere Bildschirme zu passen (z. B. wenn Sie sie in einen Blogbeitrag mit einer schmalen Inhaltsspalte einbetten oder auf einem Mobilgerät anzeigen).
Ich denke auch an Embedded Pens. Manchmal entwerfen Leute Pens so, dass sie in einem größeren Bereich funktionieren, und das Design bricht zusammen, wenn es eingebettet wird. Ich könnte dies verwenden, um den Inhalt proportional zu skalieren, aber nur so weit wie nötig, um ihn anzupassen.
Vielleicht iFrames? Wahrscheinlich meist Drittanbieter- oder benutzergenerierte Inhalte, und in Situationen, in denen das Verhältnis wichtig ist, ansonsten machen Sie mit normaler RWD-Aktion weiter.
Ich habe mit REMux gearbeitet (https://css-tricks.de/remux-an-experimental-approach-to-responsive-web-design/). Und es erledigt die Aufgabe. Aber, wie Sie sagten, es erfordert magische Zahlen, besonders wenn Sie möchten, dass Text bei bestimmten Bildschirmbreiten lesbar bleibt. Schauen Sie es sich in Aktion an unter https://labdoor.com
Es ist möglich, einige
max-width/-heightdamit zu erzielen, aber das erfordert etwas wie 4 umgebende<div>s, da es keinemax-paddinggibt.Twitter verwendet ein gestrecktes
<canvas>, um diesen Effekt zu erzielen (http://nicolasgallagher.com/canvas-fix-svg-scaling-in-internet-explorer/), aber das erfordert etwas Geklump im HTML und explodiert, wenn JS aus ist. (<canvas>wirkt wie ein umgekehrtes<noscript>.)Es ist möglich, das in reinem CSS mit Pseudo-Elementen und Inline-SVG zu machen, aber es ist irgendwie ein Chaos. Ich frage mich, ob es mit einem fertigen Sass-Mixin populärer wäre...
@Kun Ich vermute, die Antwort für Sie lautet: „Verwenden Sie SVG“
Ich persönlich habe eine reine CSS-Methode verwendet, Viewport-Einheiten (und
calc()und ein bisschen Sass), um meine HTML-Folien und alles darauf proportional zu halten. Ich mag die Viewport-Einheiten-Methode, weil ich sie als ziemlich flexibel empfunden habe. Ich muss nur die Werte der an das Mixin übergebenen Argumente für ein anderes Seitenverhältnis ändern. Alle Abmessungen für alles auf der Folie sind entweder in Viewport-Einheiten oder inemeingestellt, und die Basis-font-sizeist ebenfalls in Viewport-Einheiten eingestellt – ein ziemlich zufälliger Wert, der nur einen bestimmten Teil der kleinsten Dimension darstellt. Ich habe nie viel darüber nachgedacht, weil ich sowieso nie so viel Zeug auf nur einer Folie habe, also funktioniert es für Folien in den meisten Fällen und vor allem in allen relevanten Fällen, die Situationen, in denen es fehlschlägt, sind viel zu extrem (nichts ist mehr lesbar bei dieser Größe).Ich stimme @Ana zu – eine Kombination aus Viewport-Einheiten/SASS (oder LESS)/CSS calc() ist das, was ich hier gerne mache, weil sie den JS-Faktor ausschließt (JS müsste aber verwendet werden, wenn Browser ohne ... unterstützt werden).
Wenn das Problem mit der „magischen Zahl“ oben mit Abständen/Polsterungen/Randbreiten von Container-Objekten zu tun hat, die die Berechnungen beeinflussen würden, dann hat es mir geholfen, all diese Werte in SASS/LESS-Variablen zu stecken und sie dann in die calc()-Anweisung einzufügen.
Die einzigen Probleme, die ich bei älteren Android-Browsern gefunden habe, die Probleme mit Multiplikation und Division innerhalb einer calc-Anweisung haben, aber oft kann dies durch die Berechnung aller konstanten Werte (d. h. Abstände/Polsterungen/Randbreiten) in SASS/LESS behandelt werden. Natürlich gibt es IE8-Probleme mit der Unterstützung, aber zum Glück müssen sich die meisten von uns nicht mehr darum kümmern.
Das ist etwas, das wir täglich mit animierten „responsiven“ HTML-Bannern machen müssen, die proportional skaliert werden müssen und – halten Sie sich fest – nicht in iframes eingebettet sind, sondern mit JS inline eingefügt werden.
Das schließt Viewport-Einheiten, die alles einfacher machen würden, irgendwie aus…
Die JS+Scale-Methode ist einfach zu verwenden (Adobe Edge Animate verwendet das für responsive Banner), ABER wenn Sie Transforms für Ihre Animationen verwenden, insbesondere Rotation und Skalierung, und dann den übergeordneten Container skalieren, erhalten Sie eine Menge Rendering-Probleme in Webkit (unterschiedlich auf Desktop, Mobile Safari und Chrome, wohlgemerkt) – Unschärfe, Pixelbildung usw. – die üblichen Sachen.
Ich habe eine Methode experimentell ausprobiert, bei der JS verwendet wird, um die Größe von übergeordneten Containern festzulegen und % für ALLES zu verwenden. Ernsthaft, keine px- oder anderen Einheiten. Auf diese Weise können Sie die Verwendung von Transforms auf übergeordneten Containern vermeiden, wodurch Sie viele Webkit-Rendering-Probleme vermeiden, aber es gibt viele Nachteile. CSS ist schwieriger zu schreiben, Sie müssen einige zusätzliche rechteckige Container/Wrapper verwenden, aber es rendert und skaliert wunderbar.
Ich werde bald einen Pen posten.
:)
Ja, der Padding-Trick mit Seitenverhältnis ist wirklich nützlich, wenn Sie ein eingebettetes Video anzeigen möchten.
Was die Skalierung von allem angeht, verwende ich auch SVG :p (HTML in foreignObject). Funktioniert hervorragend, wenn Sie die Schriftgröße an das übergeordnete Div skalieren möchten (etwas, das mit reinem CSS nicht möglich ist).
Schön zu sehen, dass Sie das endlich aufgreifen! Ja, SVG kann das viel besser, aber bis die unterdurchschnittliche WebKit-Rendering-Engine für UHD-Funktionen aufgerüstet ist und SVG unterstützt, können Apple- und Android-Tablets, die günstige Consumer-Betriebssysteme sind, nicht verwendet werden.
Ein Beispiel für die Verwendung von SVG, um genau das mit minimalem CSS und ohne JavaScript-Berechnungen zu erreichen, finden Sie unter: http://svgdesign.guru
Wow.
Ich musste schon einmal einfache Skalierungen von Text mit Bildern vornehmen und habe am Ende eine Viewport-basierte Gleichung mit calc verwendet, um das zu schaffen. Es erschien anfangs verrückt und dann habe ich mich irgendwie daran gewöhnt. Jetzt verwende ich es eigentlich für wirklich seltsame Übergänge (wie 650-960) und lasse kleinere und größere Werte eher fest.
Hier ist ein Pen mit dem Mixin, das ich verwendet habe: http://codepen.io/dsongman/full/VvWzdP
Ich habe das für Anzeigen im Web verwendet. Wir haben nur zwei Arten von Anzeigen: mobil und Desktop. Auf Tablets skaliere ich die Desktop-Anzeigen herunter, damit sie auf den Bildschirm passen. (Die iframes haben eine feste Breite und Höhe).
Ich habe ähnliche, aber kompliziertere Techniken für Popup-Inhalte verwendet, z. B. YouTube-Videos: http://codepen.io/anon/pen/epwrNQ Es behält das ursprüngliche Seitenverhältnis des Elements bei und passt es basierend auf dem Seitenverhältnis des Fensters an.
Um unerwünschte Beschneidungen bei Größen unter 1366 Pixeln zu vermeiden, habe ich dieselbe Technik für Hintergrundbilder in einem Raster-Akkordeon auf dieser Website verwendet: http://varegg.no/ (Für beste Leistung bitte Firefox unter Windows verwenden.)
Die CSS-Einheit em löst dieses Problem. Durch ihre Verwendung können Sie das Element und alles darin über die Schriftgröße des übergeordneten Elements skalieren.
Wir haben an REMux gearbeitet und es funktioniert, wir werden dies bald in Echtzeit auf unserer Website anwenden http://helpbase.in/ . Aber, wie Sie hier erwähnen, ist es vielleicht notwendig, wenn Sie möchten, dass Text bei bestimmten Bildschirmbreiten lesbar bleibt.
Vielen Dank
Mit freundlichen Grüßen Jiya
Kann jemand ein Beispiel für eine große Enterprise-Website teilen, die eines dieser Konzepte oder ähnliche verwendet? Ich würde gerne sehen, ob es reale Anwendungen dafür gibt.