Open1
transition animation
メニューラベルにホバーした時にふわっと表示して、ホバーが外れたときはふわっと消えるようにする。
CSS
.animated-element {
opacity: 0;
transform: translateY(0.25rem);
visibility: hidden;
transition: visibility 0s 200ms;
}
.animated-element.custom-visible {
animation: fadeIn 200ms ease-out forwards;
visibility: visible;
transition: visibility 0s;
}
.animated-element.custom-hidden {
animation: fadeOut 200ms ease-out forwards;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(0.25rem);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes fadeOut {
from {
opacity: 1;
transform: translateY(0);
}
to {
opacity: 0;
transform: translateY(0.25rem);
}
}
JS
メニューラベルだけでなく、メニュー内部を選択中も表示しなくてはいけないのが注意。
/**
* サービス一覧メニューのマウスオーバーイベント
*/
const servicesContainer = document.getElementById('servicesContainer')
const servicesInner = document.getElementById('servicesInner')
/**
* ナビゲーションの表示トランジション
*/
function enter() {
servicesInner?.classList.remove('custom-hidden');
servicesInner?.classList.add('custom-visible');
}
function leave() {
servicesInner?.classList.remove('custom-visible');
servicesInner?.classList.add('custom-hidden');
}
servicesContainer?.addEventListener('mouseenter', () => {
enter()
})
servicesContainer?.addEventListener('mouseleave', () => {
leave()
})
servicesInner?.addEventListener('mouseenter', () => {
enter()
})
servicesInner?.addEventListener('mouseleave', () => {
leave()
})
HTML
<div id="servicesContainer" class="relative text-[12px] duration-200 tracking-wide group py-10 hover:cursor-pointer hover:text-gray">
<div class="flex items-center gap-2">
<a class="font-sans font-semibold hover:text-gray transition-colors duration-200 tracking-wide hover:text-gray text-sm">
サービス一覧
</a>
<img src="/public/images/arrow-down-black.svg" alt="矢印アイコン" class="w-5 h-5" />
</div>
</div>
.................
<div id="servicesInner"
style={"right: 480px;"}
class="animated-element absolute top-[106px] shadow-lg z-10 bg-white px-6 py-5 rounded-xl w-full max-w-[800px] "
>
<!-- メニュー内部 -->
</div>