这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

引言

居中是我们在前端布局中经常会遇到的问题,其中包括水平居中和垂直居中。居中的方法很多,比如说水平居中可以使用text-align: center或者margin: 0 auto等等来实现,垂直居中则需要使用一些其它的特殊的技巧。比如说常见的做法是使用transform来实现垂直居中,margin-top或者top属性,或者使用弹性布局。

transform的优点

那么我们为什么要使用transform来实现垂直居中呢?

因为transform属于合成属性,而margin-toptop属于布局属性。对于合成属性,浏览器会将被动画元素放入一个独立的层中进行动画,而不会对整个页面进行重绘,这可以提高页面的性能。而对于布局属性,任何一点的变化都可能导致整个页面的重排和重绘,这会对页面的性能产生很大的影响。

如果我们使用margin-top或者top来实现垂直居中,那么每次元素发生变化时,浏览器都会对整个页面进行重排和重绘,这会导致页面的性能受到很大的影响。而使用transform来实现垂直居中,则可以将元素放入一个独立的层中进行动画,避免了对整个页面的重排和重绘,从而提高了页面的性能。

下面是一个使用transform实现垂直居中的示例代码:

<div class="container">
<div class="box">
<p>这是一段文字</p>
</div>
</div> .container {
position: relative;
height: 300px;
background-color: #eee;
} .box {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}

在上面的代码中,我们首先将外层容器设置为position: relative,并指定了一个固定的高度。然后,我们将内层元素设置为position: absolute,并使用top: 50%left: 50%将其定位到父元素的中心位置。最后,我们使用transform: translate(-50%, -50%)来将元素向左上方移动自身宽度和高度的一半,从而实现了垂直居中的效果。

使用transform来实现垂直居中可以避免对整个页面的重排和重绘,从而提高页面的性能。所以在实际的开发中,我们应该尽可能地使用合成属性来进行动画和布局,避免使用布局属性,从而提高页面的性能和用户体验。

浮动

对于浮动居中,它在进行元素的水平居中时,可能会对页面进行重排。这是因为浏览器需要对元素的左右外边距进行计算,并将元素放置在父容器中间。这个过程会导致浏览器对整个页面进行重排,从而可能影响页面的性能。此外,浮动布局实现多列布局,可能会导致多列高度不一致,需要进行额外处理。

但是,在某些情况下,浮动居中并不会对页面进行重排。例如,如果我们将元素的宽度设置为固定的像素值,那么浏览器就可以很容易地计算出元素的左右外边距,并将元素放置在父容器中间,而不需要对整个页面进行重排。在这种情况下,浮动居中的性能表现可能会比较好。

所以说浮动居中可能会对页面进行重排,但在某些情况下,它的性能表现可能会比较好。在实际开发中,我们则应该根据具体的需求和情况来选择。

弹性

弹性布局大家应该也比较熟悉了,用弹性只有一次和无数次,在很多时候使用弹性布局真的很舒服,所以我们关于弹性布局就多描述一些。

弹性布局的优点在于它可以方便地实现弹性盒子容器中弹性盒子项目的伸缩和排列,但是在使用弹性布局时,如果频繁修改弹性容器的属性或弹性项目的排列顺序,就可能会触发页面重排和重绘,从而影响页面的性能和用户体验。

导致原因

具体来说,以下几种情况可能会导致弹性布局的页面重排和重绘:

  1. 修改弹性容器的属性

如果修改弹性容器的属性,如flex-direction、justify-content、align-items等,会影响弹性盒子项目的排列和布局,从而导致页面重排和重绘。

  1. 修改弹性项目的属性

如果修改弹性项目的属性,如flex-grow、flex-shrink、flex-basis等,会影响弹性盒子项目的伸缩和尺寸,从而导致页面重排和重绘。

  1. 修改弹性项目的顺序

如果修改弹性项目的排列顺序,会影响弹性盒子项目的排列和布局,从而导致页面重排和重绘。

优化

以为了避免弹性布局的页面重排和重绘,我们可以采取一些优化措施,如:

  1. 尽可能减少修改弹性容器和弹性项目的属性和顺序。

  2. 将多个弹性容器和弹性项目尽可能合并为一个弹性容器和弹性项目,从而减少页面重排和重绘。

  3. 将弹性容器和弹性项目的尺寸设置为固定值,从而减少页面重排和重绘。

所以说,虽然弹性布局具有灵活和方便的优点,写起来很舒服,但是在使用时我们需要注意优化,减少页面重排和重绘,以提高页面的性能和用户体验。

本文转载于:

https://juejin.cn/post/7303587697100013606

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

记录--居中为什么要使用 transform?的更多相关文章

  1. css居中的几种方式

    居中分水平和垂直两种,使用的频度也算是很高,下面分情况来讨论一下几种常用的实现方式. 欢迎指正文中的错误,同时如果有学习到新的方式也会更新在后面,也方便以后温故知新. 1.margin 这种方式只能实 ...

  2. css 图片文字居中

    1.单行文字居中 2.多行文字居中 3.利用background-position:center;的图片居中 4.利用display:table-cell;属性的图片居中 <!DOCTYPE h ...

  3. transform Vs Udf

    在鞋厂的第一个任务,拆表.需要把订单表按照开始日期和结束日期拆分成多条记录,挺新鲜的~ transform方式,使用到了python. (1)把hive表的数据传入,通过python按照日期循环处理, ...

  4. css上下左右居中

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 一个标签的72变,打造一个纯CSS图标库

    每次要用到图标的时候都会到 icono 去copypaste,但每次用到的时候尺寸都各不一样,总是要调整参数,巨烦.当然你可以会想到用zoom.scale来做缩放,但是这样的缩放会使得线宽也变粗了,不 ...

  6. oracle 函数

    1.--dense_rank()分析函数(查找每个部门工资最高前三名员工信息) select * from (select deptno,ename,sal,dense_rank() over(par ...

  7. iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

    -- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事 ...

  8. iOS开发之微信聊天页面实现

    在上篇博客(iOS开发之微信聊天工具栏的封装)中对微信聊天页面下方的工具栏进行了封装,本篇博客中就使用之前封装的工具栏来进行聊天页面的编写.在聊天页面中主要用到了TableView的知识,还有如何在俩 ...

  9. iOS-触摸事件、手势识别、摇晃事件、耳机线控

    概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事件(手势操作).运动事件. ...

  10. Unity3D脚本中文系列教程(十四)

    http://dong2008hong.blog.163.com/blog/static/469688272014032134394/ WWWFrom 类Unity3D脚本中文系列教程(十三)辅助类. ...

随机推荐

  1. 推荐一款id生成器: Hashids

    唯一 id 生成的方式有很多种,比较常见的有以下几种方式: 语言自带功能,如 Java 中的 UUID,常用于后端 第三方工具提供,如 npm 中的 nanoid,常用于前端 Twitter 开源的 ...

  2. MFC-ODBC API动态连接配置数据库

    一.ODBC管理器介绍 在Window中,ODBC数据远管理器有6个标签:用户DSN.系统DSN.文件DSN.驱动程序.跟踪.连接池,通常情况下,使用用户DSN或者系统DSN,这里主要了解用户DSN和 ...

  3. 提高Java开发生产力,我选Stream API,真香啊

    Java 8 引入的Stream API提供了一种新的数据处理方式,它以声明式.函数式的编程模型,极大地简化了对集合.数组或其他支持数据源的操作.Stream可以被看作是一系列元素的流水线.允许你高效 ...

  4. 【Unity3D】边缘检测特效

    1 边缘检测原理 ​ 边缘检测的原理是:检测每个像素周围的像素亮度差,如果亮度差异较大,就将该像素识别为边缘,并进行边缘着色. ​ 本文完整资源见→Unity3D边缘检测特效. ​ 使用过卷积神经网络 ...

  5. FTP命令详解(含操作实例)

    以下是微软命令行FTP客户端命令大全,如果你想使用"未加工(RAW)"FTP命令而非下面翻译过的请参考:http://www.nsftools.com/tips/RawFTP.ht ...

  6. 学习go语言编程之网络编程

    Socket编程 Golang语言标准库对Socket编程进行了抽象,无论使用什么协议建立什么形式的连接,都只需要调用net.Dial()即可. Dial()函数 Dial()函数的原型如下: fun ...

  7. Excel联动(wps)

    Excel联动(wps) https://www.wps.cn/learning/course/detail/id/330423.html demo: https://files.cnblogs.co ...

  8. 【Azure 环境】记录使用Notification Hub,安卓手机收不到Push通知时的错误,Error_Code 30602 or 30608

    问题描述 使用Azure Notification Hub + Baidu 推送遇见的两次报错为: 1. {"request_id":2921358089,"error_ ...

  9. C++ //string字符串拼接

    1 //string字符串拼接 2 #include <iostream> 3 #include<string> 4 5 using namespace std; 6 7 8 ...

  10. C++ //栈 stack 容器 先进后出 不允许遍历

    1 //栈 stack 容器 先进后出 不允许遍历 2 3 4 #include<iostream> 5 #include<stack> 6 7 using namespace ...