当前位置: 首页 > news >正文

css使用aspect-ratio制作4:3和9:16和1:1等等比例布局

文章目录

  • 1. 前言
  • 2. 用法
    • 2.1 基本语法
    • 2.2. 与`max-width`、`max-height`等属性结合使用
    • 2.3. 动态计算比例
  • 3. 应用场景
  • 4. 兼容性和替代方案
  • 5. 总结

1. 前言

在网页制作过程中,有时候我们只知道宽度,或者只知道高度,这时候需要制作一个4:3和9:16这种类似的盒子,不使用js而使用纯css如何实现呢:

aspect-ratio 是 CSS 中用于定义元素宽高比的属性。它允许开发者指定一个元素的宽度和高度之间的固定比例关系,无论元素的实际尺寸如何变化,都会保持这个比例。这种特性在响应式设计、图片和视频布局等场景中非常实用,能够帮助开发者更轻松地控制元素的外观和布局,避免因内容尺寸变化导致的布局错乱问题。

2. 用法

下面列举了一些常用的用法:

2.1 基本语法

aspect-ratio属性接受一个由斜杠(/)分隔的两个数字,表示宽度与高度的比例,其语法如下:

element {aspect-ratio: <width> / <height>;
}

其中,widthheight为非负数字,例如:

.box {aspect-ratio: 16 / 9; /* 常见的视频宽高比 */width: 500px;background-color: lightblue;
}

在上述代码中,.box元素的宽度设置为500px,由于aspect-ratio设置为16/9,因此该元素的高度会自动计算为500px * 9 / 16 = 281.25px,从而保持16:9的宽高比。

2.2. 与max-widthmax-height等属性结合使用

aspect-ratio属性可以与max-width、max-height等属性配合,实现更灵活的响应式布局。例如:

.image-container {max-width: 800px;aspect-ratio: 4 / 3;overflow: hidden;
}.image-container img {width: 100%;height: 100%;object-fit: cover;
}

在这个例子中,.image-container的最大宽度为800px,并且保持4:3的宽高比。内部的图片会自动填满容器,并通过object-fit: cover属性确保图片在保持比例的同时,完整显示内容。

2.3. 动态计算比例

aspect-ratio的值也可以通过 CSS 变量(var())动态计算,以适应不同的布局需求:

:root {--ratio-width: 2;--ratio-height: 1;
}.dynamic-box {aspect-ratio: var(--ratio-width) / var(--ratio-height);background-color: lightcoral;
}

通过修改 CSS 变量的值,可以轻松改变元素的宽高比,而无需修改大量的 CSS 代码。

3. 应用场景

下面列举了一些常见的应用场景:

  • 响应式图片和视频布局

在响应式设计中,aspect-ratio属性常用于保持图片和视频的比例,防止其在不同设备上拉伸变形。例如,对于视频播放器:

.video-player {width: 100%;aspect-ratio: 16 / 9;
}

无论设备屏幕宽度如何变化,视频播放器都会始终保持16:9的比例,确保视频的正确显示。

  • 卡片式布局

在卡片式布局中,使用aspect-ratio可以让卡片在不同屏幕尺寸下保持一致的外观。例如:

.card {width: 300px;aspect-ratio: 3 / 4;border: 1px solid #ccc;border-radius: 10px;overflow: hidden;
}

这样,每张卡片都会保持固定的宽高比,即使卡片内容有所不同,整体布局也会显得整齐有序。

  • 图表和图形绘制

在绘制图表、流程图等图形时,aspect-ratio可以帮助开发者精确控制图形的比例,使其在不同屏幕上都能正确显示。例如:

.chart {width: 600px;aspect-ratio: 5 / 3;background-color: #f9f9f9;
}

通过设置合适的宽高比,图表可以更好地展示数据,提升视觉效果。

4. 兼容性和替代方案

虽然aspect-ratio属性功能强大,但在使用时需要注意其浏览器兼容性:

  • Chrome:从版本 89 开始支持aspect-ratio属性,目前主流版本均已完全支持。
  • Firefox:从版本 87 开始支持该属性。
  • Safari:从版本 15.4 开始支持,较旧版本的 Safari 不支持此属性。
  • Edge:从版本 89 开始支持,与 Chrome 保持一致。
环境版本支持情况
Chrome89+支持
Firefox87+支持
Edge89+(新版本基于Chromium)支持
Safari15.4+支持

对于不支持aspect-ratio属性的旧版浏览器,可以使用 JavaScript 来实现类似的效果。或者利用css里“百分比 padding 是相对于父容器宽度计算”的特性来实现:

  • 通过 JavaScript 监听窗口大小变化,动态计算并设置元素的高度:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Aspect Ratio Fallback</title><style>.fallback-box {width: 100%;background-color: lightgreen;}</style>
</head><body><div class="fallback-box" id="fallbackBox"></div><script>const fallbackBox = document.getElementById('fallbackBox');const ratio = 16 / 9;function setBoxHeight() {const width = fallbackBox.offsetWidth;fallbackBox.style.height = (width / ratio) + 'px';}window.addEventListener('load', setBoxHeight);window.addEventListener('resize', setBoxHeight);</script>
</body>
</html>
  • css里“百分比 padding 是相对于父容器宽度计算”的特性

设置 .box 的 height: 0,然后通过 padding-top: 75% 来创建高度。 因为 padding-top
百分比是基于父容器的宽度计算的,所以 75% 表示高度是宽度的 75%,即实现了 4:3 的比例(3 ÷ 4 = 0.75)。
使用position: absolute 可以在里面添加内容或覆盖其他元素。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Aspect Ratio Fallback</title><style>.container {width: 400px; /* 可以根据需要调整宽度 */position: relative;}.box {height: 0;padding-top: 75%; /* 3/4 = 0.75 = 75% */background-color: lightblue;position: relative;}/* 如果你想在盒子里放内容,可以用一个绝对定位的子元素 */.box-content {position: absolute;top: 0;left: 0;width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;}</style>
</head><body><div class="container"><div class="box"></div></div>
</body>
</html>

这2种方式可以在不支持aspect-ratio属性的浏览器中,模拟出类似的宽高比效果。

5. 总结

aspect-ratio属性为 CSS 开发者提供了一种简单而有效的方式来控制元素的宽高比,极大地简化了响应式设计和布局的实现过程。尽管存在一定的浏览器兼容性问题,但随着主流浏览器的不断更新,该属性的应用将会越来越广泛。在实际项目中,合理运用aspect-ratio属性,可以提升页面的视觉效果和用户体验,使布局更加灵活和美观。


本次分享就到这儿啦,我是鹏多多,如果您看了觉得有帮助,欢迎评论,关注,点赞,转发,我们下次见~

往期文章

  • flutter-使用extended_image操作图片的加载和状态处理以及缓存和下载
  • flutter-制作可缩放底部弹出抽屉评论区效果
  • flutter-实现Tabs吸顶的PageView效果
  • Vue2全家桶+Element搭建的PC端在线音乐网站
  • 助你上手Vue3全家桶之Vue3教程
  • 助你上手Vue3全家桶之VueX4教程
  • 助你上手Vue3全家桶之Vue-Router4教程
  • 超详细!Vue的九种通信方式
  • 超详细!Vuex手把手教程
  • 使用nvm管理node.js版本以及更换npm淘宝镜像源
  • vue中利用.env文件存储全局环境变量,以及配置vue启动和打包命令

个人主页

  • CSDN
  • GitHub
  • 简书
  • 博客园
  • 掘金

相关文章:

  • 华为云Astro大屏中桥接器、连接器、转化器以及数据源、数据集、资产管理等概念梳理
  • Leetcode刷题记录30——螺旋矩阵
  • linux-文件操作
  • FreeRTOS菜鸟入门(十一)·信号量·二值、计数、递归以及互斥信号量的区别·优先级翻转以及继承机制详解
  • 基于MATLAB图像中的圆形目标识别和标记
  • MCUboot 中的 BOOT_SWAP_TYPE_PERM 功能介绍
  • 2048游戏(含Python源码)
  • 大模型推理--从零搭建大模型推理服务器:硬件选购、Ubuntu双系统安装与环境配置
  • 定位理论第一法则在医疗AI编程中的应用
  • 【PaaS与AI融合】MLOps平台的架构设计
  • 【MCP Node.js SDK 全栈进阶指南】专家篇(1):MCP-SDK扩展与定制
  • 【实验笔记】Kylin-Desktop-V10-SP1麒麟系统知识 —— 开机自启Ollama
  • 软考 系统架构设计师系列知识点之杂项集萃(54)
  • 《Python星球日记》第31天:Django 框架入门
  • JAVA设计模式——(十一)建造者模式(Builder Pattern)
  • 计算机视觉与深度学习 | 图像匹配算法综述
  • 【AI论文】像素修补师(PixelHacker):具有结构和语义一致性的图像修复(Image Inpainting)
  • Redis数据结构ZipList,QuickList,SkipList
  • linux、window安装部署nacos
  • MinIO实现https访问
  • 老人刷老年卡乘车被要求站着?公交公司致歉:涉事司机停职
  • 溢价率19.48%,民企番禺置业3.07亿元竞得广州番禺融媒体中心北侧地块
  • 马上评|子宫肌瘤惊现男性患者,如此论文何以一路绿灯?
  • 市值增22倍,巴菲特30年重仓股盘点
  • 中国空间站多项太空实验已取得成果,未来将陆续开展千余项研究
  • 鲁迅先生儿媳、周海婴先生夫人马新云女士逝世,享年94岁