前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >元素固定宽高比这么写太香了 - Chrome 支持 aspect-ratio 了

元素固定宽高比这么写太香了 - Chrome 支持 aspect-ratio 了

作者头像
歪马
发布于 2021-03-16 00:39:04
发布于 2021-03-16 00:39:04
1.4K00
代码可运行
举报
文章被收录于专栏:歪码行空歪码行空
运行总次数:0
代码可运行

前言

去年差不多这个时候,发了一篇关于CSS 固定宽高比实现的文章,总结了如何从面试者的角度回答固定宽高比实现的问题。如果你对于历史的 hack 方式不太熟悉,建议先浏览一下原文章

原文章的最后提到了 aspect-ratio 这种方式。不过当时还没有浏览器实现,现在标准以及实现都有了一些新的进展,这里再次跟大家同步下。

本文会介绍现在的浏览器实现与标准的进展情况、并讲解下具体用法

此处,感谢掘友“小蟋蟀 00[1]”的评论提醒,让我有动力再更新下 ?。

浏览器实现及标准现状

2021 年 1 月 19 号,Chrome 发布了 Chrome 88,这一版本的更新中就包含了 aspect-ratio的实现。详情可以参考 Chrome 88 更新内容[2]

Edge 现在使用的是 Chrome 内核,所以也支持 aspect-ratio

除此之外,Safari 的技术预览版(下载地址[3])已经支持 aspect-ratio了,参考Safari 技术预览版 118 版本的发版日志[4]

Safairi 对 macOS 版本有要求,本着谨慎升级的态度,我没有在该浏览器进行验证。

Firefox 从 81 版本之后也开始逐步支持 aspect-ratio 了。不过需要开启对应的配置才行。地址栏输入about:config,然后搜索 layout.css.aspect-ratio.enabled,将其设为 true 即可。

目前来看,浏览器对于 aspect-ratio 的实现程度还是很向好的。相关的规范也在去年十月更新了一版工作组草案[5]

所以是时候爬起来再学一学了,希望大家都还能学得动 ?。下面我们从规范着手来看看具体的用法吧。

aspect-ratio 的具体用法

之前的文章也有提到,类似图片和视频等元素本身就具有一个内在宽高比,与素材的内容本身相关。CSS 的布局算法会在元素尺寸变化的时候尝试维持这一尺寸。

而对于非替换元素,则无法实现类似的效果。aspect-ratio就是为了解决这一场景而提出的,可以给非替换元素指定期望的宽高比,CSS 在进行布局计算的时候,会按照给定的值进行计算。

此外,该属性还可以用来修改可替换元素的固有宽高比。

aspect-ratio 可用于除行内盒子和table表格之外的元素,默认值为 auto,不支持继承,不支持百分比值xx%

aspect-ratio 支持下面三类值:

  • auto:默认值,和以前的行为一样;这时候尺寸计算只考虑content-box内容盒子。
  • <ratio>:通过 width / height 的格式指定宽高比,可以指定小数,不能使用百分比值;这时尺寸计算与box-sizing指定的值有关
  • auto && <ratio>:如果同时指定了 auto<ratio>值,如果应用的元素是可替换元素,则使用auto,如果不是则使用指定的<ratio>。这种情况下,尺寸计算时按照content-box内容盒子计算。

给一个元素指定宽高比值并不意味着会把这个元素变成可替换元素,这个应该很好理解。之所以会这么说,是想说对于一些仅对可替换元素生效的布局规则,并不会因为指定宽高比而对非替换元素生效。如对于非替换元素,justify-self: normal 相当于 stretch,而不是start

如果元素的宽高都不是auto时,则aspect-ratio 无效,也就是说宽高必须有一个值为 auto

以上是aspect-ratio的基本用法讲解,下面我们看几个例子。

为了便于展示,除盒子的通用 css 样式如下所示外,其他代码如图中文字所示,不单独贴代码了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
background-color: salmon;
margin: 10px auto;
display: block;
text-align: center;
line-height: 2;
white-space: pre-line;

1. 高度固定,宽度按比例

2. 宽度固定,高度按比例

3. 宽度固定,高度按比例,值为小数,效果同2

4. 当存在边框或者内边距时,默认情况是内容区域是按比例的

可以看出下图的内容区域,即红色区域的比例为 2/1

当然,我们可以通过 box-sizing 来改变这一行为。可以看出整个区域的比例是 2/1

5. 修改可替换元素的宽高比

通过apect-ratio可以修改可替换元素的宽高比,此外如果对于元素同时设置 auto<ratio>,则可替换元素会应用 auto,而非可替换元素则使用指定的比例。如下图所示,上半部分图片的尺寸改成了正方形,下半部分会应用 auto:

6. 默认会基于内容自动计算最小尺寸

为了避免意料之外的溢出情况,如果没有显式地指定 overflow 的值,则当内容溢出时,元素会打破所设置的宽高比,显式地设置 overflow 的值即可,如 overflow: auto; / overflow: hidden;

如下图中两个块所示,上图是默认包含了溢出内容,下图指定了 overflow: auto;,则会按照预期行为展示。

也可以通过指定min-width/min-height的方式来避免这个问题,这里我就不贴代码和图了,大家可以自己试试。

细心的你可能从这个情况会发现aspect-ratio的优先级比min-width/min-height高,即使指定了 min-width/min-height,布局计算时也会尽可能满足指定的宽高比。

兼容性写法

虽然浏览器已经逐步支持了,但是支持度尚欠缺,如果想尝试使用的话,可以尝试下面的兼容性写法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.box {
  width: 4rem;
  aspect-ratio: 1 / 1;
}

@supports not (aspect-ratio: 1 / 1) {
  .box {
    height: 4rem;
    width: 4rem;
  }
}

总结

以上就是所有的内容,希望对你有帮助。

参考链接

  1. New in Chrome 88: aspect-ratio[6]
  2. New in Chrome 88[7]
  3. CSS 规范[8]

参考资料

[1]

小蟋蟀 00: https://juejin.cn/user/1802854800819022

[2]

Chrome 88 更新内容: https://developer.chrome.com/blog/new-in-chrome-88/

[3]

下载地址: https://developer.apple.com/safari/download/

[4]

Safari 技术预览版 118 版本的发版日志: https://webkit.org/blog/11439/release-notes-for-safari-technology-preview-118/

[5]

工作组草案: https://www.w3.org/TR/css-sizing-4/#ratios

[6]

New in Chrome 88: aspect-ratio: https://css-tricks.com/new-in-chrome-88-aspect-ratio/

[7]

New in Chrome 88: https://developer.chrome.com/blog/new-in-chrome-88/

[8]

CSS 规范: https://www.w3.org/TR/css-sizing-4/#ratios


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 歪码行空 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
面试官:CSS如何实现固定宽高比?
对于这个问题,你可能还没有过相关需求,或者还没有在面试的时候被问到过,但是歪马相信你终将有需要。
歪马
2020/04/07
8.2K0
面试官:CSS如何实现固定宽高比?
css媒体查询aspect-ratio宽高比在less中的使用
css媒体查询有一个 宽高比很方便,aspect-ratio ,可以直接使用宽/高 来进行页面适配   使用样例如下:
蓓蕾心晴
2019/08/08
3.3K0
min-aspect-ratio和max-aspect-ratio宽高比自适应
首先,移动端的适配,还是要先做好的,不管你是使用rem布局,还是使用media进行适配布局(只是单纯的宽度上),布局好了,这里只是宽度自适应了,如果是流式布局的话,这样就已经足够了,对于我们这里的单屏布局,就略显不足了。
javascript.shop
2019/09/04
5.9K0
宝, 来学习一下CSS中的宽高比,让 h5 开发更想你的夜!
在图像和其他响应式元素的宽度和高度之间有一个一致的比例是很重要的。在CSS中,我们使用padding hack已经很多年了,但现在我们在CSS中有了原生的长宽比支持。
前端小智@大迁世界
2022/06/15
1.9K0
宝, 来学习一下CSS中的宽高比,让 h5 开发更想你的夜!
掌握这些CSS知识点,Coding如飞!
整理了一些在CSS(层叠样式表)中的知识点,或许你曾看过一些什么“万字总结”、“面试必看”,但还是希望更多同学能够沉下心来学习,不仅仅满足于停留在“API工程师”的层面,多从CSS约定的规则去解释现象。
小东同学
2022/07/29
1.1K0
掌握这些CSS知识点,Coding如飞!
Web前端进阶高薪必会的54个CSS重难点知识梳理(1)
本次我把CSS中的重难点整理出来,总共54个核心知识点,供大家复习,希望能帮到大家。这些重难点是进阶高薪必需要掌握的知识点,同时也是面试必问的内容。
艾编程
2022/12/05
1.8K0
Web前端进阶高薪必会的54个CSS重难点知识梳理(1)
看完了 2021 CSS 年度报告,我学到了啥?
大家好,我是 ConardLi,一年一度的 CSS年度报告 如期而至,我挑了一些我感兴趣的部分,和我一起来看看吧~
ConardLi
2021/12/21
8730
看完了 2021 CSS 年度报告,我学到了啥?
如何把控css的方向感
在介绍完问题学习法之后,进入我们今天的主题,接下来我会介绍css的一些底层的知识和比较诡异的现象,借此来让大家对css有更深入的理解。
徐小夕
2019/08/08
1.3K0
如何把控css的方向感
css必知的几个底层知识和技巧
问题学习法:带着问题去学习,有利于集中注意力,目的明确,这既是有意学习的要求,也是发现学习的必要条件。心理学家把注意分为无意注意与有意注意两种。有意注意要求预先有自觉的目的,必要时需经过意志努力,主动地对一定的事物发生注意。它表明人的心理活动的主体性和积极性。问题学习法就是强调有意注意有关解决问题的信息,使学习有了明确的指向性,从而提高学习效率。
.T.
2022/02/20
2.2K0
CSS @media 规则
如果浏览器窗口的宽度为 768px 或更小时,把 <body> 元素的背景颜色更改为“浅蓝色”:
taoli
2022/08/28
1.8K0
CSS @media 规则
新时代布局中一些有意思的特性
在最新的 Chrome Canary 中,一个有意思的 CSS 语法 Container Queries 得到了支持。
Sb_Coco
2021/04/22
2.2K0
现代图片性能优化及体验优化指南 - 缩放精细化展示及避免布局偏移、拉伸
图片资源,在我们的业务中可谓是占据了非常大头的一环,尤其是其对带宽的消耗是十分巨大的。
Sb_Coco
2023/03/01
1.3K0
现代图片性能优化及体验优化指南 - 缩放精细化展示及避免布局偏移、拉伸
随方逐圆--全面理解CSS媒体查询
在CSS2中,媒体查询只使用于<style>和<link>标签中,以media属性存在;media属性用于为不同的媒介类型规定不同的样式,而真正广泛使用的媒介类型是'screen'、'print'和'all'
江米小枣
2020/06/15
1.3K0
字节前端都知道的CSS包含块规则
包含块是一个非常重要的概念,通常包含块是当前元素的最近祖先元素的内容区,包含块的形成依赖于CSS position属性。
小东同学
2022/07/29
3810
字节前端都知道的CSS包含块规则
CSS元素高度始终跟随宽度
要让一个 CSS 元素的高度始终跟随其宽度,你可以使用 padding-bottom 或 aspect-ratio 属性,具体取决于你对浏览器支持的要求。以下是两种常见的方法:
是山河呀
2025/01/26
3280
【面试题】104道 CSS 面试题,助你查漏补缺(下)
https://github.com/CavsZhouyou/Front-End-Interview-Notebook/blob/master/Css/Css.md
pingan8787
2020/11/03
2.6K0
【面试题】104道 CSS 面试题,助你查漏补缺(下)
CSS3笔记
边框 border-image 设置所有边框图像的速记属性。 -border-image-source 用于指定要用于绘制边框的图像的位置 -border-image-sli ce 图像边界向内偏移 -border-image-width 图像边界的宽度 -border-image-outset 用于指定在边框外部绘制 border-image-area 的量 -border-image-repeat 用于设置图像边界是否应重复(repeat)、拉伸(stretch)或铺满(round)。 border-
菜鸟雷
2020/10/23
3.8K0
新提案,初识CSS的object-view-box属性
在开发时,一直希望有一种原生的CSS方式来裁剪图片,并将其定位在我需要的任何方向。这可以通过使用一个额外的HTML元素和不同的CSS属性来实现,后面解释。
前端小智@大迁世界
2022/06/12
9800
新提案,初识CSS的object-view-box属性
CSS布局(二) 盒子模型属性
盒子模型的属性 宽高width/height   在CSS中,可以对任何块级元素设置显式高度。   如果指定高度大于显示内容所需高度,多余的高度会产生一个视觉效果,就好像有额外的内边距一样;   如果指定高度小于显示内容所需高度,取决于overflow属性,需要滚动条需要设置为overflow:auto。 auto   宽高和margin可以设置auto。对于块级元素来说,宽度设置为auto,则会尽可能的宽。详细来说,元素宽度=包含块宽度—元素水平外边距-元素水平边距宽度-元素水平内边距;   高度设置为a
柴小智
2018/04/10
2K0
CSS布局(二) 盒子模型属性
超级实用!,掌握这9个鲜为人知的CSS属性
虽然许多开发人员熟悉常用的CSS属性,但也有一些较为陌生的属性可能被忽视了。在本文中,我们将探讨10个你可能没有使用过的CSS属性。
前端小智@大迁世界
2023/08/16
6560
推荐阅读
相关推荐
面试官:CSS如何实现固定宽高比?
更多 >
LV.0
360前端开发工程师
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档