Wenn Sie den Weg des responsiven Webdesigns einschlagen, gehören flüssige Raster dazu. Das heißt, Container-Elemente mit prozentualen Breiten. Nur ein Beispiel: Ein <article>, das einen Blogbeitrag enthält, könnte auf einem kleinen Bildschirm 320 Pixel breit und auf einem großen Bildschirm 690 Pixel breit sein. Text kann in der Größe geändert werden und fließt gut, um einen Container zu füllen. Das ist nicht allzu schwer. Aber Medien – Bilder, Videoplayer und Audioplayer – erfordern etwas mehr Aufmerksamkeit (z. B. ein Video, das vom Bildschirmrand absteht == schlecht). Dieser Beitrag soll die Methoden zur Handhabung dieser Medien zusammenfassen.
Flexible Bilder

Wenn Sie mit Unterstützung für IE 7 und höher zufrieden sind. Dieses kleine Schmuckstück wird Ihnen gute Dienste leisten
img {
max-width: 100%;
/* just in case, to force correct aspect ratio */
height: auto !important;
}
Wenn Sie sich um die Unterstützung für IE 7 kümmern (ich hoffe nicht, aber ich verstehe, dass es Szenarien gibt, in denen Sie müssen), verwenden Sie dies, um sicherzustellen, dass die Bilder die Skalierung überstehen
img {
-ms-interpolation-mode: bicubic;
}
Hier erfahren Sie mehr dazu.
Wenn Sie sich um IE 6 kümmern müssen (schon wieder…) enthält dieser Artikel von Ethan Marcotte eine JavaScript-Lösung. Eine Art Kummer, zusätzliches JavaScript für einen bereits viel langsameren Browser zu laden, aber so ist das Leben.
Ein Umdenken
Es gab eine Zeit, in der das Ändern der Größe von Bildern ein ziemliches Tabu war. Browser waren schlecht darin, Bilder zu skalieren, und Bandbreite wurde verschwendet. Diese Haltung ist heute fast verschwunden, hauptsächlich weil Browser Bilder jetzt ziemlich gut skalieren und gut aussehen lassen. Tatsächlich ist es mit "Retina"-Displays eine gute Sache, zu große Bilder für den Container zu liefern, da sie beim Herunterskalieren schärfer aussehen.
Die Bandbreite ist jedoch immer noch ein (großes) Problem. Deshalb ist das Thema responsive Bilder gerade so heiß. Der Punkt ist: Wenn Sie an flexible Bilder denken, denken Sie auch über responsive Bilder nach. Mehr dazu finden Sie hier in den aktuellen Lösungen.
Flexibles Video
Flexibles Video ist etwas komplexer als Bilder. Wenn Sie HTML5 <video> *direkt* verwenden, ist die gute Nachricht, dass es sein Seitenverhältnis beibehält, genau wie Bilder, sodass die gleiche Technik funktioniert.
video {
max-width: 100%;
/* just in case, to force correct aspect ratio */
height: auto !important;
}
Ich bin jedoch der Meinung, dass es eine ziemlich schlechte Idee ist, HTML5 <video> direkt zu verwenden. Die benötigten Formate haben sich jahrelang verschoben und sind noch nicht am Ende. Hinzu kommt, dass 1) das Hosten von Videos bandbreitenintensiv und teuer ist, 2) Streaming ein weiteres kompliziertes Thema ist, 3) die Aufrechterhaltung der richtigen Qualität über Formate, Geräte und verfügbare Bandbreite hinweg schwierig ist und 4) das Skinning konsistenter Steuerelemente für den Player schwierig ist und... nun ja... verwenden Sie HTML5-Video direkt nicht.
Stattdessen empfehle ich dringend die Verwendung eines Videodienstes wie YouTube oder Vimeo. Wenn Sie Videos von diesen Diensten einbetten, betten Sie ein <iframe> ein. Was sich im iframe befindet, kann HTML5-Video sein, aber Sie müssen sich nicht direkt damit befassen.
All das bedeutet: <iframe>s haben ein Problem mit dem Seitenverhältnis.
Thierry Koblentz hat dieses Problem vor Jahren in seinem A List Apart-Artikel Creating Intrinsic Ratios for Video gelöst.
Die Grundidee ist, dass Sie einen Video-Wrapper-Div mit null Höhe und einem Top-Padding in Prozent erstellen. Dieser Prozentsatz ist tatsächlich ein Prozentsatz der Breite, wodurch das Seitenverhältnis beibehalten wird. Dann positionieren Sie das Video absolut darin, was Ihnen die schwer fassbare Fähigkeit gibt, das Seitenverhältnis beizubehalten. Wir würden den iframe für die absolute Positionierung ansprechen, da Videos dies nicht brauchen, aber iframes schon. Die Grundlagen
.video-wrapper {
height: 0;
padding-bottom: 56.25%; /* 16:9 */
position: relative;
}
.video-wrapper iframe {
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
}
Schauen Sie sich den Artikel dazu für weitere Nuancen und Details zur Unterstützung älterer Browser an. Ich behandle auch all dies und füge einige selbstgemachte JavaScript-Lösungen (mit Demos) in meinem .net-Magazin-Artikel Create Fluid Width Videos hinzu.
Genug Komplexität, hereinspaziert Simplicity
Wenn Sie jQuery verwenden und genug von der Komplexität rund um das Thema flexibles Video haben, lade ich Sie ein, FitVids.js auszuprobieren. Ich habe dieses kleine jQuery-Plugin zusammen mit Dave Rupert entwickelt, um genau dieses Problem zu lösen. Es verwendet die gleichen Konzepte wie oben erklärt, nur dass es dies automatisch tut. Das bedeutet 1) keine nicht-semantische Hülle in Ihrem verfassten Markup, 2) Seitenverhältnisse, die zum einzelnen Video passen (nicht alle Videos sind gleich).

FitVids.js funktioniert sofort mit allen gängigen Videoplayern und ist sehr einfach zu erweitern, um mit jedem Player zu funktionieren.
Sublime Video verwenden?
Ich habe ein Tutorial, wie man deren Player flüssig macht.
MediaElements.js verwenden?
MediaElements.js ist ein sehr schöner HTML5-Videoplayer, der einige der oben genannten Probleme mit HTML5-Video löst. Insbesondere bietet er ein schönes konsistentes Player-Skin und die Möglichkeit, auf ältere Technologien wie Flash und Silverlight zurückzugreifen, um Videos abzuspielen. Es ist kein Allheilmittel, da es Sie nicht vor den Plattformkriegen auf Mobilgeräten (die im Allgemeinen kein Flash oder Silverlight haben) rettet oder bei Streaming- oder Qualitätsproblemen hilft, aber es ist trotzdem nett.
Es gibt eine Menge fester Pixelberechnungen in MediaElements.js, aber ich konnte es in der Vergangenheit mit einigen !important-Overrides zu einer flüssigen Breite zwingen.
.mejs-container {
width: 100% !important;
height: auto !important;
padding-top: 57%;
}
.mejs-overlay, .mejs-poster {
width: 100% !important;
height: 100% !important;
}
.mejs-mediaelement video {
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
width: 100% !important;
height: 100% !important;
}
Responsives Video?
Erinnern Sie sich, dass responsive Bilder ein heißes Thema sind, weil wir verantwortungsbewusst sein und keine unnötig großen Bilder ausliefern wollen? Video hat dasselbe Problem, nur noch verschärft durch... äh... so viele Frames, wie das ganze Video enthält (wahrscheinlich viele).
Eine halb-holprige Lösung ist, unterschiedliche Videoquellen abhängig von der Browserfensterbreite zu liefern. Ich habe hier ein Tutorial dazu.
Eine andere Lösung ist die Verwendung von Media-Attributen für die Videoquellen und die Hoffnung, dass die Unterstützung besser wird und sie nicht entfernt wird.
<video controls>
<source src="video-small.mp4" type="video/mp4" media="all and (max-width: 480px)">
<source src="video-small.webm" type="video/webm" media="all and (max-width: 480px)">
<source src="video.mp4" type="video/mp4">
<source src="video.webm" type="video/webm">
</video>
Die beste Lösung ist die Verwendung eines Videodienstes, und dieser wird es für Sie erledigen.
Flexibles Audio
Sie "sehen" HTML5-Audio nur, wenn Sie explizit das `controls`-Attribut für das Element verwenden.
<audio controls src="audio.ogg">
<p>Fallback.</p>
</audio>
Die gute Nachricht ist, dass Sie einfach `width: 100%;` auf dieses Ding werfen und es wird flexibel flexibel sein.
audio {
width: 100%;
}
WebKit-Browser begrenzen die Breite aus irgendeinem Grund auf 800 Pixel. Aber der Player bleibt darin zentriert. Opera und Firefox haben keine solche Begrenzung. Sie haben alle leicht unterschiedliche Player, aber alle machen im Grunde dasselbe (spielen den Ton ab und haben Play- und Pausentasten und so weiter).
Der einzige weitere sehr beliebte eingebettete Soundplayer im Moment ist der SoundCloud-Player und dieser ist standardmäßig flüssig (go team!).
Ich glaube nicht unbedingt an das ganze Grid-Ding für Responsive Design. Ich arbeite gerade an einem persönlichen Projekt, bei dem ich auf den Grid-Ansatz verzichte. Es ist nicht schwer, wenn man die Standard-Markup als Container mit prozentualen Breiten verwendet. Gridless ist ein HTML5 & CSS3-Boilerplate, das einen ähnlichen Ansatz verfolgt.
Meiner Meinung nach ist jede Zeitersparnis durch ein Grid-Template irrelevant, wenn man am Ende mit aufgeblähtem und nicht-semantischem Markup dasteht.
Ich bin auch kein großer Fan von komplexen Grid-Frameworks, deshalb [denken Sie nicht zu viel über Grids nach.](https://css-tricks.de/dont-overthink-it-grids/) Aber wenn Sie einen Hauptinhaltbereich haben, der 75 % breit ist, und eine Seitenleiste, die 25 % breit ist, ist das ein Grid, und es ist Zeit, über flexible Medien nachzudenken.
Ich stimme zu und mag Ihren Artikel über flexible Medien. Ich habe meine Bilder auf diese Weise eingerichtet. Ich habe niemals zwei Inhaltsblöcke mit prozentualer Breite als Grid betrachtet, aber ich verstehe Ihren Punkt.
Ich werde mir Ihren anderen Artikel auf jeden Fall ansehen. Danke.
Sie werden kein aufgeblähtes und nicht-semantisches Markup haben, wenn Sie einen CSS-Präprozessor wie SASS optimal nutzen.
Wenn das als Ergebnis der Verwendung eines Grids passiert, wird es nicht korrekt implementiert. Selbst die größten Grid-Nutzer, -Befürworter oder -Unternehmen, die wissen, wie man einen Präprozessor wie SASS verwendet, hätten den Weg beschritten, ihr Grid zu nutzen, ohne viel, wenn überhaupt, zusätzlichen Markup hinzuzufügen.
Präprozessoren wurden entwickelt, um solche Probleme mit reinem CSS zu lösen, abgesehen davon, dass die Entwicklung mit CSS schneller, einfacher (letztendlich) und leichter lesbar wird. Wenn man Dinge wie Platzhalterselektoren in SASS 3.2 berücksichtigt, gibt es im Wesentlichen keine Ausrede, "semantisch nutzlose Klassenitis" und ein "kompetenter Präprozessor-Nutzer" im selben Satz zu haben.
Foundation ist ein Framework, das SASS mit vielen Mixins verwendet, um genau das zu tun. Bootstrap erlaubt es Ihnen auch, aber die meisten nutzen oder bothern sich nicht mit LESS, um den gleichen (oder einen ähnlichen) Effekt zu erzielen. Wenn Sie es selbst ausprobieren, werden Sie sehen, dass Sie Grids nur den Klassen oder IDs Ihrer tatsächlichen Inhalte zuordnen können.
Das bedeutet, dass Sie keine 'omega3 last', 'grid3' oder all diese Grid-Klassen-Markup-Elemente mehr benötigen, die Sie wahrscheinlich von älteren Grid-Implementierungen kennen.
Toller Beitrag und gute Ressourcen.
Ich habe diese Zeile zu meiner flexiblen img-Klasse hinzugefügt
width: auto\9; /* ie8 */
Ich weiß nicht warum, aber es sollte einen IE-Bug beheben... ist das wirklich notwendig?
OFFTOPIC
Ihr "\9" wird auch von IE9 erkannt. Ich bin mir nicht sicher, ob Sie das wussten.
Um nur IE9 und höher anzusprechen, verwenden Sie
:root .class/#id { property:value /IE9; }
Weitere Informationen hier: http://blog.vervestudios.co/blog/post/2011/05/13/IE9-Only-CSS-Hack.aspx
Zwei Dinge
1. Was ist, wenn Sie mit Entwicklern arbeiten, die kaum Ahnung von HTML5 oder gar von Best Practices haben? In meinem persönlichen Fall sind Beiträge wie diese, obwohl unglaublich nützlich und hilfreich, so, dass ich niemals etwas davon verwenden werde. FEHLGESCHLAGEN.
Ich beneide die, die das können...
2. Anstatt "Bandwidth Media Queries", sollte es nicht einfach "Bandwidth Queries" heißen?
Ich meine, Bandbreite hat nichts mit Medien zu tun.
Nur zur Info...
Danke für die Infos, Chris.
HTML5 befindet sich meiner Meinung nach immer noch in seinen Anfängen. Viele Leute wollen auf den Zug aufspringen, aber viele Leute wissen ehrlich gesagt nicht, was Best Practices und die besten Techniken sind. HTML5 ist ein Schlagwort, obwohl es viel Gutes mit sich bringt, ist es immer noch ein Schlagwort. CSS3 hingegen... Nun, sagen wir einfach, CSS3 wird das Web revolutionieren, wie wir es kennen.
Zu Ihrem späteren Punkt. Ich bin verwirrt über Ihre Aussage zu Bandwidth Media Queries. Sie können einfach von responsiven Elementen sprechen. Wie die, die er oben aufgeführt hat, wie: Video, Audio und Bilder. Das war's im Grunde.
Das Web durchläuft eine Zeit, in der Einfachheit zurückkehrt, um dem, was die Zukunft ist, entgegenzuwirken. Retina-Display, mobile Geräte usw. Wir leben nicht mehr in einer pixelperfekten Welt, und Sie sollten sich besser darauf einstellen, denn bald werden diese Praktiken oder weiterentwickelte Praktiken etwas sein, das für einen Job erforderlich ist. Denken Sie daran wie Tabellen im Vergleich zu Divs. Der Kampf dauerte Jahre, bis die Leute erkannten, dass Tabellen schlecht sind und nur für tabellarische Daten wirklich gedacht sind.
Vielen Dank für all diese großartigen Tipps, Chris.
Gestern habe ich daran gearbeitet, Fitvid für den JWPlayer zum Laufen zu bringen, und ich konnte es einfach nicht herausfinden. Gibt es dafür irgendwo Dokumentation? Es sieht so aus, als wäre es wirklich nur für Videos von beliebten Hosting-Seiten wie YouTube und Vimeo.
Wie immer, gute Arbeit. Ich habe den Trick mit dem responsiven Video zum ersten Mal von Ethan Marcotte während seiner Präsentation bei An Event Apart gelernt.
Ein interessanter Punkt, der bei der genannten Konferenz gemacht wurde, ist, dass Responsive Design bald zu Ende geht. Anstatt es als "Modeerscheinung" zu betrachten, erkennen viele Leute in der Entwicklergemeinschaft, dass dies (Responsive Design) einfach eine gute Idee für alle Projekte ist. Responsive Design wird nicht sterben – es wird einfach Teil des Standard-Toolkits für Entwickler.
Artikel wie dieser helfen dabei, das weiter zu fördern, und ich schätze die Zeit, die Sie sich für das Schreiben genommen haben.
Sehr schöner Blogbeitrag, Chris. Immer nützlich, um heutzutage weitere Informationen über Responsive Design zu erhalten.
Ich mag die Padding-Methode von Thierry Koblentz, um die Responsivität zu erhalten. Sehr, sehr clever.
Schöner Artikel, ich setze Responsive Design gerade um :), ich habe Probleme, die Google Maps API JavaScript v3 zum Laufen zu bringen. Hat jemand es geschafft, das responsiv zu machen, damit es sich wie ein Bild verhält, wenn man `img{max-width:100%}` einstellt?
Hmmmm. . . Ich glaube, das habe ich einmal gemacht, obwohl ich es responsiv gemacht habe, um das ganze Browserfenster zu füllen, und es dann per iframe eingebettet habe. Es ist eine Weile her, seit ich das gemacht habe, und ich bin mir nicht sicher, wie genau ich es gemacht habe.
Es gibt ein jQuery-Plugin, um Google Maps responsiv zu machen, aber ich habe es selbst nicht ausprobiert, daher kann ich Ihnen nicht viel darüber erzählen, außer dem Link zum Artikel.
http://joggink.com/2012/01/responsive-google-maps/
Ein guter Artikel über Responsive Design. Ich habe versucht, einige der Responsive Design-Techniken in meiner Arbeit zu übernehmen, und dies wird eine davon sein.
Gute Recherche und sehr nützliche Informationen. Danke!
Viele tolle Tipps hier... besonders die Tipps bezüglich dieser Videodienste... sie sehen toll aus... ich spreche von Sublime Video und MediaElements.js... Diese sind neu für mich... aber ich werde sie ausprobieren...
Ich stimme 100% zu, was HTML5-Video betrifft... reines HTML5-Video mit dem Videotag ist eine Qual... verwenden Sie einfach einen Videodienst und fertig... für die meisten Kunden wird diese Lösung gut funktionieren...
@Dave Z: Ich habe kürzlich einen Artikel über eine gute Möglichkeit, mit Grids zu arbeiten, geschrieben. Es geht um Neat und Sie brauchen kein unsemantisches HTML: http://stefanvermaas.nl/html-css/designing-html5-pretty-neat-huh/
Danke Chris für das Teilen dieser nützlichen Tipps!
Chris - Unterstützt Fitvids.js Google Maps iframes? Wenn nicht, können Sie die Unterstützung hinzufügen?
Dieser Beitrag deckt so gut wie alles ab, was Sie brauchen. =] Ich habe an einem Basis-Stylesheet für Responsive Design gearbeitet, das vieles davon enthält, einschließlich Hilfsklassen für Video-Wrapper wie class=rwd-wrap-16:9 und class=rwd-wrap-4:3.
Hallo,
Vielen Dank dafür. Ich arbeite mit dem responsiven Video-Embed von YouTube. Insbesondere bette ich eine Playlist ein.
Seltsamerweise spielt die Playlist, wenn sie responsiv eingebettet ist, nicht weiter als das erste Video. Wenn sie mit dem Standardcode von YouTube eingebettet wird, durchlaufen die Videos die Playlist wie geschmiert. Es scheint seltsam, dass 'width:100%' die Videos am Abspielen hindert, aber ich kann keinen anderen Fehler finden. Haben Sie vielleicht eine Vermutung?
Derzeit habe ich ein Problem, bei dem IE 9 die Breite eines Bildelements, das auf eine SVG-Datei verweist (
<img src="logo.svg">), neu skaliert, aber die Höhe wird nicht skaliert, selbst mitheight: auto;:'(Ich brauchte wirklich eine einfache Möglichkeit, Vimeo-Videos responsiv zu machen, daher bin ich sehr froh, Ihren Artikel gefunden zu haben. Vielen Dank für die Tipps, Chris!
Toller Beitrag Chris, wie immer. Es gibt einen Tippfehler: aspet (aspect) ratio (2 Mal).
Hallo, ich bin neu hier, aber ich liebe css-tricks.com wirklich. Ich habe einige Fragen.
Ich habe früher Bilder mit `display: none` für responsive Seiten versteckt, aber wie kann ich dynamisch verhindern, dass das Bild/Objekt geladen wird, wenn der Bildschirm des Benutzers klein ist?
Können Sie einen Tipp geben? Vielleicht mit einem Skript?
Danke!!
@benny, wenn es in Ordnung ist, Bilder ohne JavaScript zu laden (und das ist eine ziemlich große Einschränkung), dann können Sie ein Element mit `data-image="imagesrc"` erstellen und dann JS verwenden, um das Element zu ändern.
Verwenden Sie zum Beispiel diesen HTML:
<a href="foo" rel="nofollow"></a>Und dieses JS (dies geht von jQuery aus)
Sie müssen zuerst prüfen, ob Ihre Bildschirmbreite stimmt, aber hoffentlich bringt Sie das auf den richtigen Weg. Ich habe diese Technik @ http://arvadacenter.org verwendet.