CSS 中flex - grow、flex - shrink和flex - basis属性的含义及它们在弹性盒布局中的协同作用。
大白话CSS 中flex - grow、flex - shrink和flex - basis属性的含义及它们在弹性盒布局中的协同作用。
在 CSS 的弹性盒布局(Flexbox)里,flex-grow、flex-shrink 和 flex-basis 这三个属性对弹性元素的尺寸和伸缩性起着关键作用。下面为你详细解释这些属性的含义以及它们之间的协同作用。
各属性含义
flex-basis:此属性用于设定弹性元素的初始大小。可以把它看作是弹性元素在伸缩之前的“基础尺寸”。它能使用像px、em这类的固定单位,也可以用百分比或者auto来表示。若设置为auto,元素的初始大小就会依据其内容来确定。flex-grow:这个属性用来规定弹性元素在有多余空间时的扩展比例。它是一个无单位的数值,默认值为0,这意味着元素不会主动扩展以填满多余空间。若设置为大于0的值,元素就会按比例扩展。例如,有两个元素,一个flex-grow为1,另一个为2,那么后者扩展的空间会是前者的两倍。flex-shrink:该属性用于规定弹性元素在空间不足时的收缩比例。同样是无单位的数值,默认值为1,表示元素会按照比例收缩。若设置为0,元素就不会收缩。
代码示例及解释
以下是一个包含详细注释的代码示例,展示了这三个属性的协同作用:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><style>/* 设置弹性容器 */.flex-container {display: flex; /* 将元素设置为弹性容器 */width: 600px; /* 容器宽度为 600px */border: 1px solid black; /* 为容器添加黑色边框 */}/* 第一个弹性元素 */.flex-item1 {flex-basis: 100px; /* 初始大小为 100px */flex-grow: 1; /* 扩展比例为 1 */flex-shrink: 1; /* 收缩比例为 1 */background-color: lightblue; /* 背景颜色为浅蓝色 */}/* 第二个弹性元素 */.flex-item2 {flex-basis: 200px; /* 初始大小为 200px */flex-grow: 2; /* 扩展比例为 2 */flex-shrink: 2; /* 收缩比例为 2 */background-color: lightgreen; /* 背景颜色为浅绿色 */}/* 第三个弹性元素 */.flex-item3 {flex-basis: 300px; /* 初始大小为 300px */flex-grow: 0; /* 不扩展 */flex-shrink: 0; /* 不收缩 */background-color: lightcoral; /* 背景颜色为浅珊瑚色 */}</style>
</head><body><!-- 创建弹性容器 --><div class="flex-container"><!-- 第一个弹性元素 --><div class="flex-item1">Item 1</div><!-- 第二个弹性元素 --><div class="flex-item2">Item 2</div><!-- 第三个弹性元素 --><div class="flex-item3">Item 3</div></div>
</body></html>
代码解释
- HTML 部分:构建了一个弹性容器
div,其类名为flex-container,里面包含三个弹性元素div,类名分别为flex-item1、flex-item2和flex-item3。 - CSS 部分:
.flex-container:把display属性设为flex,将该元素变为弹性容器,宽度设为600px并添加黑色边框。.flex-item1:初始大小是100px,扩展比例为1,收缩比例为1,背景颜色为浅蓝色。.flex-item2:初始大小是200px,扩展比例为2,收缩比例为2,背景颜色为浅绿色。.flex-item3:初始大小是300px,扩展比例为0,即不扩展,收缩比例为0,即不收缩,背景颜色为浅珊瑚色。
协同作用
- 空间充足时:若容器宽度大于所有弹性元素的
flex-basis之和,多余空间会按照flex-grow的比例分配给各元素。例如,上述示例中,若容器宽度大于600px,多余空间会按1:2:0的比例分配给三个元素。 - 空间不足时:若容器宽度小于所有弹性元素的
flex-basis之和,元素会按照flex-shrink的比例收缩。不过,flex-item3的flex-shrink为0,所以它不会收缩。
通过合理运用 flex-grow、flex-shrink 和 flex-basis 这三个属性,你就能精准控制弹性元素在不同空间条件下的尺寸和伸缩性。
flex-grow、flex-shrink和flex-basis属性在不同的浏览器中的兼容性如何?
flex-grow、flex-shrink 和 flex-basis 这些属性都属于 CSS Flexbox 布局模块的一部分。当前,它们在主流浏览器中拥有良好的兼容性,但在旧版本浏览器里可能存在一些问题。下面是这些属性在不同浏览器中的兼容性情况:
桌面浏览器
- Chrome:从 Chrome 21 版本起就开始支持这些属性,当前最新版本对其支持良好。
- Firefox:从 Firefox 22 版本起支持,当前版本支持完善。
- Safari:从 Safari 6.1 版本起支持,但在旧版本中需要添加
-webkit-前缀。比如,flex-grow要写成-webkit-flex-grow。 - Opera:从 Opera 12.1 版本起支持,现在支持情况良好。
- Edge:从 Edge 12 版本起支持,当前版本兼容性没问题。
- Internet Explorer:IE 10 部分支持,使用时需要添加
-ms-前缀,且实现方式与标准有所不同;IE 11 对其支持较好,但在某些复杂布局下可能会有问题。
移动浏览器
- Chrome for Android:支持情况良好,从早期版本就开始支持。
- Firefox for Android:支持完善,兼容性佳。
- Safari on iOS:从 iOS 7 起支持,旧版本需
-webkit-前缀。 - Samsung Internet:支持良好,无明显兼容性问题。
兼容性处理建议
- 使用前缀:为了确保在旧版浏览器中的兼容性,可以添加浏览器前缀。示例如下:
.flex-item {-webkit-flex-grow: 1; /* Safari 6.1+ */-ms-flex-grow: 1; /* IE 10 */flex-grow: 1;-webkit-flex-shrink: 1; /* Safari 6.1+ */-ms-flex-shrink: 1; /* IE 10 */flex-shrink: 1;-webkit-flex-basis: 200px; /* Safari 6.1+ */-ms-flex-basis: 200px; /* IE 10 */flex-basis: 200px;
}
- 使用 Autoprefixer:这是一个自动添加浏览器前缀的工具,可集成到构建工具(如 Webpack、Gulp 等)中,这样在编写 CSS 时就无需手动添加前缀。
- 渐进增强:先为现代浏览器构建完整的 Flexbox 布局,再为旧版浏览器提供基本的布局方案,以此保证所有用户都能获得可用的体验。
总的来说,在开发中使用 flex-grow、flex-shrink 和 flex-basis 时,只要处理好旧版浏览器的兼容性问题,就能在大多数浏览器中实现一致的布局效果。
如何检测浏览器对这些属性的支持情况?
在前端开发中,检测浏览器对 flex-grow、flex-shrink 和 flex-basis 属性的支持情况,可通过以下几种方法实现:
1. 使用 Modernizr 库
Modernizr 是一个用于检测浏览器特性支持情况的 JavaScript 库。它会自动检测浏览器是否支持各种 HTML5 和 CSS3 特性,其中就包含 Flexbox 相关属性。
步骤:
- 引入 Modernizr 库:你可以从 Modernizr 官网 下载该库,或者使用 CDN 引入。
<script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"></script>
- 检测 Flexbox 支持情况:在页面加载完成后,Modernizr 会在
<html>标签上添加相应的类名,以此表明浏览器对某个特性的支持情况。若支持 Flexbox,<html>标签会添加flexbox类;若不支持,则添加no-flexbox类。
<!DOCTYPE html>
<html>
<head><script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"></script><style>/* 若支持 Flexbox,应用这些样式 */.flexbox .flex-container {display: flex;}/* 若不支持 Flexbox,应用这些样式 */.no-flexbox .flex-container {/* 提供替代布局方案 */}</style>
</head>
<body><div class="flex-container"><!-- 弹性元素 --></div>
</body>
</html>
2. 使用 JavaScript 进行特性检测
你可以通过创建一个临时的 DOM 元素,为其设置相关的 CSS 属性,然后检查这些属性是否被正确应用,以此来检测浏览器对某个属性的支持情况。
function isPropertySupported(property) {const element = document.createElement('div');if (property in element.style) {return true;}const propertyName = property.charAt(0).toUpperCase() + property.slice(1);const vendorPrefixes = ['Webkit', 'Moz', 'ms', 'O'];for (let i = 0; i < vendorPrefixes.length; i++) {if ((vendorPrefixes[i] + propertyName) in element.style) {return true;}}return false;
}// 检测 flex-grow 支持情况
const isFlexGrowSupported = isPropertySupported('flexGrow');
// 检测 flex-shrink 支持情况
const isFlexShrinkSupported = isPropertySupported('flexShrink');
// 检测 flex-basis 支持情况
const isFlexBasisSupported = isPropertySupported('flexBasis');console.log('flex-grow supported:', isFlexGrowSupported);
console.log('flex-shrink supported:', isFlexShrinkSupported);
console.log('flex-basis supported:', isFlexBasisSupported);
3. 使用 CSS @supports 规则
@supports 是 CSS 中的一个特性查询规则,用于检测浏览器是否支持某个 CSS 属性或值。
@supports (flex-grow: 1) {/* 若支持 flex-grow,应用这些样式 */.flex-container {display: flex;}
}@supports not (flex-grow: 1) {/* 若不支持 flex-grow,应用这些样式 */.flex-container {/* 提供替代布局方案 */}
}
你可以依据项目的实际需求和兼容性要求,选择合适的检测方法。若项目需要兼容多种特性,使用 Modernizr 库会比较方便;若仅需检测少数几个属性,使用 JavaScript 或 CSS @supports 规则会更合适。
相关文章:
CSS 中flex - grow、flex - shrink和flex - basis属性的含义及它们在弹性盒布局中的协同作用。
大白话CSS 中flex - grow、flex - shrink和flex - basis属性的含义及它们在弹性盒布局中的协同作用。 在 CSS 的弹性盒布局(Flexbox)里,flex-grow、flex-shrink 和 flex-basis 这三个属性对弹性元素的尺寸和伸缩性起着关键作用。下面为你详细…...
基于CVX优化器的储能电池调峰调频算法matlab仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 原理概述 4.2 CVX工具箱概述 5.完整工程文件 1.课题概述 基于CVX优化器的储能电池调峰调频算法matlab仿真。CVX 是一种用于求解凸优化问题的强大工具。凸优化问题具有良好的数学性质,能…...
SpringBoot3+Vue3开发学生成绩管理系统
系统介绍 此系统功能包含:首页、课程管理、成绩查询、成绩详情、班级管理、专业管理、用户管理等功能。用户管理又细分为账号管理、学生管理、教师管理、管理员管理。 基础功能包含:登录、退出、修改登录人信息、修改登录人密码。 分为4种角色&#x…...
正则魔法:解码 return /^\d+$/.test(text) ? text : ‘0‘ 的秘密
🚀 正则魔法:解码 return /^\d$/.test(text) ? text : 0 的秘密 🌟 嘿,技术探险家们!👋 今天我们要破解一段看似简单的代码:return /^\d$/.test(text) ? text : 0。它藏在一个 Vue 前端组件中…...
基于BClinux8部署Ceph 19.2(squid)集群
#作者:闫乾苓 文章目录 1.版本选择Ceph版本发布历史目前官方在维护的版本 2.部署方法3.服务器规划4.前置配置4.1系统更新4.2配置hosts cat >> /etc/hosts << EOFssh-keygenssh-copy-id ceph01ssh-copy-id ceph02ssh-copy-id ceph034.5 Python34.6 Syst…...
CVPR2025 | 对抗样本智能安全方向论文汇总 | 持续更新中~
汇总结果来源:CVPR 2025 Accepted Papers 若文中出现的 论文链接 和 GitHub链接 点不开,则说明还未公布,在公布后笔者会及时添加. 若笔者未及时添加,欢迎读者告知. 文章根据题目关键词搜索,可能会有遗漏. 若笔者出现…...
[leetcode]1631. 最小体力消耗路径(bool类型dfs+二分答案/记忆化剪枝/并查集Kruskal思想)
题目链接 题意 给定 n m n\times m nm地图 要从(1,1) 走到 (n,m) 定义高度绝对差为四联通意义下相邻的两个点高度的绝对值之差 定义路径的体力值为整条路径上 所有高度绝对差的max 求所有路径中 最小的路径体力值是多少 方法1 这是我一开始自己写的记忆化剪枝 比较暴力 时…...
Linux-Ubuntu 系统学习笔记 | 从入门到实战
📘 Linux-Ubuntu 系统学习笔记 | 从入门到实战 📜 目录 环境安装基本操作Linux操作系统介绍文件系统常用命令用户权限管理编辑器vimGCC编译器动态库与静态库Makefile 1. 环境安装 🌟 下载镜像 推荐使用清华大学开源镜像站下载Ubuntu镜像&a…...
Java学习笔记-XXH3哈希算法
XXH3是由Yann Collet设计的非加密哈希算法,属于XXHash系列的最新变种,专注于极速性能与低碰撞率,适用于对计算效率要求极高的场景。 极速性能 在RAM速度限制下运行,小数据(如 1-128 字节)处理可达纳秒级&…...
【容器运维】docker搭建私有仓库
一、基础方案:使用 Docker Registry 快速搭建 1. 拉取并启动 Registry 镜像 # 拉取官方镜像 docker pull registry:2# 运行容器(数据持久化到宿主机目录) docker run -d -p 5000:5000 \--name my-registry \-v /opt/data/registry:/var/lib…...
深入理解 Spring 框架中的 AOP 技术
一、引言 在 Java 开发领域,Spring 框架凭借其强大的功能和丰富的特性,成为了众多开发者构建企业级应用的首选。其中,面向切面编程(AOP)作为 Spring 框架的核心技术之一,为开发者提供了一种全新的程序结构…...
磁盘清理工具-TreeSize Free介绍
TreeSizeFree是一个磁盘空间管理工具,主要用于分析磁盘使用情况,帮助用户找到占用空间大的文件和文件夹: 特点:按大小排序:快速找到占用空间最大的文件或文件夹 一般可以删除: 扫描 C:\Users\XXX\AppData\Local\Temp 或 C:\Window…...
redis MISCONF Redis is configured to save RDB snapshots报错解决
直接上解决方案 修改redis配置文件 stop-writes-on-bgsave-error no 重启redis...
c#知识点补充2
1.非静态类能否调用静态方法可以 2.对string类型扩展方法,如何进行 类用静态类,参数是this 调用如下 3.out的用法 一定要给a赋值 这种写法不行 这样才行 4.匿名类 5.委托的使用 无论是匿名委托,还是具命委托,委托实例化后一定要…...
循环神经网络(Recurrent Neural Network, RNN)与 Transformer
循环神经网络(RNN)与 Transformer 1. 循环神经网络(RNN)简介 1.1 RNN 结构 循环神经网络(Recurrent Neural Network, RNN)是一种适用于处理序列数据的神经网络。其核心特点是通过隐藏状态(Hi…...
力扣45.跳跃游戏
45. 跳跃游戏 II - 力扣(LeetCode) 代码区: #include<vector> class Solution {public:int jump(vector<int>& nums) {int ans[10005] ;memset(ans,1e4,sizeof(ans));ans[0]0;for(int i0;i<nums.size();i){for(int j1;j…...
招聘面试季--方法论--如何从零到-规划一个新的app产品
规划一个新APP产品的系统化步骤及关键要点: 一、需求验证阶段 明确目标用户与核心需求 通过用户调研(问卷、访谈)定义目标人群的痛点和场景,例如购物类APP需优先满足浏览、支付等核心需求。判断APP的必要性:若功…...
MacOS安装 nextcloud 的 Virtual File System
需求 在Mac上安装next cloud实现类似 OneDrive 那样,文件直接保存在服务器,需要再下载到本地。 方法 在 官网下载Download for desktop,注意要下对版本,千万别下 Mac OS默认的那个。 安装了登录在配置过程中千万不要设置任何同…...
OpenCV Imgproc 模块使用指南(Python 版)
一、模块概述 imgproc 模块是 OpenCV 的图像处理核心,提供从基础滤波到高级特征提取的全流程功能。核心功能包括: 图像滤波:降噪、平滑、锐化几何变换:缩放、旋转、透视校正颜色空间转换:BGR↔灰度 / HSV/Lab 等阈值…...
C/C++蓝桥杯算法真题打卡(Day6)
一、P8615 [蓝桥杯 2014 国 C] 拼接平方数 - 洛谷 方法一:算法代码(字符串分割法) #include<bits/stdc.h> // 包含标准库中的所有头文件,方便编程 using namespace std; // 使用标准命名空间,避免每次调用…...
ORACLE RAC ASM双存储架构下存储部分LUN异常的处理
早上接到用户电话,出现有表空间不足的告警,事实上此环境经常巡检并且有告警系统,一开始就带着有所疑惑的心理,结果同事在扩大表空间时,遇到报错 ORA-15401/ORA-17505,提示ASM空间满了: ALERT日志࿱…...
【设计模式】SOLID 设计原则概述
SOLID 是面向对象设计中的五大原则,不管什么面向对象的语言, 这个准则都很重要,如果你没听说过,赶紧先学一下。它可以提高代码的可维护性、可扩展性和可读性,使代码更加健壮、易于测试和扩展。SOLID 代表以下五个设计原…...
从边缘到核心:群联云防护如何重新定义安全加速边界?
一、安全能力的全方位碾压 1. 协议层深度防护 四层防御: 动态过滤畸形TCP/UDP包(如SYN Flood),传统CDN仅限速率控制。技术示例:基于AI的协议指纹分析,拦截异常连接模式。 七层防御: 精准识别业…...
others-rustdesk远程
title: others-rustdesk远程 categories: Others tags: [others, 远程] date: 2025-03-19 10:19:34 comments: false mathjax: true toc: true others-rustdesk远程, 替代 todesk 的解决方案 前篇 官方 服务器 - https://rustdesk.com/docs/zh-cn/self-host/rustdesk-server-o…...
记录 macOS 上使用 Homebrew 安装的软件
Homebrew 是 macOS 上最受欢迎的软件包管理器之一,能够轻松安装各种命令行工具和 GUI 应用。本文记录了我通过 Homebrew 安装的各种软件,并对它们的用途和基本使用方法进行介绍。 🍺 Homebrew 介绍 Homebrew 是一个开源的包管理器ÿ…...
springmvc中使用interceptor拦截
HandlerInterceptor 是Spring MVC中用于在请求处理之前、之后以及完成之后执行逻辑的接口。它与Servlet的Filter类似,但更加灵活,因为它可以访问Spring的上下文和模型数据。HandlerInterceptor 常用于日志记录、权限验证、性能监控等场景。 ### **1. 创…...
C++基础 [八] - list的使用与模拟实现
目录 list的介绍 List的迭代器失效问题 List中sort的效率测试 list 容器的模拟实现思想 模块分析 作用分析 list_node类设计 list 的迭代器类设计 迭代器类--存在的意义 迭代器类--模拟实现 模板参数 和 成员变量 构造函数 * 运算符的重载 运算符的重载 -- 运…...
使用excel.EasyExcel实现导出有自定义样式模板的excel数据文件,粘贴即用!!!
客户要求导出的excel文件是有好看格式的,当然本文举例模板文件比较简单,内容丰富的模板可以自行设置,话不多说,第一步设置一个"好看"的excel文件模板 上面要注意的地方是{.变量名} ,这里的变量名对应的就是…...
Spring Boot 集成 Elasticsearch怎样在不启动es的情况下正常启动服务
解释 在spingboot 集成es客户端后,每当服务启动时,服务默认都会查看es中是否已经创建了对应的索引,如果没有索引则创建。基于上面的规则我们可以通过配置不自动创建索引来达到在没有es服务的情况下正常启动服务。 解决办法 在entity类的Docu…...
Java面试黄金宝典8
1. 什么是 Spring MVC 定义 Spring MVC 是 Spring 框架里用于构建 Web 应用程序的模块,它严格遵循 MVC(Model - View - Controller)设计模式。这种设计模式把应用程序清晰地划分成三个主要部分: Model(模型࿰…...
