Firefox 中缓慢滚动和平滑滚动的 Javascript 解决方法

2023-11-25

我是一名网络应用程序开发人员。在这个应用程序中,有一个特定的场景,其中有多个position:fixed元素、canvas和一个overflow:scroll元素。在这种情况下,当启用平滑滚动时,Firefox 上的滚动速度非常慢。

从用户的角度来看,解决方案只是禁用平滑滚动。但是,作为开发人员,我无法确保用户已经这样做了。

有没有什么地方可以告诉 Firefox 不要从 javascript (或 html)为我的网站使用平滑滚动?或者还有其他已知的解决方法吗?


我确实理解您的问题基本上是如何禁用平滑滚动。不过,为了让这个工作正常进行,我会以不同的方式回答你。

为什么不同?

即使您可以检测到用户的平滑滚动,您也不能强迫用户禁用它。换句话说,你试图掩盖问题而不是解决问题。所以让我们解决它!

简介:像素到屏幕管道

在每个帧上,浏览器都会执行以下步骤以在屏幕上呈现页面。

enter image description here

  • JavaScript。通常,JavaScript 用于处理会导致视觉变化的工作,无论是 jQuery 的动画功能、对数据集进行排序,还是向页面添加 DOM 元素。不过,触发视觉变化的不一定是 JavaScript:CSS 动画、过渡和 Web 动画 API 也很常用。

  • 风格计算。这是根据匹配选择器确定哪些 CSS 规则适用于哪些元素的过程,例如.headline 或 .nav > .nav__item。从那里开始,一旦知道规则,就会应用它们并计算每个元素的最终样式。

  • 布局。一旦浏览器知道哪些规则适用于某个元素,它就可以开始计算它占用了多少空间以及它在屏幕上的位置。网络的布局模型意味着一个元素可以影响其他元素,例如元素的宽度通常会影响其子元素的宽度,依此类推,一直到树的上下,因此该过程对于浏览器来说可能相当复杂。

  • 画。绘画是填充像素的过程。它涉及绘制文本、颜色、图像、边框和阴影,基本上是元素的每个视觉部分。绘图通常在多个表面上完成,通常称为图层。

  • 合成。由于页面的各个部分可能被绘制到多个层中,因此需要以正确的顺序将它们绘制到屏幕上,以便页面正确呈现。这对于与另一个元素重叠的元素尤其重要,因为错误可能会导致一个元素错误地出现在另一个元素的顶部。

详情及来源:https://developers.google.com/web/fundamentals/performance/rendering/?hl=en

Step 1:

第一步是删除渲染成本高昂的 CSS 属性。您可能无法删除很多,但可以替换rgba(255,255,255,1); with #fff这会删除 alpha 层。

检查此以获取更多详细信息:https://csstriggers.com/有些属性不需要做layout or a paint而且比其他人轻一些。

Step 2:

检查forced synchronous layout触发器。当您强制浏览器执行以下操作时,就会发生这些情况layout当它在 javascript 步骤中时,然后返回到 javascript,而不是沿着每一帧上的管道平滑地行走。为此,请避免获取布局属性并随后在循环中直接设置它们。

以下是导致同步布局的原因列表:https://gist.github.com/paulirish/5d52fb081b3570c81e3a

阅读更多:https://developers.google.com/web/tools/chrome-devtools/profile/rendering-tools/forced-synchronous-layouts?hl=en

Step 3:

将页面上需要定期重新绘制的组件移动到新图层中。

每次滚动或播放动画时,浏览器都需要重新绘制。为了避免整个页面重新绘制并仅重新绘制正在更改的部分,请将该部分(例如视差、导航、动画)移动到浏览器上的新图层(像 Photoshop 图层一样思考)

为此,请使用will-changecss 属性告诉浏览器将其移动到新层,并使用transform: translateZ(0);如果你想强制浏览器移动它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firefox 中缓慢滚动和平滑滚动的 Javascript 解决方法 的相关文章

  • 如何恢复文本框数据

    我有一个小小的要求 我们已经恢复了之前清除的文本框数据 下面是我的 HTML 代码 table tr td td tr table
  • 当内部元素滚动位置到达顶部/底部时防止父元素滚动?

    我有一个小 浮动工具箱 一个带有position fixed overflow auto 效果很好 但是 当在该框内滚动 使用鼠标滚轮 并到达底部或顶部时 父元素 接管 滚动请求 工具框后面的文档滚动 这很烦人 而不是用户 要求的 我正在使
  • 三个JS,给纹理添加镜面反射(光泽)

    我有一个纹理应用于 Three js 中的对象 我想为其添加一些镜面反射或光泽 我看到这样的例子 new THREE MeshPhongMaterial color 0x996633 specular 0x050505 shininess
  • 在节点环境中存根 jQuery.ajax (jQuery 2.x)

    我正在尝试运行一些需要存根的测试jQuery ajax 我正在使用 SinonJS 来做到这一点 它曾经与旧版本的 jQuery 1 x 一起工作得很好 var require jquery var sinon require sinon
  • JavaScript 字符串中的脚本标签[重复]

    这个问题在这里已经有答案了 我遇到一个问题 即 JavaScript 中带引号的字符串内有结束脚本标记 并且它正在杀死脚本 我认为这不是预期的行为 可以在这里看到这样的示例 http jsbin com oqepe edit http js
  • jQuery:查找具有特定自定义属性的元素

    我只想找到具有特定自定义属性值的元素 例如 我想找一个div其具有属性data divNumber 6 var number 6 var myDiv data divNumber number 我尝试使用http api jquery co
  • onClick 处理程序在每个渲染周期触发

    我有这样的默认状态 this state selectedTab tab1 then 我的渲染方法是这样的 render const selectedTab this state return li tab1 li li tab2 li d
  • 我可以在 GWT 中使用第三方 Javascript 库吗

    例如穆工具 用 js 编码对我来说很舒服 但显然不适合所有人 你当然可以 最好的事情就是给自己写一些好看的JavaScript 覆盖类型 http code google com webtoolkit doc latest DevGuide
  • EmberJS:对象作为查询参数来刷新模型

    我遵循了查询参数指南 http guides emberjs com v1 11 0 routing query params http guides emberjs com v1 11 0 routing query params 而且效
  • 如何通过setTimeout函数定期打印数字?

    var i 0 function counter for i i lt 100 i setTimeout gt console log i 2000 counter 我想以 2 秒的间隔打印 i 但它立即打印 每次打印调用只需要几微秒 为什
  • .points 不透明度/大小在三个.js 内

    我回来回答有关 points 的第二个问题 这次想知道如何将不透明度从 0 更改为 1 然后又回到距发射器的特定像素距离内 var particleCount 14 particles new THREE Geometry pMateria
  • AngularJS + jQuery 移动

    是否还有其他可能性来设计AngularJS以移动友好的方式应用程序CSS 我正在计划一个移动应用程序 并希望使用 AngularJS 进行逻辑和数据绑定 但我不想自己设计所有内容CSS The AngularJSFAQ说它使用jQuery
  • Angular 4 Http POST 不起作用

    我希望每个人都做得很好 我最近开始使用 Angular 4 4 我一直在尝试将数据发布到我的 api 服务器 但不幸的是它不起作用 我花了大约两天的时间 但仍然没有成功 甚至已经尝试过 6 7 篇文章角 io https angular i
  • Angular2:动态同步http请求

    Goal 发出一系列同步 http 请求并能够将它们作为一个可观察流进行订阅 示例 不工作 let query arr test1 test2 test3 function make request query arr if query a
  • 从链接打开本地文件夹

    如何通过单击任何链接打开本地文件夹视图 我尝试了很多选择 例如 a href Open folder a or a Open folder a or a Open folder a 解决方案 启动可下载链接 以下内容适用于所有浏览器 但一如
  • Firebase + Node.js:错误:找不到 XMLHttpRequest 兼容性库

    Firebase Node js On iOS 安装的 Node js npm 安装 firebase save 节点测试 js 其中 test js 是一个非常简单的连接到 Firebase 的脚本 var firebase requir
  • 当php脚本通过ajax运行时显示进度条

    我有一个通过 ajax 向服务器提交值的表单
  • onPress 方法中箭头函数与普通函数的行为

    正在学习 Native React 并学习更多关于 javascript 的知识 所以我仍然不明白它的行为的很多事情 我使用 TouchableOpacity 及其 onPress 属性创建了一个按钮组件 为了让它工作 我必须发送我想要执行
  • Three.js点击单个粒子

    In this example http jsfiddle net agqq96bq 2 您可以看到 2 个可点击的粒子 但它们都受到点击的影响 另外 我只想检测粒子上的点击 而不将它们过滤出场景 像这儿 if intersects len
  • 如果 POST 响应仅包含 ID,如何将数据保存到我的 Ember 存储?

    Ember 数据期望我的服务器在每次成功后返回完整的对象POST 但是 我的 API 只返回一种元对象 其中包含id 当 Ember 收到此对象时 记录中的现有数据将被删除 除了id 例如 当我这样做时 var asset App Asse

随机推荐

  • Postgres 无法侦听特定 IP 地址

    我试图阻止对 PostgreSQL 的访问 只允许访问本地主机和我的机器外部 IP 例如 172 211 xx xx 此 IP 由我的 ISP 互联网服务提供商 提供 In postgresql conf我设置了以下行 listen add
  • GZIP解压 C# OutOfMemory

    我有许多从 ftp 下载的大型 gzip 文件 大约 10MB 200MB 需要解压 所以我尝试谷歌并找到一些gzip解压的解决方案 static byte Decompress byte gzip using GZipStream str
  • fluidd 不解析 JSON 日志文件条目

    我在 Stackoverflow 上看到过很多类似的问题 包括this one 但没有一个解决我的具体问题 该应用程序部署在 Kubernetes v1 15 集群中 我正在使用基于的 docker 映像流利 流利的 docker imag
  • Django:如何构建自定义表单小部件?

    我很难找到有关如何编写自定义小部件的文档 我的问题是 如果我构建一个自定义小部件 它是否可以等效地用于管理界面或普通表单 如果我想允许用户编辑项目列表 我应该子类化哪个小部件 我需要重写 实现小部件的哪些方法 什么小部件方法负责从用户输入返
  • 通过参数清除缓存

    我们希望在生产部署中缓存崩溃 但不想立即浪费大量时间来找出这样做的系统 我的想法是将参数应用于具有当前版本号的 css 和 js 文件的末尾 有两个问题 这会有效地破坏缓存吗 该参数是否会导致浏览器永远不会缓存来自该 url 的响应 因为该
  • “无法将多个参数绑定到请求的内容。”在 web api 和 angularJs 中

    当传入多个参数时WebApi结果是异常 Can t bind multiple parameter to the request s content 有以下代码的解决方案 public class A1 public int id get
  • 汇编中的递归斐波那契

    我正在尝试在汇编中实现递归斐波那契程序 但是 我的程序崩溃了 出现未处理的异常 而且我似乎无法找出问题所在 我不怀疑这涉及我对堆栈的不当使用 但我似乎无法指出哪里 386 model Flat public Fibonacci includ
  • 如何使用 Retrofit 在 JSON 请求中获取“nameValuePairs”?

    我如何发帖JSONObject要求如下 原始请求 pObj robj l index 1 user id 111 vername 1 fcmtoken ghkghkhkh uobject pname y6y68uuy7 在 Volley 中
  • 如果失败,如何重新发送 GWT RPC 请求(或如何创建持久 RPC 请求)?

    如果失败 HTTP 200 之外的任何响应代码 我需要重试发送 GWT RPC 请求 原因很复杂 我就不多说了 到目前为止 我将所有请求响应放在同一个地方 如下所示 We override the RpcRequestBuilder doS
  • 垂直 RecyclerView 内的水平 RecyclerView 滚动急动

    我使用的布局中使用多个 RecyclerView 水平 作为 RecyclerView 的项目视图 问题是垂直滚动并不像我期望的那么平滑 垂直滚动时有一些抽搐 Parent RecyclerView 如何消除这些垂直滚动抖动 我曾经在Par
  • 为什么修补/保存时日期/时间值解释不正确?

    我尝试保存 cakephp 3 表单中的数据 所有数据都保存得很好 但日期时间却没有 我有 2 个日期时间字段 这些字段由 jquery ui 小部件填充 问题似乎发生在打包实体时 intervention this gt Interven
  • AngularJS $http.get 带有解析

    我正在了解 AngularJS 但我遇到了一个有趣的问题 我正在了解routeProvider 我想我可以编写我的应用程序 就像您搜索表名称一样 它会更改路线 因此您也可以在url之后编写表 来自 app js 的详细信息 app conf
  • 在角度 2/4 中更改属性时创建过渡

    每当我更改属性的值时 我想创建一个过渡效果 我尝试执行以下操作 Component selector image holder template div class carousel image img src span text span
  • 使用 tastypie 资源将查询集转换为 json

    我有一个模型的美味馅饼资源 我还有一个视图 其中包含一个查询集 需要序列化并发送给客户端 我正在寻找一种方法让 tastypie 资源处理查询集的序列化和脱水 我发现我可以将单个对象传递给 Resource build bundle sel
  • 如何在 JavaScript 中获取两个数组之间的差异?

    JavaScript 有没有办法返回两个数组之间的差异 例如 var a1 a b var a2 a b c d need c d Array prototype includes ES2016 ES7 在这里派上用场 路口 let int
  • 使用 Javascript 更改标签的类型

    假设我想改变一切 img 标签到页面上的标签 javascript 可以用于此目的吗 有什么方法可以更改实际的标签类型 或者我必须先删除 img 然后创建 如果是这样 我如何确保新标签与旧标签具有相同的容器等 执行此类替换的最直接且浏览器友
  • SQL数据库中的搜索列忽略特殊字符

    有谁知道是否可以对 SQL Server 数据库中的列进行 LIKE 搜索 但让它忽略列中的任何特殊字符 因此 例如 如果我有一个名为 歌曲 的列 并且它们包含以下内容 黑或白 直到布鲁克林才睡觉 船歌 爸爸不传教 如果用户搜索 no sl
  • Mongoose toObject: { 虚拟: true }

    我正在尝试学习 MongoDB Node 我注意到在模式中我经常看到这样的东西 toObject virtuals true toJSON virtuals true 这两行是什么意思 这不是 MongoDB 而是特定于 mongoose
  • 如何向MySQL中插入自增列(字段)数据?

    我创建了一个带有主键并启用的表AUTO INCREMENT CREATE TABLE IF NOT EXISTS test authors hostcheck id INT PRIMARY KEY AUTO INCREMENT instan
  • Firefox 中缓慢滚动和平滑滚动的 Javascript 解决方法

    我是一名网络应用程序开发人员 在这个应用程序中 有一个特定的场景 其中有多个position fixed元素 canvas和一个overflow scroll元素 在这种情况下 当启用平滑滚动时 Firefox 上的滚动速度非常慢 从用户的