React CSS 翻译转换不工作
React CSS Translate Transition not working
我正在尝试为侧边菜单设置动画,但由于某种原因它无法正常工作!
我在一些答案中读到,使用地图映射 <li>
项目可能是问题所在(我只尝试了几个带有静态文本的项目),但这似乎不是问题所在问题。
此外,我也将生成的物品放入状态,并用useEffect包裹集合以防止重新触发地图,但仍然无效。只有过渡不起作用,菜单出现在它必须出现的地方,当我点击菜单按钮时自行关闭,等等。
编辑:我认为值得一提的是,在我的开发服务器上处理它时,当我更新我的 css 文件时(它没有刷新页面), 当我更改一些使侧边栏移动的样式时,它会随着动画移动,所以动画就在那里,当我单击 open/close 按钮时它不起作用但它立即出现。
P.S。 uuid()
为每个元素生成唯一键,因此这也不是问题。
export default function SideBar({ names, closeSidebarOnClick, show }) {
const [robots, setRobots] = useState();
useEffect(() => {
setRobots(GenerateNavItems());
}, names);
function GenerateNavItems() {
return names.map((robotName) => {
return (
<li key={uuid()} className={`nav-item`} onClick={() => {closeSidebarOnClick();}}>
{robotName}
</li>
);
});
}
return (
<nav className={`sidebar ${show ? "show-sidebar" : ""}`}>
<ul>{robots}</ul>
</nav>
);
}
.nav-item {
padding-left: 15px;
text-decoration: none;
font-weight: bold;
}
.nav-item:hover {
color: red;
cursor: pointer;
}
.toggle-sidebar-button {
user-select: none;
cursor: pointer;
padding-left: 1.5rem;
padding-top: 0.5rem;
border: none;
background: transparent;
z-index: 300;
/* z-index: 50; */
}
.toggle-sidebar-button:active {
border: none;
}
.toggle-sidebar-button-line {
width: 35px;
height: 5px;
background-color: black;
margin: 6px 0;
}
.sidebar {
height: 100%;
position: fixed;
top: 0;
left: 0;
width: 200px;
z-index: 200;
background-color: white;
transform: translateX(-100%);
transition: transform 1s ease;
}
.sidebar.show-sidebar {
transform: translateX(0);
}
.sidebar ul {
height: 100%;
list-style: none;
padding-left: 3rem;
padding-top: 3rem;
display: flex;
flex-direction: column;
}
<div id="root">
<div class="content row">
<div class="toggle-sidebar-button">
<div class="toggle-sidebar-button-line"></div>
<div class="toggle-sidebar-button-line"></div>
<div class="toggle-sidebar-button-line"></div>
</div>
<nav class="sidebar ">
<ul>
<li class="nav-item">ROBOT 1</li>
<li class="nav-item">ROBOT 2</li>
</ul>
</nav>
<div class="rendered-robot col">
<div>CHOOSE ROBOT</div>
</div>
</div>
</div>
可能因为您是 re-rendering 导航组件,所以过渡不可见。我建议你尝试这个实验 - 在 closeSidebarOnClickdont
中不要让它做 re-render 并且只使用 - document.getElementsByTagName('nav')[0].classList.add('show-sidebar');
有一种方法可以创建 React.createRef()
或 useRef
,如前所述 here 但这又不经常使用。
好吧,这可能是一种不好的做法,但是当涉及到 css 动画时,我们有什么替代方案?我一直通过 redux 使用这些动画 :) 我认为 dom 不能经常直接操作,但由于这是一个导航栏,并且整个应用程序中可能只有一个导航栏,所以应该没问题。如果您找到使 css 动画正常工作的典型反应方式,请告诉我。
我正在尝试为侧边菜单设置动画,但由于某种原因它无法正常工作!
我在一些答案中读到,使用地图映射 <li>
项目可能是问题所在(我只尝试了几个带有静态文本的项目),但这似乎不是问题所在问题。
此外,我也将生成的物品放入状态,并用useEffect包裹集合以防止重新触发地图,但仍然无效。只有过渡不起作用,菜单出现在它必须出现的地方,当我点击菜单按钮时自行关闭,等等。
编辑:我认为值得一提的是,在我的开发服务器上处理它时,当我更新我的 css 文件时(它没有刷新页面), 当我更改一些使侧边栏移动的样式时,它会随着动画移动,所以动画就在那里,当我单击 open/close 按钮时它不起作用但它立即出现。
P.S。 uuid()
为每个元素生成唯一键,因此这也不是问题。
export default function SideBar({ names, closeSidebarOnClick, show }) {
const [robots, setRobots] = useState();
useEffect(() => {
setRobots(GenerateNavItems());
}, names);
function GenerateNavItems() {
return names.map((robotName) => {
return (
<li key={uuid()} className={`nav-item`} onClick={() => {closeSidebarOnClick();}}>
{robotName}
</li>
);
});
}
return (
<nav className={`sidebar ${show ? "show-sidebar" : ""}`}>
<ul>{robots}</ul>
</nav>
);
}
.nav-item {
padding-left: 15px;
text-decoration: none;
font-weight: bold;
}
.nav-item:hover {
color: red;
cursor: pointer;
}
.toggle-sidebar-button {
user-select: none;
cursor: pointer;
padding-left: 1.5rem;
padding-top: 0.5rem;
border: none;
background: transparent;
z-index: 300;
/* z-index: 50; */
}
.toggle-sidebar-button:active {
border: none;
}
.toggle-sidebar-button-line {
width: 35px;
height: 5px;
background-color: black;
margin: 6px 0;
}
.sidebar {
height: 100%;
position: fixed;
top: 0;
left: 0;
width: 200px;
z-index: 200;
background-color: white;
transform: translateX(-100%);
transition: transform 1s ease;
}
.sidebar.show-sidebar {
transform: translateX(0);
}
.sidebar ul {
height: 100%;
list-style: none;
padding-left: 3rem;
padding-top: 3rem;
display: flex;
flex-direction: column;
}
<div id="root">
<div class="content row">
<div class="toggle-sidebar-button">
<div class="toggle-sidebar-button-line"></div>
<div class="toggle-sidebar-button-line"></div>
<div class="toggle-sidebar-button-line"></div>
</div>
<nav class="sidebar ">
<ul>
<li class="nav-item">ROBOT 1</li>
<li class="nav-item">ROBOT 2</li>
</ul>
</nav>
<div class="rendered-robot col">
<div>CHOOSE ROBOT</div>
</div>
</div>
</div>
可能因为您是 re-rendering 导航组件,所以过渡不可见。我建议你尝试这个实验 - 在 closeSidebarOnClickdont
中不要让它做 re-render 并且只使用 - document.getElementsByTagName('nav')[0].classList.add('show-sidebar');
有一种方法可以创建 React.createRef()
或 useRef
,如前所述 here 但这又不经常使用。
好吧,这可能是一种不好的做法,但是当涉及到 css 动画时,我们有什么替代方案?我一直通过 redux 使用这些动画 :) 我认为 dom 不能经常直接操作,但由于这是一个导航栏,并且整个应用程序中可能只有一个导航栏,所以应该没问题。如果您找到使 css 动画正常工作的典型反应方式,请告诉我。