Bagaimana cara membuat lingkaran putus-putus dengan spasi seragam?

16

Saya ingin membuat lingkaran bertitik dengan CSS dan membuatnya dengan proses berikut.

Meskipun lingkaran putus-putus dapat ditampilkan oleh proses ini, Kesenjangan antara ujung dan awal garis putus-putus menjadi sempit, dan celah itu tidak seragam.

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

Apakah ada cara untuk membuat celah seragam? dapatkah kita juga mengontrol jarak antara garis putus-putus?

Jika itu tidak mungkin dengan CSS saja, kami sedang mempertimbangkan untuk menggunakan JavaScript atau yang serupa.

Temani Afif
sumber
4
Untuk apa nilainya, hanya Chrome (dan klon, saya kira) tampaknya memiliki masalah dengan kode Anda.
Álvaro González
3
Ya. Terlihat bagus untuk saya
Strawberry

Jawaban:

14

Berikut ini adalah versi optimal dari conic-gradient()solusi di mana Anda dapat dengan mudah mengontrol jumlah tanda hubung dan jarak di antaranya

Kami memiliki transparansi penuh mask

CSS putus-putus lingkaran dengan ruang seragam

Untuk membuat hal-hal lucu kita bahkan dapat mempertimbangkan warna yang lebih kompleks pada garis:

Garis CSS transparan dengan kerucut-kerucut dan topeng

Anda tentu ingin beberapa konten di dalamnya jadi lebih baik menerapkan mask / latar belakang pada elemen semu untuk menghindari menutupi konten:


Pertanyaan terkait untuk mendapatkan lebih banyak gagasan CSS untuk mencapai hasil yang serupa: Diagram Pie Hanya CSS - Bagaimana cara menambahkan spasi / padding antar irisan? . Anda akan menemukan lebih banyak cara yang didukung daripada conic-gradient()(sebenarnya itu tidak bekerja di Firefox) tetapi Anda diharuskan untuk menggunakan banyak kode tidak seperti solusi di atas di mana hanya satu elemen yang diperlukan.


Menggunakan SVG Anda juga perlu perhitungan untuk memastikan Anda memiliki spasi yang seragam:

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>

Dengan variabel CSS kita dapat membuatnya lebih mudah tetapi tidak didukung di semua browser (sebenarnya itu tidak berfungsi di Firefox)

Tanda garis ruang seragam SVG

Kami juga dapat dengan mudah menggunakan SVG sebagai latar belakang untuk membuat segalanya lebih fleksibel:

Ketika digunakan sebagai latar belakang, Anda perlu mengatur nilai secara manual sehingga Anda akan membutuhkan latar belakang yang berbeda setiap kali. Kami hanya bisa membuat warna mudah diubah dengan menggunakan SVG sebagai mask;

SVG menghancurkan perbatasan dengan ruang seragam

Temani Afif
sumber
1
Meskipun ini adalah cara menarik untuk melakukan ini, itu terlihat bagus di Chrome, hanya fungsi SVG versi pertama Anda di Firefox. Khususnya, Firefox (bahkan versi Nightly) tidak mendukung conic-gradient()atau repeating-conic-gradient(). Jadi, ini mungkin pendekatan yang layak di masa depan, tetapi itu bukan sesuatu yang dapat digunakan saat ini, jika fungsionalitas lintas-browser diinginkan.
Makyen
1
Mengingat bahwa kode OP berfungsi dengan benar di Firefox (yaitu masalah yang dinyatakan tidak ada di Firefox), tetapi tidak di Chrome, mungkin ide yang baik untuk mengeksplorasi perbedaan antara setidaknya Chrome (+ klon) dan Firefox, sambil memberikan kode yang berfungsi baik (atau setidaknya secara eksplisit menyatakan apa yang dapat digunakan sekarang yang memiliki dukungan lintas-browser).
Makyen
@Makyen sementara kode OP berfungsi dengan baik di Firefox, saya mencoba untuk fokus pada kontrol bagian celah karena dengan batas dasar kita tidak dapat mengontrol celah. Saya juga menambahkan bagian pewarnaan juga. Saya mencoba membuatnya menjadi jawaban umum. Mengenai gradien, ya Firefox kekurangan dukungan tetapi saya cukup yakin itu akan segera datang (saya masih terkejut mereka terlambat dalam hal ini, Chrome mendukung ini sejak hampir dua tahun). Saya ditautkan dengan pertanyaan lain untuk cara yang lebih didukung tetapi tidak terlalu eksplisit. Akan memperbaruinya.
Temani Afif
3

Gunakan stroke-dasharraydengan 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>

Atau Anda dapat menggunakan radial-gradient(), repeating-conic-gradient()fungsi tanpa 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>

sanriot
sumber
3
conic-gradientmenjadi jaggy karena beberapa alasan ...
sanriot