Ich muss eine Site zusammenstellen, die ein festes Seitenverhältnis von ungefähr 16:9
Landschaft hat, wie ein Video.
Ich möchte, dass es zentriert und erweitert wird, um die verfügbare Breite und Höhe zu füllen, aber niemals auf beiden Seiten größer wird.
Beispielsweise:
- Bei einer hohen und dünnen Seite würde sich der Inhalt über die gesamte Breite erstrecken, während eine proportionale Höhe beibehalten wird.
- Bei einer kurzen, breiten Seite würde sich der Inhalt über die gesamte Höhe mit einer proportionalen Breite erstrecken.
Ich habe mir zwei Methoden angesehen:
- Verwenden Sie ein Bild mit dem richtigen Seitenverhältnis, um einen Container zu erweitern
div
, aber ich konnte nicht erreichen, dass es sich in allen gängigen Browsern gleich verhält. - Das Einstellen einer proportionalen Bodenpolsterung funktioniert jedoch nur relativ zur Breite und ignoriert die Höhe. Es wird mit der Breite immer größer und zeigt vertikale Bildlaufleisten an.
Ich weiß, dass Sie dies mit JS ganz einfach tun können, aber ich hätte gerne eine reine CSS-Lösung.
Irgendwelche Ideen?
html
css
responsive-design
aspect-ratio
Henry Gibson
quelle
quelle
position: relative (default) height: 0 padding-<top/bottom>: H/W*100%
Antworten:
Verwenden Sie die neuen CSS-Ansichtsfenstereinheiten
vw
undvh
(Ansichtsfensterbreite / Ansichtsfensterhöhe)GEIGE
Ändern Sie die Größe vertikal und horizontal und Sie werden sehen, dass das Element immer die maximale Größe des Ansichtsfensters ausfüllt, ohne das Verhältnis zu unterbrechen und ohne Bildlaufleisten!
(REINES) CSS
Code-Snippet anzeigen
Wenn Sie maximal 90% Breite und Höhe des Ansichtsfensters verwenden möchten : FIDDLE
Code-Snippet anzeigen
Auch die Browserunterstützung ist ziemlich gut: IE9 +, FF, Chrome, Safari- caniuse
quelle
vh
,vw
,vmin
,vmax
). Es gibt jedoch eine Problemumgehung , bei der Medienabfragen verwendet werden, um auf iOS-Geräte abzuzielen.Nur die
Danield
Antwort in einem WENIGER Mixin neu formulieren , zur weiteren Verwendung:quelle
Verwenden Sie eine CSS-Medienabfrage
@media
zusammen mit den CSS-Ansichtsfenstereinheitenvw
undvh
passen Sie sie an das Seitenverhältnis des Ansichtsfensters an. Dies hat den Vorteil, dass auch andere Eigenschaften aktualisiert werdenfont-size
.Diese Geige zeigt das feste Seitenverhältnis für das Div und den Text, der genau zu seiner Skalierung passt.
Die anfängliche Größe basiert auf der vollen Breite:
Wenn das Ansichtsfenster breiter als das gewünschte Seitenverhältnis ist, wechseln Sie als Basismaß zur Höhe:
Dies ist sehr ähnlich in der Ader zu dem
max-width
undmax-height
Ansatz von @Danield, nur flexibler.quelle
Meine ursprüngliche Frage dazu war, wie man beide ein Element eines festen Aspekts hat, aber das genau in einen bestimmten Container passt, was es ein wenig fummelig macht. Wenn Sie einfach möchten, dass ein einzelnes Element sein Seitenverhältnis beibehält, ist dies viel einfacher.
Die beste Methode, auf die ich gestoßen bin, besteht darin, einem Element die Höhe Null zu geben und dann den prozentualen Polsterungsboden zu verwenden, um ihm die Höhe zu geben. Die prozentuale Polsterung ist immer proportional zur Breite eines Elements und nicht zu seiner Höhe, selbst wenn es oben oder unten gepolstert ist.
W3C-Polsterungseigenschaften
Wenn Sie dies verwenden, können Sie einem Element eine prozentuale Breite geben, um in einem Container zu sitzen, und dann auffüllen, um das Seitenverhältnis oder mit anderen Worten die Beziehung zwischen seiner Breite und Höhe anzugeben.
Im obigen Beispiel nimmt das Objekt 80% der Containerbreite ein, und dann beträgt seine Höhe 56,25% dieses Werts. Wenn die Breite 160px wäre, wäre die untere Polsterung und damit die Höhe 90px - ein 16: 9-Aspekt.
Das kleine Problem hier, das für Sie möglicherweise kein Problem darstellt, ist, dass sich in Ihrem neuen Objekt kein natürlicher Raum befindet. Wenn Sie beispielsweise Text einfügen müssen und dieser Text seine eigenen Auffüllwerte annehmen muss, müssen Sie einen Container hinzufügen und die darin enthaltenen Eigenschaften angeben.
Außerdem werden vw- und vh-Einheiten in einigen älteren Browsern nicht unterstützt, sodass die akzeptierte Antwort auf meine Frage für Sie möglicherweise nicht möglich ist und Sie möglicherweise etwas mehr Lo-Fi verwenden müssen.
quelle
Ich verstehe, dass Sie gefragt haben, ob Sie eine
CSS
bestimmte Lösung wünschen. Um das Seitenverhältnis beizubehalten, müssten Sie die Höhe durch das gewünschte Seitenverhältnis teilen. 16: 9 = 1,777777777778.Um die richtige Höhe für den Container zu erhalten, müssten Sie die aktuelle Breite durch 1,777777777778 teilen. Da Sie
width
den Container nicht mit nur überprüfenCSS
oder durch einen Prozentsatz dividieren könnenCSS
, ist dies ohneJavaScript
(meines Wissens) nicht möglich .Ich habe ein funktionierendes Skript geschrieben, das das gewünschte Seitenverhältnis beibehält.
HTML
CSS
JavaScript
Sie können das
function
erneut verwenden, wenn Sie mithilfe von etwas anderes mit einem anderen Verhältnis anzeigen möchtenquelle
window.onresize
wird ausgelöst, sobald der Browser seine Größe ändert.Es wurde jetzt eine neue CSS-Eigenschaft angegeben, um dies zu beheben :
object-fit
.http://docs.webplatform.org/wiki/css/properties/object-fit
Die Browserunterstützung fehlt noch etwas ( http://caniuse.com/#feat=object-fit ) - funktioniert derzeit in den meisten Browsern außer Microsoft in gewissem Umfang - aber mit der Zeit ist es genau das, was für diese Frage erforderlich war.
quelle
Danields Antwort ist gut, aber sie kann nur verwendet werden, wenn das div das gesamte Ansichtsfenster ausfüllt, oder indem ein bisschen von verwendet wird
calc
verwendet wird, wenn die Breite und Höhe des anderen Inhalts im Ansichtsfenster bekannt ist.Durch Kombinieren des
margin-bottom
Tricks mit der Methode in der oben genannten Antwort kann das Problem jedoch darauf reduziert werden, nur die Höhe des anderen Inhalts kennen zu müssen. Dies ist nützlich, wenn Sie einen Header mit fester Höhe haben, die Breite der Seitenleiste jedoch nicht bekannt ist.Hier ist es in einer jsfiddle mit scss , was es offensichtlicher macht, woher die Werte kommen.
quelle
Basierend auf Daniels Antwort habe ich dieses SASS-Mixin mit Interpolation (
#{}
) für den Iframe eines Youtube-Videos geschrieben, der sich in einem modalen Bootstrap-Dialog befindet:Verwendung:
HTML:
Dadurch wird das Video immer ohne die schwarzen Teile angezeigt, die YouTube dem Iframe hinzufügt, wenn die Breite oder Höhe nicht proportional zum Video ist. Anmerkungen:
$sides-adjustment
ist eine leichte Anpassung, um einen winzigen Teil dieser schwarzen Teile zu kompensieren, die an den Seiten auftauchen;.modal-footer
;.modal-dialog
..modal-header
.Nach vielen Tests funktioniert dies jetzt für mich einwandfrei.
quelle
hier eine lösung basierend auf @ danield lösung, die auch innerhalb eines div funktioniert.
In diesem Beispiel verwende ich Angular, aber es kann schnell zu Vanilla JS oder einem anderen Framework wechseln.
Die Hauptidee besteht darin, die @ Danield-Lösung in einen leeren Iframe zu verschieben und die Abmessungen zu kopieren, nachdem sich die Größe des Iframe-Fensters geändert hat.
Dieser Iframe muss den Abmessungen seines Vaterelements entsprechen.
https://stackblitz.com/edit/angular-aspect-ratio-by-iframe?file=src%2Findex.html
Hier ein paar Screenshots:
quelle