【问题标题】:Reversing the animation in CSS在 CSS 中反转动画
【发布时间】:2020-08-28 09:59:38
【问题描述】:

我正在尝试做的事情:当在搜索栏中输入内容时,未搜索的用户名必须淡出并消失(效果很好),我试图在搜索栏中的字母被删除或搜索栏被清除。

App.js

import React, { useState, useEffect } from "react";
import SearchBar from "./SearchBar";
import "./App.scss";

const users = [
  { name: "Jack", id: "1" },
  { name: "Lisa", id: "2" },
  { name: "Peter", id: "3" },
  { name: "Roman", id: "4" },
  { name: "Sarah", id: "5" },
  { name: "Eric", id: "6" },
  { name: "Fiora", id: "7" },
];

function App() {
  const [searchValue, setSearchValue] = useState("");
  const [searchFilter, setSearchFilter] = useState(users);

  return (
    <div className="App">
      <h2>Search</h2>
      <SearchBar onSearch={setSearchValue} value={searchValue} />
      <ul className="users">
        {searchFilter.map((user) => {
          let classname =
            user.name.toLowerCase().indexOf(searchValue.toLowerCase()) === -1 &&
            "hide";

          return (
            <li className={`user ${classname}`} key={user.id}>
              {user.name}
            </li>
          );
        })}
      </ul>
    </div>
  );
}

export default App;

搜索栏.js

import React from "react";

function SearchBar(props) {
  const handleSearch = (e) => {
    props.onSearch(e.target.value);
  };

  return <input type="text" onChange={handleSearch} value={props.value} />;
}

export default SearchBar;

App.scss

.user {
  list-style: none;
}

.hide {
  animation: fade-out 1s ease-out forwards;
}

@keyframes fade-out {
  0% {
    opacity: 1;
  }

  50% {
    opacity: 0;
    height: inherit;
    padding: inherit;
  }

  100% {
    opacity: 0;
    height: 0;
    padding: 0;
  }
}

所以基本上我只是想在用户删除搜索栏中的字母时反转动画。

【问题讨论】:

    标签: javascript css reactjs sass


    【解决方案1】:

    您可以像使用hide 一样使用show

    在 App.js 中

    let classname = user.name.toLowerCase().indexOf(searchValue.toLowerCase()) === -1 ? "hide" : "show";
    

    在 App.scss 中

    .show {
      animation: fade-in 1s ease-out forwards;
    }
    
    @keyframes fade-in {
    
      0% {
        opacity: 0;
        height: 0;
        padding: 0;
      }
    
      50% {
        opacity: 0;
        height: inherit;
        padding: inherit;
      }
    
      100% {
        opacity: 1;
      }
    }
    
    

    你可以走了。

    【讨论】:

    • 如果我不希望动画在组件第一次加载时工作,有什么办法可以用 animation-direction: alternate 做到这一点?只有淡出关键帧。
    【解决方案2】:

    你可以只反转动画定义,检查这个codesandbox

    CSS

    .show {
      animation: fade-in 1s ease-out forwards;
    }
    
    @keyframes fade-in {
      0% {
        opacity: 0;
        height: 0;
        padding: 0;
      }
    
      50% {
        opacity: 0;
        height: inherit;
        padding: inherit;
      }
    
      100% {
        opacity: 1;
      }
    }
    

    &lt;App /&gt; 组件内部:(检查隐藏/显示类)

    function App() {
      const [searchValue, setSearchValue] = useState("");
      const [searchFilter, setSearchFilter] = useState(users);
    
      return (
        <div className="App">
          <h2>Search</h2>
          <SearchBar onSearch={setSearchValue} value={searchValue} />
          <ul className="users">
            {searchFilter.map(user => {
              let classname =
                user.name.toLowerCase().indexOf(searchValue.toLowerCase()) === -1
                  ? "hide"
                  : "show"; // <--- HERE we switch for show/hide class.
    
              return (
                <li className={`user ${classname}`} key={user.id}>
                  {user.name}
                </li>
              );
            })}
          </ul>
        </div>
      );
    }
    

    【讨论】:

    • 如果我不希望动画在组件第一次加载时工作,有什么办法可以用 animation-direction: alternate 做到这一点?只有淡出关键帧。
    • 不可能使用一个动画来完成这两种效果,我会考虑在加载时删除动画。
    • @YassineAb,我更新了我的sandbox 并注意我添加了一个模仿componentDidUpdate() 的方法,只是为了确保我只是在初始渲染之后添加了显示类。
    • 很高兴为您提供帮助!如果您发现它对您的问题有用,请考虑accepting我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多