CSS 写个清除浮动,怎么还蹦出个 hasLayout? *zoom?

news2024/12/26 20:40:46

在这里插入图片描述


🧑‍💼 个人简介:一个不甘平庸的平凡人🍬
🖥️ Node专栏:Node.js从入门到精通
🖥️ TS知识总结:十万字TS知识点总结
👉 你的一键三连是我更新的最大动力❤️!
📢 欢迎私信博主加入前端交流群🌹


📑 目录

    • 清除浮动
    • zoom 是什么?
    • 为什么使用 zoom ?
    • 什么是 hasLayout ?
    • 如何触发 hasLayout ?
    • 为何 zoom 前加 * 前缀 ?


清除浮动

前端开发中,清除浮动是一种很常见的操作,最常用的一种方案如下:

.clearfix {
  *zoom: 1;

  &::after {
    clear: both;
    content: '.';
    display: block;
    font-size: 0;
    height: 0;
    visibility: hidden;
  }
}

clearfix 类中添加 after 伪元素,并在伪元素中使用 clear: both 是很常见的一种清除浮动的方法,但上面的代码中还有一些额外的操作需要注意:

  • 为什么 content 不直接设置为空字符串?

    首先,在伪元素中,如果没有 content 属性,或者 content 属性值为 none 或者 normal 时,伪元素是不会产生的。
    然而在一些老版本的浏览器中,content 值为空字符时也不会产生伪元素,所以为了兼容性,这里是随便设置一个 content 值,然后后面使用font-size: 0;height: 0;visibility: hidden;来消除这个 content 的影响。

  • 为什么 clearfix 类中还要使用 *zoom: 1;

    这是本篇文章的重点,往下看!

zoom 是什么?

zoom 属性最初只是 IE 浏览器上的私有属性,但之后也被一些浏览器所支持,支持情况如下:

CSS zoom

zoom 属性主要是用于控制元素的缩放比例,与 transform: scale() 类似,但它会影响元素的布局大小(同样会影响周围元素的布局,会触发回流),效果如下:

CSS zoom与transform: scale()的区别

网上都说这个属性没什么意义,但我个人认为它还是有一定的使用场景的,如果您正在使用 typora 写 markdown,您可以试试插入图片后调整图片大小,然后再查看源码,您会发现 typora 就是使用 zoom 属性来缩放您的图片的

为什么使用 zoom ?

多加一个 zoom 属性,无非就是两点原因:

  1. 一些老版本 IE 浏览器对伪元素或者一些属性的支持情况不太友好,导致无法使用伪元素来实现清除伪类。
  2. zoom 属性可以在老版本 IE 中起到清除浮动的作用。

为何 zoom 可以在老版本 IE 中起到清除浮动的作用?这就要说起 IE 中对元素布局具有深远影响的 hasLayout 属性!

什么是 hasLayout ?

绝大部分情况下,我们不需要了解 hasLayout 的任何信息,但本着提升自己、扩展知识、提升职业素养的想法,多了解自己领域内的知识,百利而无一害!

其实在 IE 中,hasLayout 并不是一个可以被开发者直接控制的 CSS 属性,它是 IE 渲染引擎的内部属性,主要用来表示元素以何种方式进行渲染

在 IE 中,元素主要有两种渲染方式:

  1. 元素负责调整自身以及后代元素的内容的大小和排列,此时元素对应的 hasLayout 属性为 true(这时可以简单称该元素具有“独立布局”)
  2. 元素依赖父元素来调整其内容的大小和排列,此时元素对应的 hasLayout 属性为 false

只有一部分元素,如:bodyhtml(标准模式,非怪异模式)、tableimgbuttoninputiframe等的 hasLayout 属性默认为 true

之所以不让所有元素默认都具有“独立布局”的主要原因是“性能和简单性”,如果所有元素都有独立布局,则会对性能和内存使用产生不利影响。

对于 hasLayout 属性为 false 的不具有“独立布局”的元素,因为受限与父元素,在使用时可能会发生一些 BUG。事实上 IE 中很多 CSS 的 BUG 确实是由于这种机制所导致,所以大部分 BUG 也都能通过触发 hasLayout 来解决。

如何触发 hasLayout ?

当一个元素设置了 width 或者 height (除 auto 之外的值)时,该元素的 hasLayout 就会变成 true,如果不想指定元素宽高,也可以使用以下方式来触发:

  • 设置元素为行块盒(inline-block
  • 设置浮动
  • 设置绝对定位
  • writing-mode: tb-rl (tb-rl值目前来说虽已弃用,但这里针对的老版本浏览器还都是支持的)
  • 设置zoom

IE7 中,min-heightmax-heightmin-widthmax-widthoverflow、固定定位等也都可以触发 hasLayout

以上属性,最常用的就是使用 zoom:1,因为它几乎不会产生什么副作用,这也是我们使用 zoom 的原因之一。

为何是之一?

因为还有一个原因:早期时它不是有效的 CSS 属性(非标准,且是 IE 私有的),因此其他浏览器会忽略它。但之后这个属性也被 Chrome 、Safari 等其它一些浏览器给支持了,现在如果我们不想让除 IE 之外的浏览器识别 zoom,可以在其前面添加*前缀(原因后面说)

其实看到这,您应该可以想到 IE 中的 hasLayout 与我们当下流行的块级格式化上下文(BFC)有些许相像,它们都是创建一个独立环境来完成布局,从而避免影响外界或者被外界影响,所以说在 IE 中触发 hasLayout 就能清除浮动也就很好理解了。

为何 zoom 前加 * 前缀 ?

上面已经提到了,如果我们不想让除 IE 之外的浏览器识别 zoom,可以在其前面添加*前缀,这是因为只有 IE7 及以下版本的浏览器才支持具有非字母数字下划线前缀的属性!现代浏览器是无法识别带这种前缀的属性的,并且在 CSS 中直接使用这种前缀时 VS Code 会直接爆红(在 less 中写这种前缀则不会爆红):

浏览器控制台VS Code
浏览器控制台zoomVS Code zoom标红

其实个人感觉现在这个 * 前缀加不加无所谓,因为即使被一些浏览器所识别,zoom:1 的设置也不会产生什么明显的副作用。不加的话,还可以避免在直接写 CSS 时 VSCode 爆红,不知各位大佬有何观点?

参考:

  • stackoverflow What is haslayout?
  • The Internet Explorer hasLayout Property

如果您有什么建议或者想法欢迎在评论区或者私信交流哦,一起学习,一起进步,加油!

如果本篇文章对你有所帮助,还请客官一件四连!❤️

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode】《LeetCode 101》第十一章:妙用数据结构

文章目录 11.1 C STL11.2 数组448. 找到所有数组中消失的数字(简单)48. 旋转图像(中等)74. 搜索二维矩阵(中等)240. 搜索二维矩阵 II(中等)769. 最多能完成排序的块(中等…

使用IDA查看汇编代码,结合安卓系统生成的Tombstone文件,分析安卓app程序崩溃问题

目录 1、IDA工具介绍 2、产品及问题场景描述 3、查看Tombstone文件 4、使用IDA打开.so动态库文件,查看汇编代码的上下文,到C源码中定位发生崩溃的那行代码 4.1、使用IDA打开.so动态库文件 4.2、切换到Text View文本视图模式 4.3、根据相对于函数的…

【Linux进程篇】环境变量

【Linux进程篇】环境变量 目录 【Linux进程篇】环境变量基本概念常见环境变量查看环境变量方法测试PATH测试HOME测试SHELL和环境变量相关的命令环境变量的组织方式通过代码如何获取环境变量命令行参数命令行第三个参数通过第三方变量environ获取 本地变量通过系统调用获取或设置…

【Sklearn】基于K邻近算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于K邻近算法的数据分类预测(Excel可直接替换数据) 1.模型原理模型原理:数学模型: 2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 K最近邻(K-Nearest Neighbors&#xff0c…

C++入门篇8---vector

vecctor是动态顺序表 一、了解vector的相关接口及其功能 1.构造函数相关接口 函数声明功能介绍vector()无参构造vector(size_type n,const value_type& valvalue_type())构造并初始化n个valvector(const value& x)拷贝构造vector(InputIterator first, InputIterato…

ad+硬件每日学习十个知识点(33)23.8.13 (导出gerber)

文章目录 1.第一次制造输出2.第二次制造输出3.第三次制造输出 1.第一次制造输出 答: 2.第二次制造输出 答: 3.第三次制造输出 答:

企业计算机服务器中了Devos勒索病毒怎么办,勒索病毒解密

社会在发展,科技在进步,企业的生产也得到了很大改善,但是随着网络技术的不断发展,越来越多的企业遭到的网络安全威胁开始增多,其中较为明显的就是勒索病毒攻击。预防勒索病毒攻击成为日常生活中不可或缺的一部分工作。…

Python—行命令搭建HTTP服务器并外网访问本地SQL Server数据库【无公网IP内网穿透】

在强者的眼中,没有最好,只有更好。我们是移动开发领域的优质创作者,同时也是阿里云专家博主。 ✨ 关注我们的主页,探索iOS开发的无限可能! 🔥我们与您分享最新的技术洞察和实战经验,助您在移动…

MySQL中事务特性以及隔离机制

目录 一、什么是事务 二、事务特性——即ACID特性 三、事务的隔离级别 1、脏读 2、不可重复读 3、幻读 Read uncommitted: Read committed: Repeatable read: Serializable: 一、什么是事务 事务(Transaction)——一个最…

小程序用户隐私新规,微信小程序开发者需满足新要求

微信公众平台运营中心最新公告指出,从2023年9月15日开始,涉及处理用户个人信息的小程序开发者需要满足新要求。开发者须主动同步用户同意并遵守小程序的隐私保护指引和其他信息处理规则,方可调用微信提供的隐私接口。 并且,在确认…

第四章,向量组,1-向量组与线性组合、线性表示

第四章,向量组,1-向量组与线性组合、线性表示 向量方程向量与向量组向量向量组 线性组合与线性表示线性组合 线性表示定理定义 多表多(单向)定理推论 定义 等价(多表多:双向) 知识回顾 玩转线性…

用免费Leangoo敏捷看板工具进行可视化的缺陷跟踪管理

用Leangoo敏捷看板进行可视化的缺陷跟踪管理 缺陷管理通常关注如下几个方面: 1. 缺陷的处理速度 2. 缺陷处理的状态 3. 缺陷的分布 4. 缺陷产生的原因 使用Leangoo敏捷看板我们可以对缺陷进行可视化的管理,方便我们对缺陷的处理进展、负责人、当前…

转行软件测试四个月学习,第一次面试经过分享

我是去年上半年从销售行业转行到测试的,从销售公司辞职之后选择去培训班培训软件测试,经历了四个月左右的培训,在培训班结课前两周就开始投简历了,在结课的时候顺利拿到了offer。在新的公司从事软件测试工作已经将近半年有余&…

云渲染效果不对?云渲染前的四个细节表明你的问题出在这里!

云渲染针对3D渲染行业,帮助本地电脑解决渲染慢的问题,大幅提高设计师的工作效率。但小编发现,有不少小伙伴在使用云渲染时,出现了渲染效果不对或丢失的问题,根据小伙伴们的问题和我们创意云云渲染平台给出的解决方案&a…

vue之动态表单(优化)

代码资源在这儿 ↑ vue之动态表单优化 vue2js动态表单优化vue3ts动态表单优化 vue2js动态表单优化 效果图 目录结构 五个文件的完整代码: 以下是App.vue <template><div><router-view></router-view><Formpage /></div> </templa…

【数据结构】栈与队列

1 栈 1.1 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出 LIFO (Last In First Out) 的原则。 压栈&#xff1a;栈…

java中右移>>和无符号右移>>>的区别

public static void main(String[] args) {byte[] dest new byte[2];dest[0] 0x15; //0001 0101dest[1] (byte) 0xfb;//1111 1011System.out.println((dest[0] >> 4) & 0xff);//右移 应该是0000 0001 十进制结果显示1 结果也是1&#xff0c;正确System.out.printl…

【小练习】交互式网格自定义增删改错误记录及解决(进行中)

经过之前的学习&#xff0c;已经能创建简单的交互式网格并设置自定义增删改按钮&#xff0c;但是实现上还是存在一些问题&#xff0c;来完善优化一下。 首先是修改&#xff0c;正常修改都会弹出修改框&#xff0c;里面是之前存储的信息&#xff0c;根据实际需要对其进行修改&a…

小程序多图片组合

目录 子组件 index.js 子组件 index.wxml 子组件 index.wxss 父组件引用&#xff1a; 子组件&#xff1a;preview-image 子组件 index.js Component({properties: {previewData: {type: Array,default: [],observer: function (newVal, oldVal) {console.log(newVal, ol…

AppStream下载元数据失败

错误&#xff1a;为仓库 AppStream 下载元数据失败 : Cannot prepare internal mirrorlist: No URLs in mirrorlist 目录 一、域名解析 二、CentOS-AppStream.repo 三、CentOS-Base.repo 四、CentOS-Extras.repo 五、rpm更新 一、域名解析 先验证 ping www.baidu.com 不…