Вы можете рассчитывать на переполнение, если ширина элементов и поле превышают общую ширину.Из вашей фигуры мы имеем полукруг, переполняющийся слева и справа, таким образом, полный круг переполняется
С учетом этого общая ширина составляет 6*width_of_circle + total_margin
.Мы можем разделить это поле на 6 частей (между нашими 7 кругами), и у нас будет 6*width_of_circle + 6*small_margin
, поэтому каждое поле будет total_width/6 - width_of_circle
, которое мы разделим на каждой стороне:
#dot-container {
position: absolute;
width: 30vw;
background: black;
height: 8vw;
justify-content: center;
align-items: center;
display: flex;
margin:10px;
}
.dot {
border-radius: 100%;
width: 2vw;
height: 2vw;
margin: 0 calc((100%/6 - 2vw)/2);
background: green;
flex-shrink:0; /* Don't shrink*/
}
<div id="dot-container">
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>
Вы можете выразить все в процентах, если хотите:
#dot-container {
position: absolute;
width: 30vw;
background: black;
height: 8vw;
justify-content: center;
align-items: center;
display: flex;
margin:10px;
}
.dot {
border-radius: 100%;
width: calc(100%/15);
margin: 0 calc((100%/6 - 100%/15)/2);
background: green;
flex-shrink:0; /* Don't shrink*/
}
/* To keep the square ratio*/
.dot:before {
content:"";
display:block;
padding-top:100%;
}
<div id="dot-container">
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>
И мы можем добавить переменную CSS, чтобы легко контролировать ширину точек, сохраняя ту же конфигурацию и переполнение первого / последнего круга:
#dot-container {
width: 30vw;
background: black;
height: 8vw;
justify-content: center;
align-items: center;
display: flex;
margin:10px;
}
.dot {
border-radius: 100%;
width: calc(100%/var(--d));
margin: 0 calc((100%/6 - 100%/var(--d))/2);
background: green;
flex-shrink:0; /* Don't shrink*/
}
/* To keep the square ratio instead of setting height*/
.dot:before {
content:"";
display:block;
padding-top:100%;
}
<div id="dot-container" style="--d:10">
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>
<div id="dot-container" style="--d:8">
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>
<div id="dot-container" style="--d:20">
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>
Если вы будете добавлять / удалять точки, просто отрегулируйте значение 6
, которое представляет собой число точек минус один:
#dot-container {
width: 30vw;
background: black;
height: 8vw;
justify-content: center;
align-items: center;
display: flex;
margin:10px;
}
.dot {
border-radius: 100%;
width: calc(100%/var(--d));
margin: 0 calc((100%/(var(--n) - 1) - 100%/var(--d))/2);
background: green;
flex-shrink:0; /* Don't shrink*/
}
/* To keep the square ratio*/
.dot:before {
content:"";
display:block;
padding-top:100%;
}
<div id="dot-container" style="--d:10;--n:5">
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>
<div id="dot-container" style="--d:8;--n:7">
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>
<div id="dot-container" style="--d:20;--n:9">
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>
В качестве примечания, левый край первого элемента и правый край последнего элемента не обязательно должны быть равныРасчетное значение, так как они переполнены.Они просто должны быть одинаковыми, даже 0
:
равно 0
:
#dot-container {
width: 30vw;
background: black;
height: 8vw;
justify-content: center;
align-items: center;
display: flex;
margin:10px;
}
.dot {
border-radius: 100%;
width: calc(100%/var(--d));
margin: 0 calc((100%/(var(--n) - 1) - 100%/var(--d))/2);
background: green;
flex-shrink:0; /* Don't shrink*/
}
.dot:first-child {
margin-left:0;
}
.dot:last-child {
margin-right:0;
}
/* To keep the square ratio*/
.dot:before {
content:"";
display:block;
padding-top:100%;
}
<div id="dot-container" style="--d:10;--n:5">
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>
<div id="dot-container" style="--d:8;--n:7">
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>
<div id="dot-container" style="--d:20;--n:9">
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>
Равен случайному значению:
#dot-container {
width: 30vw;
background: black;
height: 8vw;
justify-content: center;
align-items: center;
display: flex;
margin:10px;
}
.dot {
border-radius: 100%;
width: calc(100%/var(--d));
margin: 0 calc((100%/(var(--n) - 1) - 100%/var(--d))/2);
background: green;
flex-shrink:0; /* Don't shrink*/
}
.dot:first-child {
margin-left:658624px;
}
.dot:last-child {
margin-right:658624px;
}
/* To keep the square ratio*/
.dot:before {
content:"";
display:block;
padding-top:100%;
}
<div id="dot-container" style="--d:10;--n:5">
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>
<div id="dot-container" style="--d:8;--n:7">
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>
<div id="dot-container" style="--d:20;--n:9">
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>