提高动画宽度性能

问题描述 投票:0回答:1

我有一个简单的布局,有一个主要部分和一个侧边栏。我需要水平展开/折叠侧边栏,侧边栏也应该推动主要部分。

body {
  height: 100vh;
  margin: 0;
  display: flex;
}

main {
  flex: 1;
  background-color: coral;
}

ul {
  margin: 0;
  padding: 10px;
  list-style-type: none;
  display: flex;
  flex-direction: column;
  row-gap: 20px;
}

aside {
  width: 24px;
  background-color: red;
  transition: width 200ms ease;
}

aside.open {
  width: 240px;
}
<!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>Static Template</title>
    <link rel="stylesheet" href="style.css" />
  </head>
  <body>
    <main>
      <ul>
        <li>
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris
          pharetra, orci ut faucibus faucibus, risus augue mattis eros, et
          maximus mauris libero quis elit. Curabitur porta ac ante accumsan
          imperdiet.
        </li>
        <li>
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris
          pharetra, orci ut faucibus faucibus, risus augue mattis eros, et
          maximus mauris libero quis elit. Curabitur porta ac ante accumsan
          imperdiet.
        </li>
        <li>
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris
          pharetra, orci ut faucibus faucibus, risus augue mattis eros, et
          maximus mauris libero quis elit. Curabitur porta ac ante accumsan
          imperdiet.
        </li>
      </ul>
    </main>
    <aside></aside>
    <script>
      const aside = document.querySelector("aside");
      document.addEventListener("keydown", (event) => {
        if (event.key === "ArrowLeft") {
          aside.classList.add("open");
        }
        if (event.key === "ArrowRight") {
          aside.classList.remove("open");
        }
      });
    </script>
  </body>
</html>

https://codesandbox.io/s/bitter-wind-elo67e?file=/style.css

<!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>Static Template</title>
    <link rel="stylesheet" href="style.css" />
  </head>
  <body>
    <main>
      <ul>
        <li>
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris
          pharetra, orci ut faucibus faucibus, risus augue mattis eros, et
          maximus mauris libero quis elit. Curabitur porta ac ante accumsan
          imperdiet.
        </li>
        <li>
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris
          pharetra, orci ut faucibus faucibus, risus augue mattis eros, et
          maximus mauris libero quis elit. Curabitur porta ac ante accumsan
          imperdiet.
        </li>
        <li>
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris
          pharetra, orci ut faucibus faucibus, risus augue mattis eros, et
          maximus mauris libero quis elit. Curabitur porta ac ante accumsan
          imperdiet.
        </li>
      </ul>
    </main>
    <aside></aside>
    <script>
      const aside = document.querySelector("aside");
      document.addEventListener("keydown", (event) => {
        if (event.key === "ArrowLeft") {
          aside.classList.add("open");
        }
        if (event.key === "ArrowRight") {
          aside.classList.remove("open");
        }
      });
    </script>
  </body>
</html>
body {
  height: 100vh;
  margin: 0;
  display: flex;
}

main {
  flex: 1;
  background-color: coral;
}

ul {
  margin: 0;
  padding: 10px;
  list-style-type: none;
  display: flex;
  flex-direction: column;
  row-gap: 20px;
}

aside {
  width: 24px;
  background-color: red;
  transition: width 200ms ease;
}

aside.open {
  width: 240px;
}

该代码可以正常工作,但是当主要部分中有很多组件时,它的性能会很低,例如名单。

我们知道我们应该在动画宽度/高度上使用 CSS Transform,因为它会激发样式/布局/绘画等。

问题是,如果我用一些变换动画替换动画宽度,我真的可以提高动画的性能吗?

我试过使用scale(),但是有两个问题:

  1. 最好使用 px
  2. 侧边栏不推动主要部分

谢谢

css animation css-transitions
1个回答
0
投票

使用FLIP技术解决。 Framer Motion 实现了名为 Layout Animation 的 FLIP。

© www.soinside.com 2019 - 2024. All rights reserved.