Bootstrap 4网格的累积版式移位 那是什么让我想出了上述解决方案?可能的解决方案

如何解决Bootstrap 4网格的累积版式移位 那是什么让我想出了上述解决方案?可能的解决方案

在将Bootstrap(4.5)网格用于两列布局并更改列顺序时,我遇到了较高的CLS(内容布局偏移)的问题。

CLS是一项核心网络生命指标。基本上,当网页加载时,网页的各个部分在移动时,Google会看到问题。据说该指标会影响SEO。

在高分辨率下,我的布局由两列组成。右侧为主要内容,左侧为侧边栏。在较低分辨率下,侧边栏内容被下推至主要内容下方。 HTML看起来像这样:

<div class="container-fluid">
    <div class="row">
        <div class="col-lg-8 order-lg-2">
        </div>
        <div class="col-lg-4 order-lg-1">
        </div> 
    </div> 
</div>

问题在于,页面在桌面上呈现时,一会儿,主要内容显示在左侧,然后毫秒(稍后),页面移到右侧的右侧。对于简单的页面(具有简单的DOM或没有外部资源),无法检测到该偏移。

我准备了example of such page。 (source code is on github)。为了测量CLS,我在Chrome中使用Lighthouse。就我而言,当我刷新页面时,我可以看到列正在移动,并且Lighthouse会通知我CLS值为0.326。结果可能取决于渲染资源,因此您可能会有所不同。但是似乎Google Page Insight给出了类似的结果:

enter image description here

无论如何,有没有一种方法可以避免在页面渲染时出现这种偏移?

解决方法

问题似乎更多是与Chrome有关,而不是flexbox或bootstrap。事实证明,该问题是由过早渲染引起的。 Chrome的解析器会``屈服''(因此会触发渲染):

  • 读取65536字节的数据后,
  • 在阅读了50个“令牌”(我认为基本上是html标签)后遇到了<script>标签。

我提供的示例显示了第一种情况(但实际上,我的真实网站因为第二种情况而经历了CLS)。这两种情况都与提交的“错误”有关:11302901041006

因此,问题的答案是希望“错误”能够得到解决。同时,根据实际原因,您可以限制文件大小或删除<script>标签。

,

简短答案

最小化HTML,问题似乎消失了。

更长的答案

我做了一些挖掘工作,这并不是一个完整的“这正是发生的情况”的答案,但是我有足够的主意提出上述解决方案并大致解释我的理由。我希望有人可以扩大我的知识差距。

那是什么让我想出了上述解决方案?

分析页面加载后,我注意到正在创建2个HTML解析任务。

一个处理HTML的1-770行,另一个处理文档末尾的771行。

因此,该页面似乎呈现了前770行,然后在第二个HTML解析任务中重新计算了布局,因为您已交换了顺序(并且.col-lg-4列在第二个解析传递HTML中)。

您不会在“普通”页面上看到此内容,因为该页面以DOM顺序呈现将是正确的,而第二次HTML解析传递只会向该布局添加更多细节。

由于它看起来很一致,因此我删除了所有换行符和空白。我的理论是,无论哪种算法决定将HTML拆分到哪里,都是将行号用作该计算的一部分。

通过将有效行减少到15条左右,我希望该算法只能通过一次语法分析HTML。

实际上它仍然在2中执行此操作,但是最后一遍只是结束</html>标记,所以没关系。这样的结果是,当将解析的HTML与CSSOM结合使用时,它可以正确计算布局。

有点破绽,但它应能在某些页面深度内起作用。

请注意-如果我将DOM节点增加一倍,则此替代方法将无法再次使用。如果我更改了每个列表项的长度(即放入lorem ipsum),但不更改结构,则没有任何区别。因此,似乎是DOM元素数量和行号的某种组合决定了HTML解析器何时应停止其第一遍。

可能的解决方案

回到旧的布局模型。如果您使用float:leftfloat:right,则应该可以使用。我认为这个特定问题是页面复杂度(DOM节点数)和使用flexbox的结合。

flexbox的速度比旧布局模型慢一些,并且有时不得不使用多次通过(旧布局模型是单次通过),我想这个问题在上述建议中将不会持续。

Where I found out about multiple layout passes in certain scenarios

,

这与Bootstrap无关,但这完全是由于Critical CSS的使用不正确或使用不正确。

简而言之,关键CSS将仅加载上述视口中所需的CSS。所有其他CSS(引导框架)都将被延迟(使用defer属性)。

我看到您已经实现了关键的CSS(头部是内联样式),但是加载了所有可用的Bootstrap CSS(或很大一部分),使页面大约80kb大,而其中仅包含一些简单的CSS / HTML。

这个想法是只加载所需的CSS,在您的示例中,仅加载您所使用的网格类的CSS(以及一些基本的html元素样式)。因此,类似这样的东西(只有几kb且加载速度更快):

*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}h1,h3{margin-top:0;margin-bottom:.5rem}ul{margin-top:0;margin-bottom:1rem}a{color:#007bff;text-decoration:none;background-color:transparent}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}h1,h3{margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:2.5rem}h3{font-size:1.75rem}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.col-lg-4,.col-lg-8{position:relative;width:100%;padding-right:15px;padding-left:15px}@media (min-width:992px){.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}}

您还可以使用tools在线生成此关键CSS,或使用penthouse将其集成到您的webpack / gulp工作流程中。

如果您将上述CSS内联加载到头部并像下面在页脚中那样加载所有引导程序deferred,我认为Pagespeed CLS将会有所改善!

<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" defer="defer">

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-