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

引言

居中是我们在前端布局中经常会遇到的问题,其中包括水平居中和垂直居中。居中的方法很多,比如说水平居中可以使用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. CF590C Three States

    题目链接 题目 见链接. 题解 知识点:BFS. 这道题求连接三个国家的最短路径长度.如果枚举每个点进行bfs,显然不可行,换种思路,从三个国家开始分别进行bfs是可以的. 注意一开始初始化两个距离数 ...

  2. Python Print 显示颜色

    1.顺序:显示方式,前景颜色,背景颜色 2.顺序非固定,但尽量按默认书写方式 3.也可以在input中输出使用 4.格式: print('\033[显示方式:前景颜色:背景颜色m .......... ...

  3. NVME CLI 命令使用

    1.下载地址https://github.com/linux-nvme/nvme-cli2.安装unzip nvme-cli-master.zipcd nvme-cli-master.zipmake ...

  4. Apache HTTP Server、IIS反向代理设置

    Apache HTTP Server 在 Apache 中设置反向代理,需要使用 mod_proxy 和相关的模块,如 mod_proxy_http.以下是一个基本的配置示例: 确保已经安装并启用了  ...

  5. Annotation-specified bean name conflicts with existing

    问题说明 Annotation-specified bean name conflicts with existing,non-compatible bean definition of same n ...

  6. postgresql备份和恢复操作

    1.介绍 最近项目上用了postgresql数据库,部署的时候需要备份数据库并在现场进行恢复操作,特此记录.我是在windows上安装的pgadmin4,此处用cmd下操作的: 备份命令:pg_dum ...

  7. python课本学习-第五章

    一.列表的概念 1.列表的创建 列表是由一组任意类型的值组合而成的序列,组成列表的值称为元素,每个元素之间用逗号隔开. 列表中的元素是可变的 #列表类似于c++中的数组,数组下标从0开始 list1 ...

  8. SpringCloud SpringBoot 组件使用:SpringBoot Actuator

    基础篇 一.什么是Spring Actuator? spring-boot-starter-actuator模块是一个spring提供的监控模块.我们在开运行发过程中,需要实时和定时监控服务的各项状态 ...

  9. golang常用库包:redis操作库go-redis使用(01)-Redis数据类型简介和连接Redis的几种方式

    第一篇:go-redis使用,介绍Redis基本数据结构和其他特性,以及 go-redis 连接到Redis(本篇) https://www.cnblogs.com/jiujuan/p/1720716 ...

  10. Kotlin return@xxx 的坑

    Kotlin Return 到标签 先看例子: (1..5).forEach { if (it == 3) { return@forEach } println(it) } println(" ...