Вы можете попробовать использовать mask
и немного изменить код для лучшего контроля. Хитрость заключается в использовании нескольких масок, где каждая из них будет круговым градиентом, который будет отображать только границу, и каждый градиент будет перекрывать каждый элемент круга. Вы можете контролировать перекрытие с помощью поля на центральном элементе:
.circle {
width: 100px;
height: 100px;
border-radius: 50%;
border: 2px solid black;
transition:0.5s;
}
.box {
display:inline-flex;
-webkit-mask:
radial-gradient(50px at 52px 50%,transparent 99%,#fff 100%),
radial-gradient(50px at 50% 50%,transparent 99%,#fff 100%),
radial-gradient(50px at calc(100% - 52px) 50%,transparent 99%,#fff 100%);
mask:
radial-gradient(50px at 52px 50%,transparent 99%,#fff 100%),
radial-gradient(50px at 50% 50%,transparent 99%,#fff 100%),
radial-gradient(50px at calc(100% - 52px) 50%,transparent 99%,#fff 100%);
-webkit-mask-composite: source-in;
mask-composite: intersect;
}
body {
background:linear-gradient(to right,pink,yellow);
}
/* You can also have animation*/
.box:hover .circle{
margin:0!important;
}
<div class="box">
<div class="circle"></div>
<div class="circle" style="margin:0 -50px;"></div>
<div class="circle"></div>
</div>
<br>
<div class="box">
<div class="circle"></div>
<div class="circle" style="margin:0 -30px;"></div>
<div class="circle"></div>
</div>
<br>
<div class="box">
<div class="circle"></div>
<div class="circle" style="margin:0 -70px;"></div>
<div class="circle"></div>
</div>
<br>
<div class="box">
<div class="circle"></div>
<div class="circle" style="margin:0 -10px;"></div>
<div class="circle"></div>
</div>
И с CSS переменными для лучшего контроля:
.circle {
width: calc(2*var(--r));
height: calc(2*var(--r));
border-radius: 50%;
border: var(--b) solid black;
}
.box {
--r:50px; /* radius of circles*/
--b:2px; /* border length */
--g:transparent 99%,#fff 100%;
display:inline-flex;
-webkit-mask:
radial-gradient(var(--r) at calc(var(--r) + var(--b)) 50%,var(--g)),
radial-gradient(var(--r) at 50% 50%,var(--g)),
radial-gradient(var(--r) at calc(100% - var(--r) - var(--b)) 50%,var(--g));
mask:
radial-gradient(var(--r) at calc(var(--r) + var(--b)) 50%,var(--g)),
radial-gradient(var(--r) at 50% 50%,var(--g)),
radial-gradient(var(--r) at calc(100% - var(--r) - var(--b)) 50%,var(--g));
-webkit-mask-composite: source-in;
mask-composite: intersect;
}
body {
background:linear-gradient(to right,pink,yellow);
}
<div class="box">
<div class="circle"></div>
<div class="circle" style="margin:0 -50px;"></div>
<div class="circle"></div>
</div>
<br>
<div class="box" style="--r:40px;--b:5px;">
<div class="circle"></div>
<div class="circle" style="margin:0 -30px;"></div>
<div class="circle"></div>
</div>
<br>
<div class="box" style="--r:100px;--b:20px;">
<div class="circle"></div>
<div class="circle" style="margin:0 -70px;"></div>
<div class="circle"></div>
</div>
<br>
<div class="box" style="--r:80px;--b:5px;">
<div class="circle"></div>
<div class="circle" style="margin:0 -10px;"></div>
<div class="circle"></div>
</div>