每天进步一点点——学习高度过渡的四种方式

每天学点知识点,每天进步一点点,本文记录了高度过渡变化的四种方式,大家一块来查漏补缺,或者回顾知识吧😉😉😉

常见的四种方式的高度过渡

目前常见的高度过渡的方式有四种

  • transition + height
  • transition + max-height
  • transition + tranform:scale(0/1)
  • JS方式计算元素的高度

实际上,还有一个height: calc-size(auto)也能实现,只是兼容性目前还不行,估计还得等个三五年,才能放心用

1. 通过transition + height方式

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

html 复制代码
<!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 porro
            eveniet eum temporibus aspernatur <br>commodi sapiente ab accusantium
            dolorem nisi id nemo, obcaecati velit non.
        </div>
    </div>
</body>

</html>

2. 通过transition + max-height方式

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

html 复制代码
<!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 porro
            eveniet eum temporibus aspernatur <br>commodi sapiente ab accusantium
            dolorem nisi id nemo, obcaecati velit non.
        </div>
    </div>
</body>

</html>

3. 通过transition + tranform:scale(0/1)

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

html 复制代码
<!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 porro
            eveniet eum temporibus aspernatur <br>commodi sapiente ab accusantium
            dolorem nisi id nemo, obcaecati velit non.
        </div>
    </div>
</body>

</html>

4. 通过JS方式计算元素的高度,实现元素高度 丝滑展示

通过dom.getBoundingClientRect().height计算

html 复制代码
<!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 porro
            eveniet eum temporibus aspernatur <br>commodi sapiente ab accusantium
            dolorem 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>

A good memory is better than a bad pen. Record it down...

相关推荐
AI浩3 小时前
【Labelme数据操作】LabelMe标注批量复制工具 - 完整教程
运维·服务器·前端
涔溪3 小时前
CSS 网格布局(Grid Layout)核心概念、基础语法、常用属性、实战示例和进阶技巧全面讲解
前端·css
2401_878454533 小时前
浏览器工作原理
前端·javascript
西陵4 小时前
为什么说 AI 赋能前端开发,已经不是选择题,而是必然趋势?
前端·架构·ai编程
by__csdn5 小时前
Vue3 setup()函数终极攻略:从入门到精通
开发语言·前端·javascript·vue.js·性能优化·typescript·ecmascript
天天扭码5 小时前
前端如何实现RAG?一文带你速通,使用RAG实现长期记忆
前端·node.js·ai编程
Luna-player6 小时前
在前端中,<a> 标签的 href=“javascript:;“ 这个是什么意思
开发语言·前端·javascript
lionliu05196 小时前
js的扩展运算符的理解
前端·javascript·vue.js
小草cys6 小时前
项目7-七彩天气app任务7.4.2“关于”弹窗
开发语言·前端·javascript
奇舞精选6 小时前
GELab-Zero 技术解析:当豆包联手中兴,开源界如何守住端侧 AI 的“最后防线”?
前端·aigc