CSS如何实现长宽比?

本文和大家分享的主要是css中实现长宽比的几种方法,一起来看看吧,希望对大家学习css有所帮助。

长宽比故事

长宽比在影视制作中又被称之为 宽高比 ,指的是一个视频的宽度除以它的高度所得到的比例,通常表示为 x:y 或 x×y ,其中的冒号和叉号表示中文的“比”之意。目前,在电影工业中最常被使用的是anamorphic比例(即 2.39:1 )。传统的 4:3 仍然被使用于现今的许多电视画面上,而它成功的后继规格 16:9 则被用于高清晰度电视或数字电视上。常见的比例:

HTML结构

使用CSS实现容器长宽比,常见的HTML模板结构有两种:

<div data-ratio="16:9">

<div></div>

</div>

另外一种结构是:

<div data-ratio="16:9">

</div>

具体使用的时候,根据自己使用场景采用不同的结构。

CSS实现长宽比例方案

前面也提到过了,使用CSS实现长宽比方案有多种,下面简单的罗列一下这些方案。不过每种方案都不会详细介绍,因为代码非常简单,看一眼代码就能明白其中原理。

垂直方向的padding

这是最早提出的一种实现方案,主要借助的原理是利用 padding-top 或者 padding-bottom 的百分比值,实现容器长宽比。在CSS中 padding-top 或 padding-bottom 的百分比值是根据容器的 width 来计算的。如此一来就很好的实现了容器的长宽比。采用这种方法,需要把容器的 height 设置为 0 。而容器内容的所有元素都需要采用 position:absolute ,不然子元素内容都将被 padding 挤出容器(造成内容溢出)。

比如我们容器的长宽比是 16:9 ,那么根据计算: 100% * 9 / 16 可以得到 56.25% 。如果你希望的是 4:3 ,那么对应的就是 100% * 3 / 4 。

具体的CSS代码如下:

.aspectration {

position: relative; /*因为容器所有子元素需要绝对定位*/

height: 0; /*容器高度是由padding来控制,盒模型原理告诉你一切*/

width: 100%;

}

.aspectration[data-ratio="16:9"] {

padding-top: 56.25%;

}

.aspectration[data-ratio="4:3"]{

padding-top: 75%;

}

通过通配符 * 选择器,让其子元素的宽高和容器 .aspectration 一样大小:

.aspectration > * {

position: absolute;

left: 0;

top: 0;

width: 100%;

height: 100%;

}

padding & calc()

这个方案采用的是 padding 和 calc() 配合在一起使用。其实原理和第一个方案是一样的。只不过在第一个方案中,我们每次都需要对 padding 的值计算,如果使用 calc() 可以通过浏览器直接计算出 padding 的百分比值。

.aspectration[data-ratio="16:9"] {

padding-top: calc(100% * 9 / 16);

}

padding & CSS变量

对于变量而言,以前是其他计算器语言和CSS处理器的特性,不过值得特性的是,现在也是CSS的特性。接下来的这个方案也是基于 padding 原理,只不过是借助于CSS变量特性,让前面的方案变得更为灵活一些。使用CSS的变量时,可以把HTML中 data-ratio 去掉了。换成 style="--aspect-ratio:16/9" ,也可以是 style="--aspect-ratio:1.4;" 。同时也可以借助于第二个方案中的 calc() 。因为CSS的变量和 calc() 函数的结合是一种完美的结合。

.aspectration[style*="--aspect-ratio"] {

padding-top: calc(100% / (var(--aspect-ratio)));

}

padding & 伪元素

前面的方案都是在 .aspectration 元素上使用 padding 值。但在CSS中,还可以使用CSS的伪元素 ::before 或 ::after 来撑开容器。

.aspectration {

position: relative;

}

.aspectration:after {

content: "";

display: block;

width: 1px;

margin-left: -1px;

background-color: orange;

}

.aspectration[data-ratio="16:9"]:after {

padding-top: 56.25%;

}

.content {

width: 100%;

height: 100%;

position: absolute;

top: 0;

left: 0;

}

视窗单位

CSS新特性中提供了一种新的单位 vw 。了解过这个单位的同学都知道,浏览器 100vw 表示的就是浏览器的视窗宽度(Viewport)。打个比方说,如果你的浏览器是 1334px ,那么对就的 100vw = 1334px 。这个时候也就是说 1vw = 13.34px 。这里的 100vw 也对应前面方案中的 100% 。这样我们就可以把前面的 % 单位换成 vw 的单位。打个比方说, 16:9 对应的就是 100vw * 9 / 16 = 56.25vw 。这个值可以用在 padding-top 或者 padding-bottom 中。但这里演示的不再是 padding 了,而是把这个值给 height 。

.aspectration[data-ratio="16:9"] {

width: 100vw;

height: 56.25vw;

}

上面的示例中 width 的值是 30vw ,那么对应的 height 值就是 30vw * 9 / 16 = 16.875vw

视窗单位 & CSS Grid

这是一个很有创意的解决方案,使用的都是CSS新特性:视窗单位和CSS Grid Layout。简单说一下其中的实现原理:将容器 .aspectration 通过 display:grid 声明为一个网格容器,并且利用 repeat() 将容器划分为横向比例,比如 16 ,那么每一格的宽度对应的就是 100vw * 9 / 16 = 6.25vw 。同样使用 grid-auto-rows ,将其设置的值和横向的值一样。在子元素上通过 grid-column 和 grid-row 按比例合并单元格。

.aspectration {

display: grid;

grid-template-columns: repeat(16, 6.25vw);

grid-auto-rows: 6.25vw;

}

.aspectration[data-ratio="16:9"] .content {

grid-column: span 16;

grid-row: span 9;

}

未来原生方案 aspect-ratio

在 WICG的讨论 上,有人提出来了原生的长宽比属性 aspect-ratio 。例如,给定一个容器元素它的 width 和 height 都设置为 auto ,并且 aspect-ratio 的值为 2/1 , max-height:200px 。一个容器宽度为 500px 时,元素首先会设置 width:500px ,然后根据 aspect-ratio 比例将 height 设置为 250px 。这个时候其实违反了 max-height 的约束。相反,容器大小会变成 height: 200px 和 width:400px 。另外,如果元素的 max-width 是 450px 时,长宽比将会完全被忽视,因为无法满足。

如果把 width 设置为一个百分比,高度不设置一个固定值:

.aspectration[data-ratio="16:9"] {

width: 100%;

height: aspect-ratio(16/9);

}

现在讨论讨论趋势是把 aspect-ratio 属性值变成属性,比如:

.aspectration[data-ratio="16:9"] {

width: 100%;

aspect-ratio: calc(16/9);

}

到目前为止,还没有任何浏览器支持该属性,但我们可以借助 PostCSS Aspect Ratio 插件来实现上述的功能:

/* Input. */ .aspect-box {

position: relative;

aspect-ratio: ’16:9’;

}

/* Output. */.aspect-box {

position: relative;

box-sizing: border-box;

} .aspect-box > * /* This targets .aspect-box__content */ {

position: absolute;

top: 0;

right: 0;

bottom: 0;

left: 0;

box-sizing: border-box;

} .aspect-box:before /* This pseudo element uses the padding trick to set the height. */ {

position: relative;

display: block;

content: "";

padding-top: 56.25%;

box-sizing: border-box;

}

来源:W3CPlus

时间: 2024-08-11 09:53:11

CSS如何实现长宽比?的相关文章

CSS基础教程 -- 媒体查询屏幕适配

响应式布局 Media Query 的使用方法 在上例中, 我们使用Media Queries来根据3种不同尺寸的窗口使用3种不同的样式.通过不同的媒体类型和条件定义样式表规则,媒体查询让CSS可以更精确作用于不同的媒体类型和同一媒体的不同条件.媒体查询的大部分媒体特性都接受min和max用于表达"大于或等于"和"小与或等于".如:width会有min-width和max-width媒体查询可以被用在CSS中的@media和@import规则上,也可以被用在HTML

css 巧用 margin/padding 的百分比值实现高度自适应(多用于占位,避免闪烁)

一个基础却又容易混淆的 css 知识点 本文依赖于一个基础却又容易混淆的 css 知识点:当 margin/padding 取形式为百分比的值时,无论是 left/right,还是top/bottom,都是以父元素的width为参照物的! 高度自适应占位 假设有这么个场景: 如上图所示,有这么一种用来放图片的容器,图片都是正方形(为了方便举例用正方形,实际上只要固定长宽比例即可).在 PC 端好办,容器的宽高都写死是多少 px,这样即使图片加载不出来容器都不会变型.但是在移动端,由于各机型分辨率

css体验优化之图片容器设置宽高比

需求 我们在做web页面的时候,经常会有一些图片列表,例如下图的视频列表以及表情列表:        需求要求: 1. 列表是responsive的,在不同宽度的浏览器下面,图片要自适应容器宽度 2. 图片在自适应的过程中,图片的长宽比要保持不变 常规解决方案 在container宽度固定的需求中(比如PC版页面),我们直接设置图片容器或者图片为固定的宽高就好了,比如: 1 img{ 2 width:330px; 3 height:180px; 4 } 但是这个不能满足需求,为了满足上面的需求两

CSS自动控制图片大小的代码

img { max-width: 800px; height: auto; } 代码中的max-width:800px限制图片的最大宽度为800像素,而下面的hight:auto很关键,可以保证图片有正确的长宽比,不至于因为被调整宽度而变形. 实用例子(未经测试————————————————————) WordPress自动调整图片大小 1.打开你的“样式表 (style.css)”文件,然后在 p img{ 或类似的地方添加下列代码(可以将所有550改成你想要的宽度) 代码如下 p img{

CSS媒体查询:菜鸟笔记

CSS媒体查询 媒体查询包含了一个媒体类型和至少一个使用如高度.宽度和颜色等媒体属性来限制样式表范围的表达式.CSS3加入的媒体查询使得无需修改内容便可以使样式应用于某些特定的设备范围. 语法 媒体查询包含了一个媒体类型和如css3规范中描述的包含了一个或多个表达式的媒体属性,这些媒体属性会被解析成真或假.如果媒体查询中的媒体类型与文档要展示的设备相符则查询结果为真,并且媒体查询中的所有表达式为真. <!--link元素中的css媒体查询--> <link rel="style

CSS background-size 属性详解

css background-size 属性详解,background-size 指定背景图像大小,以象素或百分比显示,当指定为百分比时,大小会由所在区域的宽度.高度以及 background-origin 的位置决定,还可以通过 cover 和 contain 来对图片进行伸缩. background-size 属性 1.定义: background-size 用来调整背景图像的尺寸大小. 2.语法: 以下为引用内容:background-size : contain | cover | 10

从今天起开始使用 CSS 属性 calc()

原文地址:Getting Started With CSS calc() 四年前,看了CSS3 Click Chart这篇文章之后,我第一次发现了calc() ,我当然非常高兴能够看到,基本的数学运算-加法,减法,乘法和除法-能够在CSS中应用. 大部分人可能会觉着预处理就可以实现逻辑运算.但是预处理器只能同单位的运算,如角度单位,时间单位,频率单位,分辨率单元和固定长度单位.而calc()可以实现混合单位的逻辑运算. 1turn总是360deg,100grad始终是90deg,而3.14rad

CSS中background属性详解

CSS背景属性 background css 说明 background-image:url(图片的网址); 背景图 background: url( 图片的网址 ); 背景 background-color:#色码; 背景色彩 Exp: background-image:url(背景图案.jpg,gif,bmp); background-color:#FFFFFF; background-color : tra CSS背景属性 background css 说明 background-imag

css背景图片、圆角、盒子阴影、浮动

一.css背景图片 1.概述 背景是css中一个重要的的部分,也是需要知道的css的基础知识之一.这里主要介绍有关背景图片的5种常见属性,分别是: (1). background-color: rgb(0, 0, 255); background-color: #0000ff; background-color 也可被设置为透明(transparent),这会使得其下的元素可见. 3.背景图(background-image) background-image 属性允许指定一个图片展示在背景中.