Это мое решение, но я не использую calc
. Мне не нужно Я использую пути вместо линий, и я использую переход для анимации stroke-dashoffset
от 0 до двойной длины строки. Значение stroke-dasharray
равно длине пути.
ОБНОВИТЬ
Во втором SVG я использую строки, как вы и предполагали
.box{width:30%; border:1px solid red; position:relative; display:inline-block;}
.box p{position:absolute;width:100%;height:1em;text-align:center;margin:auto;top:0;bottom:0;}
.box:hover .top, .box:hover .bottom{stroke-dashoffset:200}
.box:hover .left, .box:hover .right{stroke-dashoffset:200}
path,line{stroke:black; fill:none;stroke-linecap: round;}
.top,.bottom{stroke-dasharray:100;stroke-dashoffset:0;}
.left,.right{stroke-dasharray:50;stroke-dashoffset:0}
path,line{transition: stroke-dashoffset 1.5s;}
<div class="box"><p>PATHS</p>
<svg viewBox="-5 -5 110 60">
<path class="top" d="M100,0H0" />
<path class="left" d="M0,0V50"/>
<path class="bottom" d="M0,50H100"/>
<path class="right" d="M100,50V0"/>
</svg>
</div>
<div class="box"><p>LINES</p>
<svg viewBox="-5 -5 110 60">
<line class="top" x1="100" />
<line class="left" y2="50"/>
<line class="bottom" y1="50" x2="100" y2="50"/>
<line class="right" x1="100" y1="50" x2="100"/>
</svg>
</div>