//* Define variables and html elements const sidebar = document.querySelector('.sidebar'); const arrow = document.querySelector('.arrow'); //* Add event listeners sidebar.addEventListener('mouseout', () => { arrow.style.transitionDelay = '0s'; sidebar.style.transitionDelay = '0.05s'; }) sidebar.addEventListener('mouseover', () => { arrow.style.transitionDelay = '0.05s'; sidebar.style.transitionDelay = '0s'; })
* { margin: 0; padding: 0; box-sizing: border-box; } body { height: 100vh; width: 100vw; display: flex; } .sidebar { position: fixed; height: 100vh; background-color: black; width: 80px; transition: all 0.5s ease; z-index: 0; } .arrow { position: relative; left: 7.5px; right: 7.5px; top: 7.5px; width: 65px; height: 65px; fill: rgb(115, 151, 162); transition: all 0.5s ease; z-index: 2; } .arrowBackground { position: absolute; top: 0; width: 82px; height: 80px; background-color: rgb(30, 30, 30); z-index: 1; border: 2px solid rgb(50, 50, 50); transition: all 0.5s ease; } .sidebar:hover { width: 240px; } body:has(.sidebar:hover) .arrow { transform: rotate(180deg); left: 167.5px; } body:has(.sidebar:hover) .arrowBackground { left: 160px; }
<section class="sidebar"> <div class="icons"> <div> <svg class="icon arrow" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M9.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.2 288 416 288c17.7 0 32-14.3 32-32s-14.3-32-32-32l-306.7 0L214.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg> <div class="arrowBackground"></div> </div> </div> </section>
When I hover over the sidebar, the arrow and sidebar take 0.5 seconds to convert, but the arrow background class does it immediately, I don't know why, I expected it to take 0.5 seconds to convert, but I don't know how to fix it
I tried rearranging some code but nothing worked, I tried setting a transition delay in JavaScript but it still doesn't work
Add
left: 0;
toarrowBackground
, otherwise it won't know where to convert from