百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

一行代码实现display"过渡动画"原理

myzbx 2025-02-19 13:06 15 浏览

作者:Peter 谭老师

转发链接:
https://mp.weixin.qq.com/s/XhwPOv62gypzq5MhhP-5vg

写本文的起因

  • 上篇文章,提到如何让display出现过渡动画,却没有仔细介绍原理。
  • 为了更好的让想学习的人深入理解于是加班加点写下了这篇“短文”,我想以后还是以短文为主,不然大家看起来太累

正式开始

  • 初始化界面





????
????
????Document
????



????
????
????测试
  • 此时我将app的display初始化为none,并且写入脚本文件

????。。。

  • 初始化界面变成了这样:
  • 此时,我点击测试按钮
  • 并没有出现动画,非常生硬的出来了,有一些场景我又要性能,比如初始化不渲染,但是当它出现又要有动画的时候,就有可能使用这行代码

?test.onclick?=?function?()?{
????????const?app?=?document.querySelector('#app')
????????console.log(app,?'app')
????????app.style.display?=?"block"
????????const?height?=?app.offsetHeight
????????app.style.transform?=?"translateX(200px)"
????}
  • 当我加入const height = app.offsetHeight这行代码的时候,再点击测试按钮,display切换就顺带出来了“动画”,有了过渡效果
  • 为什么会出现动画了呢?因为我读取dom的这些特殊属性时,浏览器就会强制清空渲染队列一次,让我拿到最新的值。也就是说读取的时候,其实已经是display为"block"了,因此。我们出现了过渡动画

效果如下所示:


出现“过渡动画”是什么情况?

  • 其实display是不能出现动画的,所以标题+了引号
  • 怎么才能有过渡?
    • 有数字的变化,例如透明度,从0-1.
    • 初始化有渲染展示的
    • transition里面包含的属性
    • ...等 大家可以补充

为什么加了一行代码后,就能出现动画了?

  • 大家在写现代前端框架,遇到最多的问题就是渲染的时期不确定的问题。
    • 例如vue里面的nextTick实现,有一个优雅降级的实现。它在mounted生命周期函数里面去获取dom节点时候,经常获取不到或者获取不到完整渲染的dom节点。(我很久没有使用vue了,有问题可以补充),为什么?
    • 像现在数据驱动的框架,只要数据改变了,对应逻辑绑定了数据的dom节点按道理应该更新,可是更新时机是我们无法确定的,因为这中间有中间层,比如存在diff算法计算过程,可能存在队列,因为当你频繁修改数据的时候,框架本身要做优化,合并一段时间的数据更新再去真正更新dom,等这些事情都做完了,才能去更新dom节点,然后我们才能看到最新数据对应的节点
    • 当我们真的要去更新dom节点的时候,也存在一个队列。这个就是浏览器的渲染队列
  • 如果你无法理解我上面说的,可以看我之前手写React系列文章中的setState异步队列实现

浏览器的渲染队列

  • 什么时候最能体现这个队列的作用?
    • 频繁直接操作dom时候,例如for循环里面频繁操作dom,这个时候浏览器就会优化我们的操作,合并一部分操作一次性执行
    • 渲染队列跟display的关联

  • 当我们执行了app.style.display = "block"这行代码时候,dom节点此时并没有更新,js解析引擎是聪明的,它发现你后面马上有代码要修改dom节点,会先存入队列中集中一次性操作
  • 当我们执行了app.offsetHeight这行代码时候,发现我们需要读取dom节点的属性,浏览器害怕现在队列中没有执行的操作会让你读取到不正确的值引发BUG,于是就会清空渲染队列并且执行,让你拿到最精确/新的

  • 当你请求向浏览器请求一些 style信息的时候,就会让浏览器flush队列,比如:
    • offsetTop, offsetLeft, offsetWidth, offsetHeight
    • scrollTop/Left/Width/Height
    • clientTop/Left/Width/Height
    • width,height
  • 当你请求上面的一些属性的时候,浏览器为了给你最精确的值,需要flush队列,
  • 因为队列中可能会有影响到这些值的操作。即使你获取元素的布局和样式信息跟最近发生或改变的布局信息无关,
  • 浏览器都会强行刷新渲染队列。

清空渲染队列后

  • 当读取offsetHeight属性后,我们清空了渲染队列,那么此时dom重新渲染完成后,此时display已经是block了。而且展示在界面上面了,我们再操作dom属性就会出现过渡动画了。

最后

  • 纸上得来终觉浅,多实践、多思考是走向更高级别必经之路,想要看我之前手写源码文章的,我的gitHub源码地址是:https://github.com/JinJieTan/Peter-,记得Star

作者:Peter 谭老师

转发链接:
https://mp.weixin.qq.com/s/XhwPOv62gypzq5MhhP-5vg

相关推荐

Django零基础速成指南:快速打造带用户系统的博客平台

#python##服务器##API##编程##学习#不是所有教程都值得你花时间!这篇实战指南将用5分钟带你解锁Django核心技能,手把手教你从零搭建一个具备用户注册登录、文章管理功能的完整...

iOS 17.0 Bootstrap 1.2.9 半越狱来啦!更新两点

这款Bootstrap半越狱工具终于更新,离上一次更新已相隔很久,现在推出1.2.9版本,主要为内置两点功能进行更新,也是提升半越狱的稳定性。如果你正在使用这款半越狱工具的,建议你更新。注意!...

iOS 16.x Bootstrap 1.2.3 发布,支持运行清理工具

本文主要讲Bootstrap半越狱工具更新相关内容。如果你是iOS16.0至16.6.1和17.0系统的,想体验半越狱的果粉,请继续往下看。--知识点科普--Bootstrap...

SpringBoot整合工作流引擎Acticiti系统,适用于ERP、OA系统

今日推荐:SpringBoot整合工作流引擎Acticiti的源码推荐理由:1、SpringBoot整合工作流引擎Acticiti系统2、实现了三级权限结构3、持久层使用了mybatis框架4、流程包...

SpringCloud自定义Bootstrap配置指南

在SpringCloud中自定义Bootstrap配置需要以下步骤,以确保在应用启动的早期阶段加载自定义配置:1.添加依赖(针对新版本SpringCloud)从SpringCloud2020...

Python使用Dash开发网页应用(三)(python网页开发教程)

PlotlyDash开发Web应用示例一个好的网页设计通常都需要编写css甚至js来定制前端内容,例如非常流行的bootstrap框架。我们既然想使用Dash来搭建web应用,很大的一个原因是不熟悉...

Oxygen XML Editor 27.1 中的新功能

OxygenXMLEditor27.1版是面向内容作者、开发者、合作者和出版商的行业领先工具包的增量版本。在27.1版本中,AIPositronAssistant得到了增强,包括用于...

【LLM-多模态】Mini-Gemini:挖掘多模态视觉语言模型的潜力

一、结论写在前面论文提出了Mini-Gemini,一个精简而强大的多模态VLM框架。Mini-Gemini的本质在于通过战略性框架设计、丰富的数据质量和扩展的功能范围,发掘VLM的潜在能力。其核心是补...

谐云课堂 | 一文详解分布式改造理论与实战

01微服务与分布式什么是分布式?首先,我们对上图提到的部分关键词进行讲解。单体,是指一个进程完成全部的后端处理;水平拆分,是同一个后端多环境部署,他们都处理相同的内容,使用反向代理来均衡负载,这种也叫...

基于Abaqus的手动挡换挡机构可靠性仿真

手动挡,也称手动变速器,英文全称为Manualtransmission,简称MT,即用手拨动换挡操纵总成才能改变变速器内的齿轮啮合位置,改变传动比,从而达到变速的目的。家用轿车主要采用软轴连接的换挡...

【pytorch】目标检测:彻底搞懂YOLOv5详解

YOLOv5是GlennJocher等人研发,它是Ultralytics公司的开源项目。YOLOv5根据参数量分为了n、s、m、l、x五种类型,其参数量依次上升,当然了其效果也是越来越好。从2020...

超实用!50个非常实用的PS快捷键命令大全分享

今天,给大家介绍50个非常实用的快捷键命令大全,大家伙都是设计师,关于软件使用那是越快越好啊。一、常用的热键组合1、图层混合模式快捷键:正常(Shift+Option+N),正片叠底(Shif...

Pohtoshop中深藏不露的小技巧(科目一考试技巧记忆口诀看完必过)

邢帅教育ps教程为大家总结了一些Pohtoshop中深藏不露的小技巧,可以帮助到大家在设计时减少不必要的麻烦,提高工作效率哦~~~1.设置网格线保持像素完美不在1:1分辨率下也能保持像素完美,可以...

Ganglia监控安装总结(监控安装工作总结)

一、ganglia简介:Ganglia是一个跨平台可扩展的,高性能计算系统下的分布式监控系统,如集群和网格。它是基于分层设计,它使用广泛的技术,如XML数据代表,便携数据传输,RRDtool用于数据...

谁说Adobe XD做不出好看的设计?那是你没搞懂这些功能

AdobeXD的美化栏具有将设计视图美化的功能,它能使界面设计和原型设计更漂亮、更吸引眼球。美化栏的7个功能包括竖线布局设计、横线布局设计、重复网格、图形大小和位置设置、响应式调整大小、文字美化以及...