元素「宽高比」完美适配的方案

在日常生活中,我们常常会看到视频或照片能够随着页面尺寸变化,按照自身宽高比进行缩放调整。这种效果是如何实现的呢? 

可以通过 CSSJavaScript 两种方式完成,其中 CSS 是比较推荐的方式,因为它能充分利用现代浏览器的响应式布局能力,而无需监听和处理大量的页面事件。

方法 1:使用 CSS aspect-ratio 属性

原理:aspect-ratio 是 CSS 提供的一个属性,用于设置宽高比。通过定义一个比例,浏览器会根据宽度自动计算高度,或者根据高度自动计算宽度,从而保持元素的比例。

宽高比公式:height = width / aspect-ratio。

实现方式:在需要响应式的元素上设置 aspect-ratio 属性,给定宽度(或者高度),浏览器会自动计算另一个值。

代码为:

<div class="container">
  <div class="content"></div>
</div>
.container {
  width: 100%; /* 占据父容器的宽度 */
  height: 100%; /* 占据父容器的高度 */
  display: flex;
  justify-content: center;
  align-items: center;
}
.content {
  width: 50%; /* 初始宽度为容器宽度的 50% */
  aspect-ratio: 16 / 9; /* 保持 16:9 的宽高比 */
  background-color: pink;
}

展示如下,不管页面比例多少,类为 content 的 div 元素比例始终是:16/9。

说明:内容在 container 中居中,且会随着页面尺寸变化自动缩放。aspect-radio:定义宽高比,浏览器会根据宽度自动计算高度。

 📢:存在兼容性问题。

优点:无需额外代码,浏览器自动处理。限制:不支持 IE 浏览器,需现代浏览器。

方法 2:使用 padding 技术模拟宽高比

原理:CSS 的 padding 值是根据父容器(包含块)的宽度计算的。利用 padding-top 或 padding-bottom 模拟高度,可以保持宽高比。

公式为:height = width × padding-top(百分比)

举个 🌰:16:9 比例的 padding-top 是 9÷16×100%=56.25%。

具体代码:

<div class="responsive-box"></div>
.responsive-box {
  position: relative;
  width: 100%; /* 占满宽度 */
  padding-top: 56.25%; /* 高度按照宽度的 16:9 比例计算 */
  background-color: lightpink;
}

实现 div 比例始终为 16: 9,跟随页面变化而变化。 

但是会出现一个问题:因为高度使用 padding-top 撑开的,导致内部如果有内容,将会在底部展示。

<div class="responsive-box">
  <div class="content">子元素内容,在外层 div 的底部展示。</div>
</div>

如何解决呢?内部再嵌套一个 div,将其设置为绝对定位。 

<div class="responsive-box">
  <div class="content">
    <div class="display">子元素内容,在 div 的内部展示。</div>
  </div>
</div>
.responsive-box {
  position: relative; /* 父容器相对定位 */
  width: 100%; /* 占满宽度 */
  padding-top: 56.25%; /* 高度按照宽度的 16:9 比例计算 */
}

.content {
  position: absolute; /* 子元素绝对定位 */
  top: 0;
  left: 0;
  width: 100%; /* 填满父容器宽度 */
  height: 100%; /* 填满父容器高度 */
  background-color: rgb(255, 212, 212);
}
.display {
  border-radius: 4px;
  border: 2px solid rgb(255, 172, 255);
}

即可实现,内容从上到下依次排序展示。

说明:position: absolute,让内容占据整个容器的宽高。

优点:兼容性极强,支持几乎所有浏览器。限制:需要额外的 position 样式,增加了复杂度。

方法 3:使用 CSS + JavaScript 动态缩放

原理:通过 JavaScript 获取容器的宽度(offsetWidth),按照指定的宽高比计算高度,然后动态设置高度(style.height)。当窗口尺寸发生变化时(监听 resize),重新计算高度以保持比例。

代码为:

<div id="responsive-box" style="background-color: lightgreen;"></div>
#responsive-box {
  width: 50%; /* 初始宽度为页面宽度的 50% */
  height: auto; /* 由 JS 控制高度 */
  margin: 0 auto; /* 居中显示 */
}
function resizeBox() {
  const box = document.getElementById('responsive-box');
  const width = box.offsetWidth; // 获取当前宽度
  const aspectRatio = 16 / 9; // 宽高比
  box.style.height = `${width / aspectRatio}px`; // 设置高度
}

// 初始调整
resizeBox();

// 监听窗口大小变化
window.addEventListener('resize', resizeBox);

展示为:

优点:控制灵活,可以结合其他逻辑动态调整宽高。限制:需要监听 resize 事件,对性能有一定影响。

对比和适用场景

方法原理优点缺点

CSS

aspect-ratio

自动根据宽度或高度调整另一个值简洁高效,适合现代浏览器不支持 IE,兼容性较低
padding 利用 padding-toppadding-bottom 模拟高度兼容性强,支持老旧浏览器子元素必须用绝对定位

JavaScript 动态缩放

根据宽度动态计算高度控制灵活,适用复杂场景性能影响较大,增加了监听事件和维护成本

1、现在项目,首选 aspect-ratio,简单易用, 适合开发简单的响应式布局。

2、兼容旧浏览器:选择 padding,这种方法几乎支持所有浏览器。

3、特殊要求:如果需要动态调整比例或加入额外的逻辑,JavaScript 是唯一的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/928521.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android笔记【12】脚手架Scaffold和导航Navigation

一、前言 学习课程时&#xff0c;对于自己不懂的点的记录。 对于cy老师第二节课总结。 二、内容 1、PPT介绍scaffold 2、开始代码实操 先新建一个screen包&#xff0c;写一个Homescreen函数&#xff0c;包括四个页面。 再新建一个compenent包&#xff0c;写一个displayText…

[极客大挑战 2019]HardSQL--详细解析

信息搜集 登录系统&#xff0c;有两个可能的注入点&#xff1a; 随便输一下看看传参类型&#xff1a; 都是GET型。 SQL注入 传参 usernameadmin’&password123 传参 usernameadmin&password123’ username和password传参&#xff0c;四种闭合方式只有单引号报错&a…

Ansible自动化一键部署单节点集群架构

自动化部署利器&#xff1a;Ansible 一键部署脚本 在现代IT基础设施管理中&#xff0c;Ansible以其简洁、强大的自动化能力脱颖而出。以下是精心打造的Ansible自动化一键部署脚本&#xff0c;旨在简化部署流程&#xff0c;提升效率&#xff0c;确保一致性和可靠性。 通过这个…

基于云模型的车辆行驶速度估计算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于云模型的车辆行驶速度估计算法matlab仿真。在智能交通系统中&#xff0c;车辆行驶速度的准确估计对于交通流量监测、安全预警、自动驾驶辅助等方面具有极为重…

C++知识整理day3类与对象(下)——赋值运算符重载、取地址重载、列表初始化、友元、匿名对象、static

文章目录 1.赋值运算符重载1.1 运算符重载1.2 赋值运算符重载 2.取地址重载2.1 const成员函数2.2 取地址运算符重载 3.类与对象的补充3.1 再探构造函数---初始化列表3.2 类型转换3.3 static成员3.4 友元3.5 内部类3.6 匿名对象3.7 对象拷贝时的编译器优化 1.赋值运算符重载 赋…

自然语言处理:基于BERT预训练模型的中文命名实体识别(使用PyTorch)

命名实体识别&#xff08;NER&#xff09; 命名实体识别&#xff08;Named Entity Recognition, NER&#xff09;是自然语言处理&#xff08;NLP&#xff09;中的一个关键任务&#xff0c;其目标是从文本中识别出具有特定意义的实体&#xff0c;并将其分类到预定义的类别中。这…

面试题-RocketMQ的基本架构、支持的消息模式、如何保证消息的可靠传输

相关问题 1、RocketMQ的基本架构是怎样的&#xff1f;请简述各组件的作用。 2、RocketMQ支持哪几种消息模式&#xff08;如点对点、发布/订阅&#xff09;&#xff1f;请简要说明它们的区别。 3、如何使用Java客户端实现一个简单的消息生产者和消费者&#xff1f; 4、RocketMQ…

【力扣】3274. 检查棋盘方格颜色是否相同

一、题目 给你两个字符串 coordinate1 和 coordinate2&#xff0c;代表 8 x 8 国际象棋棋盘上的两个方格的坐标。以下是棋盘格的参考图&#xff1a; 如果这两个方格颜色相同&#xff0c;返回 true&#xff0c;否则返回 false。坐标总是表示有效的棋盘方格。坐标的格式总是先字…

mysql 5.7安装及安装后无法启动问题处理

下载安装包&#xff0c;直接解压 配置环境变量 创建my.ini文件 [mysqld] #端口号 port 3306 #mysql-5.7.27-winx64的路径 basedirD:/soft/mysql57 #mysql-5.7.27-winx64的路径\data datadirD:/soft/mysql57/data #最大连接数 max_connections200 #编码 character-set-server…

2023年第十四届蓝桥杯Scratch国赛真题—推箱子

推箱子 程序演示及其源码解析&#xff0c;可前往&#xff1a; https://www.hixinao.com/scratch/creation/show-188.html 若需在线编程&#xff0c;在线测评模考&#xff0c;助力赛事可自行前往题库中心&#xff0c;按需查找&#xff1a; https://www.hixinao.com/ 题库涵盖…

级联树结构TreeSelect和上级反查

接口返回结构 前端展示格式 前端组件 <template><div ><el-scrollbar height"70vh"><el-tree :data"deptOptions" :props"{ label: label, children: children }" :expand-on-click-node"false":filter-node-me…

28.100ASK_T113-PRO Linux+QT 显示一张照片

1.添加资源文件 2. 主要代码 #include "mainwindow.h" #include "ui_mainwindow.h" #include <QImage> #include <QPixmap>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui->setupUi(this);QIm…

基于PySpark 使用线性回归、随机森林以及模型融合实现天气预测

基于PySpark 实现天气预测与模型集成 在大数据分析与机器学习领域&#xff0c;Spark 提供了强大的计算能力和灵活的扩展性。本文将介绍如何利用 PySpark 完成以下任务&#xff1a; 1、数据预处理&#xff1a;清洗和编码天气数据。 2、特征工程&#xff1a;合并数值和分类特征…

【MySQL — 数据库基础】深入理解数据库服务与数据库关系、MySQL连接创建、客户端工具及架构解析

目录 1. 数据库服务&#xff06;数据库&#xff06;表之间的关系 1.1 复习 my.ini 1.2 MYSQL服务基于mysqld启动而启动 1.3 数据库服务的具体含义 1.4 数据库服务&数据库&表之间的关系 2. 客户端工具 2.1 客户端连接MySQL服务器 2.2 客…

各种类型无人机性能及优缺点技术详解

无人机系统种类繁多、用途广泛&#xff0c;且特点鲜明&#xff0c;致使其在尺寸、质量、航程、航时、飞行高度、飞行速度以及任务载荷等多方面都有较大差异。以下是对几种常见类型无人机的性能、优缺点技术的详细解析&#xff1a; 一、固定翼无人机 1.性能&#xff1a; 固定翼…

yolo辅助我们健身锻炼

使用软件辅助健身能够大大提升运动效果并帮助你更轻松地达成健身目标。确保每次锻炼都更加高效且针对性强,精确记录你的训练进度,帮助你更清晰地看到自己的进步,避免无效训练。 借助YOLO11的尖端计算机视觉技术,跟踪和分析锻炼变得异常简单。它可以无缝检测和监控多种锻炼…

Linux修改系统及终端命令行中的用户名

0、前言 最近捣鼓了一下一个很久之前的用过的ubuntu系统&#xff0c;但是之前随意设置了一个用户名&#xff0c;突发奇想地去修改了一下这个ubuntu系统的系统用户名&#xff0c;发现修改起来还是有些麻烦&#xff0c;并没有那种一键修改的选项&#xff0c;所以在这篇博客下面记…

基于智能语音交互的智能呼叫中心工作机制

在智能化和信息化不断进步的现代&#xff0c;智能呼叫中心为客户提供高质量、高效率的服务体验&#xff0c;提升众多品牌用户的满意度和忠诚度。作为实现智能呼叫中心的关键技术之一的智能语音交互技术&#xff0c;它通过集成自然语言处理&#xff08;NLP&#xff09;、语音识别…

Linux条件变量线程池详解

一、条件变量 【互斥量】解决了线程间同步的问题&#xff0c;避免了多线程对同一块临界资源访问产生的冲突&#xff0c;但同一时刻对临界资源的访问&#xff0c;不论是生产者还是消费者&#xff0c;都需要竞争互斥锁&#xff0c;由此也带来了竞争的问题。即生产者和消费者、消费…

「Mac畅玩鸿蒙与硬件38」UI互动应用篇15 - 猜数字增强版

本篇将带你实现一个升级版的数字猜谜游戏。相比基础版&#xff0c;新增了计分和历史记录功能&#xff0c;用户可以在每次猜测后查看自己的得分和猜测历史。此功能展示了状态管理的进阶用法以及如何保存和显示历史数据。 关键词 UI互动应用数字猜谜状态管理历史记录用户交互 一…