js实现高度自动的过渡动画

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<style>
  * {
    padding: 0;
    margin: 0;
  }

  ul {
    width: 200px;
    height: 0;
    /* 动画类型 */
    transition: transform;
    /* 动画时长 */
    transition-duration: .8s;
    /* 动画延迟 */
    transition-delay: .2s;
    /* 动画控制属性 */
    transition-property: height;
    overflow: hidden;
    cursor: pointer;
    border-radius: 2px;
    box-shadow: 6px 6px 10px rgba(0, 0, 0, 0.2);
  }

  li {
    list-style-type: none;
    width: 200px;
    height: 40px;
    line-height: 40px;
    color: #fff;
    font-size: 14px;
    text-align: center;
    background: #1061f8;
  }

  body {
    display: flex;
    flex-direction: column;
    align-items: center;
  }

  #btn {
    width: 200px;
    height: 40px;
    line-height: 40px;
    margin-top: 100px;
    text-align: center;
    background: #dfdfdf;
    border-radius: 2px;
    cursor: pointer;
  }
</style>

<body>
  <p id="btn">toggle菜单</p>
  <ul id="ul">
    <li>菜单一</li>
    <li>菜单一</li>
    <li>菜单一</li>
    <li>菜单一</li>
    <li>菜单一</li>
    <li>菜单一</li>
    <li>菜单一</li>
    <li>菜单一</li>
    <li>菜单一</li>
  </ul>
</body>
<script>
  var btn = document.getElementById('btn');
  var menu = document.getElementById('ul');
  var heigt = 0
  btn.onmouseenter = function () {
    // 获取菜单高度(执行JS时浏览器来不及渲染,所有不会闪烁)
    if (!heigt) {
      menu.style.height = 'auto';
      heigt = menu.getBoundingClientRect().height;
    }
    menu.style.height = 0;
    //offsetHeight会强制浏览器重绘(先渲染0px,然后再渲染heigt,如果不加则直接会渲染height,不会渲染0px)
    menu.offsetHeight
    menu.style.height = heigt + 'px';
  }
  btn.onmouseleave = function () {
    menu.style.height = 0;
  }

  menu.onmouseenter = function () {
    menu.style.height = heigt + 'px';
  }
  menu.onmouseleave = function () {
    menu.style.height = 0;
  }
</script>

</html>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr_linjw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值