Jak tworzyć przerywane okręgi o jednolitych odstępach?

16

Chciałem zrobić kropkowany okrąg za pomocą CSS i utworzyłem go w następujący sposób.

Chociaż ten proces może wyświetlać przerywany okrąg, przerwa między końcem a początkiem przerywanej linii stała się wąska, a odstęp nie był jednolity.

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

Czy istnieje sposób na ujednolicenie odstępu? czy możemy również kontrolować odstęp między kreskami?

Jeśli nie jest to możliwe tylko w CSS, rozważamy użycie JavaScript lub czegoś podobnego.

Temani Afif
źródło
4
Jeśli chodzi o jego wartość, wydaje się, że tylko Chrome (i klony, jak sądzę) ma problemy z twoim kodem.
Álvaro González
3
Tak. Wygląda dobrze dla mnie
Strawberry

Odpowiedzi:

14

Oto zoptymalizowana wersja conic-gradient()rozwiązania, w której możesz łatwo kontrolować liczbę myślników i odstęp między nimi

Aby mieć pełną przejrzystość, którą rozważamy mask

CSS przerywany okrąg z jednolitą przestrzenią

Aby było zabawnie , możemy nawet rozważyć bardziej złożone zabarwienie kresek:

Przezroczyste myślniki CSS ze stożkowym gradientem i maską

Na pewno możesz chcieć mieć trochę zawartości, więc lepiej zastosuj maskę / tło do pseudoelementu, aby uniknąć maskowania zawartości:


Podobne pytanie, aby uzyskać więcej pomysłów CSS, aby osiągnąć podobny wynik: Tylko wykres kołowy CSS - Jak dodać odstępy / wypełnienia między plasterkami? . Znajdziesz więcej obsługiwanych sposobów niż conic-gradient()(w rzeczywistości nie działa w przeglądarce Firefox), ale musisz użyć dużo kodu, w przeciwieństwie do powyższego rozwiązania, w którym potrzebny jest tylko jeden element.


Korzystając z SVG, będziesz potrzebować również obliczeń, aby upewnić się, że masz jednolite odstępy:

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>

Dzięki zmiennym CSS możemy to ułatwić, ale nie jest obsługiwane we wszystkich przeglądarkach (w rzeczywistości nie działa w przeglądarce Firefox)

Jednolite kreski przestrzeni SVG

Możemy również łatwo użyć SVG jako tła, aby uczynić rzeczy bardziej elastycznymi:

W przypadku użycia jako tła należy ręcznie ustawić wartość, aby za każdym razem było potrzebne inne tło. Możemy jedynie ułatwić zmianę koloru za pomocą SVG jako maski;

Ramka przerywana SVG z jednolitą przestrzenią

Temani Afif
źródło
1
Chociaż są to interesujące sposoby, aby to dobrze wyglądać w Chrome, tylko pierwsza, podstawowa wersja SVG działa w przeglądarce Firefox. W szczególności Firefox (nawet wersja Nightly) nie obsługuje conic-gradient()lub repeating-conic-gradient(). W przyszłości może to być realne podejście, ale w tej chwili nie można z niego korzystać, jeśli pożądana jest funkcjonalność przeglądarki.
Makyen
1
Biorąc pod uwagę, że kod pytania działa poprawnie w Firefoksie (tzn. Ich stwierdzony problem nie istnieje w Firefoksie), ale działa w Chrome, prawdopodobnie dobrym pomysłem byłoby zbadanie różnic między przynajmniej Chrome (+ klonami) a Firefoksem, jednocześnie udostępniając kod działający w obu przypadkach (lub przynajmniej wyraźnie określ, czego można teraz użyć , obsługując różne przeglądarki).
Makyen
@Makyen, podczas gdy kod OP działa poprawnie w Firefoksie, staram się skupić na kontroli części luki, ponieważ z podstawową ramką nie możemy kontrolować luk. Dodam też część dotyczącą koloryzacji. Staram się, aby była to ogólna odpowiedź. Jeśli chodzi o gradient, tak Firefox nie obsługuje, ale jestem pewien, że wkrótce nadejdzie (wciąż jestem zaskoczony, że się spóźniają, Chrome obsługuje to od prawie dwóch lat). Połączyłem się z innym pytaniem, aby uzyskać więcej obsługiwanych sposobów, ale nie było to zbyt wyraźne. Zaktualizuje to.
Temani Afif
3

Używaj stroke-dasharrayz 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>

Lub możesz użyć radial-gradient(), repeating-conic-gradient()funkcje bez Firefoksa.

.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>

sanriot
źródło
3
conic-gradientz jakiegoś powodu staje się postrzępiony ...
sanriot