Як створити пунктирні кола з рівномірним проміжком?


16

Я хотів зробити пунктирне коло з CSS і створив його наступним процесом.

Хоча за допомогою цього процесу можна було відобразити пунктирне коло, проміжок між кінцем і початком пунктирної лінії став вузьким, а проміжок не був рівномірним.

.c {
  width: 500px;
  height: 500px;
  border-width: 15px;
  border-style: dashed;
  border-radius: 600px;
}
<div class="c"></div>

Чи є спосіб зробити проміжок рівномірним? чи можемо ми також контролювати розрив між тире?

Якщо це неможливо лише з CSS, ми розглядаємо можливість використання JavaScript або чогось подібного.


4
Оскільки це варте, лише Chrome (і клони, я думаю) мають проблеми з вашим кодом.
Альваро Гонсалес

3
Так. Мені добре виглядає
Полуниця

Відповіді:


14

Ось оптимізована версія conic-gradient()рішення, де ви можете легко контролювати кількість тире та пробіл між ними

Ми маємо на увазі повну прозорість mask

CSS пунктирне коло з рівномірним пробілом

Щоб зробити речі смішними, ми можемо розглянути навіть більш складне забарвлення дефісів:

Прозорі тире CSS з конічним градієнтом та маскою

Напевно ви хочете, щоб якийсь вміст всередині був таким, що краще застосувати маску / фон на псевдоелементі, щоб уникнути маскування вмісту:


Пов’язане запитання, щоб отримати більше ідей CSS для досягнення подібного результату: лише кругова діаграма CSS - як додати інтервал / прокладку між фрагментами? . Ви знайдете більш підтримувані способи, ніж conic-gradient()(насправді це не працює на Firefox), але вам потрібно використовувати багато коду на відміну від вищезазначеного рішення, де потрібен лише один елемент.


Використовуючи SVG, вам також знадобиться деякий розрахунок, щоб переконатися, що ви маєте рівномірний інтервал:

svg {
  width:200px;
}
<svg viewBox="-3 -3 106 106">
  <!-- 
    The circumference of the circle is 2*PI*R ~ 314.16
    if we want N dashed we use d=314.16/N
    For N = 20 we have d=15.71
    For a gap of 5 we will have "10.71,5" (d - gap,gap)
  -->
  <circle cx="50" cy="50" r="50" 
    stroke-dasharray="10.71, 5" 
    fill="transparent" 
    stroke="black" 
    stroke-width="5" />
</svg>

За допомогою змінних CSS ми можемо зробити це простіше, але він підтримується не у всіх браузерах (насправді він не працює у Firefox)

SVG рівномірні космічні тире

Ми також можемо легко використовувати SVG як фон, щоб зробити речі більш гнучкими:

Якщо ви використовуєте як фон, вам потрібно вручну встановити значення, тож вам буде потрібно кожен раз інший фон. Ми можемо зробити колір легко змінити, використовуючи SVG як маску;

SVG пунктирною межею з рівномірним простором


1
Хоча це цікаві способи зробити це, щоб добре виглядати в Chrome, лише перші ваші основні функції SVG-версії у Firefox. Зокрема, Firefox (навіть нічна версія) не підтримує conic-gradient()або repeating-conic-gradient(). Отже, це може бути життєздатним підходом у майбутньому, але це не те, що можна використати на даний момент, якщо потрібна функція крос-браузера.
Макіен

1
Зважаючи на те, що код питання OP функціонує правильно у Firefox (тобто їх заявлена ​​проблема не існує у Firefox), але є в Chrome, можливо, було б корисно вивчити відмінності між принаймні Chrome (+ клонами) та Firefox, надаючи код, який функціонує в обох випадках (або принаймні чітко вказується, що можна використовувати зараз із підтримкою крос-браузера).
Макіен

@Makyen в той час, як код OP працює в Firefox, я намагаюся зосередити увагу на контрольній частині розриву, оскільки з базовою рамкою ми не можемо контролювати прогалини. Я також додаю частину забарвлення теж. Я намагаюся зробити це загальною відповіддю. Що стосується градієнта, так у Firefox не вистачає підтримки, але я впевнений, що вона незабаром (я все ще дивуюсь, що вони спізнюються на це, Chrome підтримує це майже два роки). Я зв’язав інше питання для більш підтримуваних способів, але це було не дуже явно. Буде оновлено.
Темані Афіф

3

Використовуйте stroke-dasharrayз SVG.

svg {
  width: 20vmax;
  height: 20vmax;
}
<svg viewBox="0 0 100 100">
  <circle cx="50" cy="50" r="48" stroke-dasharray="10, 4" fill="transparent" stroke="purple" stroke-width="5" />
</svg>

Або ви можете використовувати radial-gradient(), repeating-conic-gradient()функцію без Firefox.

.c {
  width: 20vmax;
  height: 20vmax;
  background-image: radial-gradient(#fff 68%, transparent 68% 70%, #fff 70%),
    repeating-conic-gradient(#000 0% 3%, transparent 3% 5%);
}
<div class="c"></div>


3
conic-gradientз якихось причин стає
скупим
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.