Как убрать дергание в анимации кнопки при наведении мыши на SVG?

Сделал плавную анимацию при наведении мыши на зеленую кнопку, но когда мышь задевает SVG-элемент анимация ведет себя так как будто я убрал мышь из области кнопки. Как сделать так чтобы при наведении мыши на SVG ничего не происходило? P.S. z-index проблему не решает.

class test {
    static central_button = document.querySelector(".cls2");

    static increaseButtonSize() {
        let animation = [{width:"400%"}];
        let timing = {
            duration: 200,
            fill: "forwards",
            easing: "linear",
        };
        test.central_button.animate(animation, timing);
    }

    static reduceButtonSize() {
        let animation = [{width:"100%"}];
        let timing = {
            duration: 200,
            fill: "forwards", 
            easing: "linear",
        };
        test.central_button.animate(animation, timing);
    }
}

document.addEventListener("DOMContentLoaded", function() {
    test.central_button.addEventListener("mouseover", test.increaseButtonSize);
    test.central_button.addEventListener("mouseout", test.reduceButtonSize);
})
div {
    display: flex;
    justify-content: start;
    background-color: #aaa;
    width: 400px;
}

button {
    width: 100%;
    min-width: 30px;
    background-color: #0000;
    border: none;
    min-height: 30px;
    font-size: 20px;
    padding: 10px;
}

.cls1 {
    background-color: #f00;
}

.cls2 {
    background-color: #0f0;
}

.cls3 {
    background-color: #00f;
}

svg {
    width: 30px;
    height: 30px;
    vertical-align: middle;
}
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <link rel="stylesheet" href="/src/css/test.css">
    </head>
    <body>
        <div>
            <button class="cls1">1</button>
            <button class="cls2">
                <svg class="tools-common__svg" viewBox="0 0 17 17">
                    <path d="M10.646 13.146l0.707 0.707-2.853 2.854-2.854-2.854 0.707-0.707 1.647 1.647v-3.772h1v3.772l1.646-1.647zM8 2.207v3.772h1v-3.772l1.646 1.646 0.707-0.707-2.853-2.853-2.854 2.853 0.707 0.707 1.647-1.646zM0 8v1h17v-1h-17z"/>
                </svg>
            </button>
            <button class="cls3">3</button>
        </div>
        <script type="module" src="/src/js/test.js"></script>
    </body>
</html>


Ответы (1 шт):

Автор решения: BlackStar1991

Я могу вам предложить чистый CSS... не очень понимаю зачем всё усложнять.

div {
  display: flex;
  justify-content: start;
  background-color: #aaa;
  width: 400px;
}

button {
  width: 100%;
  min-width: 30px;
  background-color: #0000;
  border: none;
  min-height: 30px;
  font-size: 20px;
  padding: 10px;
}

.cls1 {
  background-color: #f00;
}

.cls2 {
  background-color: #0f0;
}

.cls3 {
  background-color: #00f;
}

svg {
  width: 30px;
  height: 30px;
  vertical-align: middle;
}

.animation-effect {
  transition: width 0.2s linear;
}

.animation-effect:hover {
  width: 400%;
}
<div>
  <button class="cls1">1</button>
  <button class="cls2 animation-effect">
    <svg class="tools-common__svg" viewBox="0 0 17 17">
      <path
        d="M10.646 13.146l0.707 0.707-2.853 2.854-2.854-2.854 0.707-0.707 1.647 1.647v-3.772h1v3.772l1.646-1.647zM8 2.207v3.772h1v-3.772l1.646 1.646 0.707-0.707-2.853-2.853-2.854 2.853 0.707 0.707 1.647-1.646zM0 8v1h17v-1h-17z"
      />
    </svg>
  </button>
  <button class="cls3">3</button>
</div>

Если же вам принципиально нужен JS. То проблема анимации проиходит когда курсор заходит на <svg> внутри кнопки, браузер считает, что mouseout с кнопки произошёл и тут же mouseover снова — это создаёт дерганье анимации, потому что анимация запускается заново. И вам следует заменить события на

test.central_button.addEventListener("mouseenter", test.increaseButtonSize); test.central_button.addEventListener("mouseleave", test.reduceButtonSize);

Должно помочь... Хотя, это выглядит странно.

→ Ссылка