多种方式实现 元素高度丝滑的从0-1显示出来

选择合适的方式,给用户更好的体验,多种方式实现 元素高度丝滑的从0-1显示出来。

能用 CSS 实现的动画,就不要采用 JS 去实现。

1、浏览器可以对CSS动画进行优化,其优化原理类似于requestAnimationFrame,会把每一帧的DOM操作都集中起来,在一次重绘和回流中去完成。一般来说频率为每秒60帧。

2、隐藏和不可见的dom不会进行重绘或回流,这样就会更少的使用CPU,GPU和内存使用量。

3、可以强制使用硬件加速;对于帧速不好的浏览器,css3可以做到自动降级,js则需要添加额外的代码。

对requestAnimationFrame有兴趣的可以看看作者的这个文。
提升用户体验之requestAnimationFrame实现前端动画_requestanimation 浏览器重绘-CSDN博客

1) 通过transition + height方式

transition只针对数值变化有效,所以 height:auto 不触发过渡动画,height:200px可触发动画 但该数值固定,无法满足不固定长度的情况。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.elA {width: 150px;height: 50px;background-color: #eee;}.elB {width: 300px;background-color: #5b734a;color: #ddd;height: 0;overflow: hidden;transition: 1s;position: absolute;}/* transition只针对数值变化有效,所以 height:auto 不触发过渡动画,height:200px可触发动画 但该数值固定,无法满足不固定长度的情况。*/.elA:hover+.elB {height: 200px;}</style>
</head><body><div class="elA">元素A</div><div class="elB">元素B<div class="inner">Lorem ipsum dolor sit amet consectetur adipisicing elit.<br>Architecto officiis repudiandae natus dolores quos porroeveniet eum temporibus aspernatur <br>commodi sapiente ab accusantiumdolorem nisi id nemo, obcaecati velit non.</div></div>
</body></html>
2) 通过transition + max-height方式

因无法确认显示内容最大高度,会导致设置高度过大,回缩时有延迟

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.elA {width: 150px;height: 50px;background-color: #eee;}.elB {width: 300px;background-color: #5b734a;color: #ddd;max-height: 0;overflow: hidden;transition: 1s;position: absolute;}/* 因无法确认显示内容最大高度,会导致设置高度过大,回缩时有延迟 */.elA:hover+.elB {max-height: 1000px;}</style>
</head><body><div class="elA">元素A</div><div class="elB">元素B<div class="inner">Lorem ipsum dolor sit amet consectetur adipisicing elit.<br>Architecto officiis repudiandae natus dolores quos porroeveniet eum temporibus aspernatur <br>commodi sapiente ab accusantiumdolorem nisi id nemo, obcaecati velit non.</div></div>
</body></html>
3) 通过transition + tranform:scale(0/1)

使用这种方式时,展示收回会出现一个压缩的过程

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.elA {width: 150px;height: 50px;background-color: #eee;}.elB {width: 300px;background-color: #5b734a;color: #ddd;transform-origin: center top;transform: scaleY(0);overflow: hidden;transition: 1s;position: absolute;}/* scale回缩时,会有展示出一个压缩的过程 */.elA:hover+.elB {transform: scaleY(1);}</style>
</head><body><div class="elA">元素A</div><div class="elB">元素B<div class="inner">Lorem ipsum dolor sit amet consectetur adipisicing elit.<br>Architecto officiis repudiandae natus dolores quos porroeveniet eum temporibus aspernatur <br>commodi sapiente ab accusantiumdolorem nisi id nemo, obcaecati velit non.</div></div></body></html>
4) 通过JS方式实现元素高度 丝滑展示

强制回流

1、(当DOM元素的大小、位置或可见性发生变化时,浏览器需要重新计算页面布局,这个过程就是回流。

        这里通过计算的方式,实现回流。elB.getBoundingClientRect()

2、requestAnimationFrame的回调函数中进行DOM操作,如改变元素的样式、尺寸或位置,这些操作会排队等待浏览器的下一个重绘周期,触发回流。

        requestAnimationFrame(cb)的方式触发回流。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.elA {width: 150px;height: 50px;background-color: #eee;}.elB {width: 300px;background-color: #5b734a;color: #ddd;overflow: hidden;transition: 1s;position: absolute;height: 0;}</style>
</head><body><div class="elA">元素A</div><div class="elB">元素B<div class="inner">Lorem ipsum dolor sit amet consectetur adipisicing elit.<br>Architecto officiis repudiandae natus dolores quos porroeveniet eum temporibus aspernatur <br>commodi sapiente ab accusantiumdolorem nisi id nemo, obcaecati velit non.</div></div><script>let elA = document.querySelector('.elA')let elB = document.querySelector('.elB')elA.onmouseenter = () => {// 先获取元素的自适应原始高度elB.style.height = 'auto'let h = elB.getBoundingClientRect().height// 回到最初的高度elB.style.height = 0// 代码到这里,页面会直接保持高度为0的状态,不会有动画。// 强制回流// 方式一、计算,(当DOM元素的大小、位置或可见性发生变化时,浏览器需要重新计算页面布局,这个过程就是回流。)// elB.getBoundingClientRect()// elB.style.height = h + 'px'// 方式二、在 requestAnimationFrame 的回调函数中进行DOM操作,如改变元素的样式、尺寸或位置,这些操作会排队等待浏览器的下一个重绘周期,触发回流。requestAnimationFrame(() => {elB.style.height = h + 'px'})}elA.onmouseleave = () => {elB.style.height = 0}</script>
</body></html>

如有不足,欢迎指导。

尽可能设想多种解决方案,在多种解决方案中选择一种代价较少的最优解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/46282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java基础学习:序列化之 - Fast serialization

在Java中&#xff0c;序列化是将对象的状态转换为字节流的过程&#xff0c;以便保存到文件、数据库或通过网络传输。Java标准库提供了java.io.Serializable接口和相应的机制来进行序列化和反序列化。然而&#xff0c;标准的Java序列化机制性能较低&#xff0c;并且生成的字节流…

appium2.0 执行脚本遇到的问题

遇到的问题&#xff1a; appium 上的日志信息&#xff1a; 配置信息 方法一 之前用1.0的时候 地址默认加的 /wd/hub 在appium2.0上&#xff0c; 服务器默认路径是 / 如果要用/wd/hub 需要通过启动服务时设置基本路径 appium --base-path/wd/hub 这样就能正常执行了 方法二…

关于Kafka的17个问题

1.Kafka 的设计时什么样的呢&#xff1f; Kafka 将消息以 topic 为单位进行归纳 将向 Kafka topic 发布消息的程序成为 producers. 将预订 topics 并消费消息的程序成为 consumer. Kafka 以集群的方式运行&#xff0c;可以由一个或多个服务组成&#xff0c;每个服务叫做一个…

前端css常用笔记

文章目录 一、样式二、vue笔记2.1、组件之间的通信2.1.1 子组件调用父组件的方法2.1.2 父组件调用子组件的方法2.1.3 孙组件调用祖父组件方法的实现 2.2、使用若依时,node_nodules越来越大的问题2.3、echart笔记 一、样式 1 文字与图标对不齐的解决方法 /**给icon加上这个样式即…

mysql的索引事务和存储引擎

一、索引 1、索引 索引的概念 &#xff1a;索引是一个排序的列表&#xff0c;在列表当中存储索引的值以及索引值对应数据所在的物理行。 索引的引用&#xff1a; 使用索引之后&#xff0c;就不需要扫描全表来定位某行的数据。 加快数据库的查询速度。 索引可以是表中的一…

ubuntu 网络 通讯学习笔记2

1.ubuntu 网络常用命令 在Ubuntu中&#xff0c;有许多网络相关的常用命令。以下是一些主要命令及其用途&#xff1a; ifconfig&#xff1a;此命令用于显示和配置网络接口信息。你可以使用它来查看IP地址、子网掩码、广播地址等。 例如&#xff1a;ifconfig 注意&#xff1a…

在 K8s 上使用 KubeBlocks 提供的 MySQL operator 部署高可用 WordPress 站点

引言 WordPress WordPress 是全球最流行的内容管理系统&#xff08;CMS&#xff09;&#xff0c;自 2003 年发布以来&#xff0c;已成为网站建设的首选工具。其广泛的插件和主题生态系统使用户能够轻松扩展功能和美化外观。活跃的社区提供丰富的资源和支持&#xff0c;进一步…

[RK3588-Android12] 关于如何取消usb-typec的pd充电功能

问题描述 RK3588取消usb-typec的pd充电功能 解决方案&#xff1a; 在dts中fusb302节点下usb_con: connector子节点下添加如下熟悉&#xff1a; 打上如下2个补丁 diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index c8a4e57c9f9b..173f8cb7…

使用OpenCV寻找图像中的轮廓

引言 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它提供了大量的视觉处理功能&#xff0c;包括图像和视频捕获、特征检测与匹配、图像变换、图像分割、颜色空间转换等。在图像处理中&#xff0c;寻找图像中的…

electron项目中实现视频下载保存到本地

第一种方式&#xff1a;用户自定义选择下载地址位置 渲染进程 // 渲染进程// 引入 import { ipcRenderer } from "electron";// 列表行数据下载视频操作&#xff0c;diffVideoUrl 是视频请求地址 handleDownloadClick(row) {if (!row.diffVideoUrl) {this.$message…

【数字电路学习新助手】掌握电路仿真软件,开启数字电路知识的新篇章

在信息科技日新月异的今天&#xff0c;数字电路知识的重要性不言而喻。无论是通信工程、计算机科学与技术&#xff0c;还是电子信息技术等领域&#xff0c;数字电路都是基础中的基础。然而&#xff0c;对于初学者来说&#xff0c;数字电路的学习往往充满了挑战。幸运的是&#…

Axure中继器入门:打造你的动态原型

前言 中继器 是 Axure 中的一个高级功能&#xff0c;它能够在静态页面上模拟后台数据交互的操作&#xff0c;如增加、删除、修改和查询数据&#xff0c;尽管它不具备真实数据存储能力。 中继器就像是一个临时的数据库&#xff0c;为我们在设计原型时提供动态数据管理的体验&a…

中职省培丨2024年大数据技术中职教师专业技能培训班企业参观实践圆满结束

7月17日&#xff0c;“2024年大数据技术中职教师专业技能培训班&#xff08;省培&#xff09;”参训老师莅临广东泰迪智能科技股份有限公司产教融合实训中心开展企业参观实践。泰迪智能科技董事长张良均、中职业务部总监李振林、中职业务部经理黄炳德、校企合作经理吴桂锋及来自…

centos跳过首次创建用户

centos跳过首次创建用户 centos跳过首次创建用户 在安装系统后&#xff0c;登录的时候总是让新建一个普通用户&#xff0c;很是烦人&#xff0c;于是想办法解决一下 方法一 在CentOS上&#xff0c;图形化登录&#xff08;如GNOME&#xff09;通常要求您创建一个用户来登录。…

.net core appsettings.json 配置 http 无法访问

1、在appsettings.json中配置"urls": "http://0.0.0.0:8188" 2、但是网页无法打开 3、解决办法&#xff0c;在Program.cs增加下列语句 app.UseAntiforgery();

vue 如何做一个动态的 BreadCrumb 组件,el-breadcrumb ElementUI

vue 如何做一个动态的 BreadCrumb 组件 el-breadcrumb ElementUI 一、ElementUI 中的 BreadCrumb 定义 elementUI 中的 Breadcrumb 组件是这样定义的 <template><el-breadcrumb separator"/"><el-breadcrumb-item :to"{ path: / }">主…

爬虫的概念

爬虫&#xff08;Web Crawler 或 Web Spider&#xff09;是一种自动化脚本或程序&#xff0c;用于浏览万维网&#xff08;World Wide Web&#xff09;并抓取网页上的信息。它们按照设定的规则自动地访问互联网上的网页&#xff0c;提取所需的数据&#xff0c;如文本、图片、视频…

搭建七日杀服务端系统选择,系统如何选择

《七日杀》是一款集合了第一人称射击、恐怖生存、塔防与角色扮演要素于一身的开放世界僵尸游戏。玩家需要在美国亚历桑纳地区作为幸存者生存&#xff0c;并探究整个事件背后的真相。对于喜欢这款游戏的玩家来说&#xff0c;搭建自己的专属服务器不仅能降低延迟&#xff0c;还能…

精通Python数据可视化:Matplotlib柱状图、直方图与饼状图实战解析

精通Python数据可视化&#xff1a;Matplotlib柱状图、直方图与饼状图实战解析 引言 在数据分析和科学研究中&#xff0c;数据可视化扮演着至关重要的角色。Matplotlib是Python中一个广泛使用的绘图库&#xff0c;它提供了丰富的绘图功能和灵活的定制选项。本文将详细介绍如何…

ubuntu 可以直接在图像界面打开命令行吗

是的&#xff0c;Ubuntu&#xff08;以及其他许多Linux发行版&#xff09;允许用户直接在图形界面&#xff08;GUI&#xff09;中打开命令行界面。这通常通过打开一个终端模拟器应用程序来实现&#xff0c;该应用程序提供了一个命令行窗口&#xff0c;用户可以在其中输入和执行…