CSS 指令调用不正确 class
CSS Directive calling incorrect class
我正在尝试制作一个可折叠的侧边栏菜单,但目前它会在页面重新加载时闪烁打开和关闭。
问题代码似乎是导航中的这个 CSS 指令。
{on === true ? 'on' : 'off'}
我试过以多种方式更改 CSS 指令,但这些仅在菜单打开时应用动画。所以我认为我误解了指令的工作原理。
class:on
on:click={() => on = !on}
{on ? "on":""}
这是一个例子(有问题的代码在边栏选项卡中):https://svelte.dev/repl/df5d44d97e614945aa06c7a9d9b9038f
HTML:
<aside class="absolute w-full h-full bg-gray-200 border-r-2 shadow-lg mobile-menu {on === true ? 'on' : 'off'}">
<nav>
<ul>
<li class="logo">
<a href="/">GPM</a>
</li>
<hr />
<li><a class="menu-items"href='.'>Index</a></li>
<li><a class="menu-items"href='about'>About</a></li>
</ul>
</nav>
</aside>
CSS:
.on {
animation-name: slide-on;
animation-duration: 0.3s;
animation-direction: normal;
animation-timing-function: ease-in-out;
animation-fill-mode: forwards;
position: fixed;
}
@keyframes slide-on{
0% {
left: -100%;
transform: scale(1);
}
to{
left: 0;
transform: scale(1);
}
}
.off {
animation-name: slide-off;
animation-duration: 0.3s;
animation-direction: normal;
animation-timing-function: ease-in-out;
animation-fill-mode: forwards;
}
@keyframes slide-off{
0% {
left: 0;
transform: scale(1);
}
99%{
left: -99%;
transform: scale(1);
}
100%{
left: -100%;
transform: scale(0);
}
}
Javascript:
export let on = false;
问题是您的边栏组件默认使用 'off' 的 class,这会导致显示动画。
我在这里做了一个解决方案,如果 'on' 变量一直为真,则只添加 'off' class。可能有更好的解决方案,但这行得通。
https://svelte.dev/repl/4afa7e650d1b41759426d7ad0998932f?version=3.37.0
虽然另一个答案是正确的,因为您的组件的初始状态正在播放动画,但应该说您可以通过使用 Svelte 的内置转换大大简化此代码。
在您的脚本标签中,导入飞行过渡
import { fly } from 'svelte/transition';
用 if 块将整个侧边栏包裹起来hide/show 完全
{#if on}
<aside>...</aside>
{/if}
然后将飞行过渡应用到你的旁边:
<aside class="..." transition:fly={{x: -window.innerWidth }}>
然后就不需要所有这些 css 类.
我正在尝试制作一个可折叠的侧边栏菜单,但目前它会在页面重新加载时闪烁打开和关闭。
问题代码似乎是导航中的这个 CSS 指令。
{on === true ? 'on' : 'off'}
我试过以多种方式更改 CSS 指令,但这些仅在菜单打开时应用动画。所以我认为我误解了指令的工作原理。
class:on
on:click={() => on = !on}
{on ? "on":""}
这是一个例子(有问题的代码在边栏选项卡中):https://svelte.dev/repl/df5d44d97e614945aa06c7a9d9b9038f
HTML:
<aside class="absolute w-full h-full bg-gray-200 border-r-2 shadow-lg mobile-menu {on === true ? 'on' : 'off'}">
<nav>
<ul>
<li class="logo">
<a href="/">GPM</a>
</li>
<hr />
<li><a class="menu-items"href='.'>Index</a></li>
<li><a class="menu-items"href='about'>About</a></li>
</ul>
</nav>
</aside>
CSS:
.on {
animation-name: slide-on;
animation-duration: 0.3s;
animation-direction: normal;
animation-timing-function: ease-in-out;
animation-fill-mode: forwards;
position: fixed;
}
@keyframes slide-on{
0% {
left: -100%;
transform: scale(1);
}
to{
left: 0;
transform: scale(1);
}
}
.off {
animation-name: slide-off;
animation-duration: 0.3s;
animation-direction: normal;
animation-timing-function: ease-in-out;
animation-fill-mode: forwards;
}
@keyframes slide-off{
0% {
left: 0;
transform: scale(1);
}
99%{
left: -99%;
transform: scale(1);
}
100%{
left: -100%;
transform: scale(0);
}
}
Javascript:
export let on = false;
问题是您的边栏组件默认使用 'off' 的 class,这会导致显示动画。
我在这里做了一个解决方案,如果 'on' 变量一直为真,则只添加 'off' class。可能有更好的解决方案,但这行得通。
https://svelte.dev/repl/4afa7e650d1b41759426d7ad0998932f?version=3.37.0
虽然另一个答案是正确的,因为您的组件的初始状态正在播放动画,但应该说您可以通过使用 Svelte 的内置转换大大简化此代码。
在您的脚本标签中,导入飞行过渡
import { fly } from 'svelte/transition';
用 if 块将整个侧边栏包裹起来hide/show 完全
{#if on}
<aside>...</aside>
{/if}
然后将飞行过渡应用到你的旁边:
<aside class="..." transition:fly={{x: -window.innerWidth }}>
然后就不需要所有这些 css 类.