Пример, который вы приводите в комментарии, некорректен, так как он использует div внутри элемента SVG.
Далее следует мой пример.Это элемент svg, который будет принимать ширину родительского элемента.Если вы предпочитаете, вы можете дать svg фиксированную ширину.
Анимация занимает 3 секунды, но вы можете изменить ее на нужную, изменив значение на --t
Я использую hsl
цветов и меняю яркость наизмените цвет.
Я надеюсь, что это то, что вы спрашивали.
body{--t:3s}/*time*/
rect{stroke:hsl(254,57%,55%);}
svg{background:hsl(254,57%,95%);
transition:all var(--t) ease;
font-family:Arial;
}
text{text-anchor:middle;
pointer-events:none;
fill:hsl(254,57%,45%);
transition:all var(--t) ease-in-out;
}
.shape{
fill:none;
stroke:hsl(254,57%,45%);
stroke-dasharray:95px;
stroke-dashoffset:95px;
transition:all var(--t) ease;
}
/*HOVER*/
svg:hover{background:hsl(254,57%,55%)}
svg:hover .shape{
stroke:hsl(254,57%,75%);
stroke-dasharray:380px;
stroke-dashoffset:0px;
}
svg:hover text{fill:hsl(254,57%,95%)}
<a href="">
<svg viewBox="-5 -5 160 50" >
<rect height="40" width="150" fill="none" stroke-width=".5" />
<path class="shape" d="M60,0L150,0 150,40 0,40 0,0 60,0" />
<text x="75" y="25" >Button 1</text>
</svg></a>