Düzgün aralıklı kesikli daireler nasıl oluşturulur?


16

CSS ile noktalı bir daire yapmak istedim ve aşağıdaki işlemle oluşturdum.

Kesikli daire bu işlemle görüntülenebilse de, kesikli çizginin sonu ile başlangıcı arasındaki boşluk daraldı ve boşluk eşit değildi.

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

Boşluğu üniform hale getirmenin bir yolu var mı? çizgiler arasındaki boşluğu da kontrol edebilir miyiz?

Bu yalnızca CSS ile mümkün değilse, JavaScript veya benzeri bir şey kullanmayı düşünüyoruz.


4
Değeri için, sadece Chrome (ve klonlar, sanırım) kodunuzla ilgili sorunlar var gibi görünüyor.
Álvaro González

3
Evet. Bana iyi görünüyor
Çilek

Yanıtlar:


14

Burada, conic-gradient()çizgi sayısını ve aralarındaki boşluğu kolayca kontrol edebileceğiniz çözümün optimize edilmiş bir versiyonu

Tam şeffaflığa sahip olmak için mask

Eşit boşluklu CSS kesikli daire

İşleri eğlenceli hale getirmek için çizgi için daha karmaşık bir renklendirme bile düşünebiliriz:

Konik gradyanlı ve maskeli şeffaf CSS tire

İçeriden bazı içeriklerin olmasını istediğinizden emin olabilirsiniz, bu nedenle içeriği maskelemek için maskeyi / arka planı sahte bir öğeye daha iyi uygulayın:


İlgili soru benzer bir sonuç elde etmek için daha fazla CSS fikirleri almak için: Sadece CSS Pasta Grafik - dilimleri arasında boşluk / dolgu nasıl eklenir? . Daha fazla desteklenen yollar bulacaksınız conic-gradient()(aslında Firefox'ta işe yaramaz), ancak yalnızca bir öğenin gerekli olduğu yukarıdaki çözümün aksine çok fazla kod kullanmanız gerekir.


SVG'yi kullanarak, aynı aralıkta olduğunuzdan emin olmak için bazı hesaplamalara ihtiyacınız olacaktır:

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 değişkenleri ile bunu kolaylaştırabiliriz ancak tüm tarayıcılarda desteklenmez (aslında Firefox'ta çalışmaz)

SVG düzgün uzay çizgileri

İşleri daha esnek hale getirmek için SVG'yi arka plan olarak da kolayca kullanabiliriz:

Arka plan olarak kullanıldığında, değeri her seferinde farklı bir arka plana ihtiyacınız olacak şekilde manuel olarak ayarlamanız gerekir. SVG'yi maske olarak kullanarak rengi kolayca değiştirebiliriz;

Düzgün boşluklu SVG kesik kenarlık


1
Bunlar Chrome'da iyi görünmek için ilginç yollar olsa da, Firefox'ta yalnızca ilk temel SVG sürüm işlevleriniz. Özellikle, Firefox (Nightly sürümü bile) conic-gradient()veya repeating-conic-gradient(). Dolayısıyla, bunlar gelecekte uygulanabilir bir yaklaşım olabilir, ancak çapraz tarayıcı işlevselliği isteniyorsa, şu anda kullanılabilecek bir şey değildir.
Makyen

1
OP sorusunun Firefox'ta (yani belirtilen sorunlarının Firefox'ta mevcut olmadığı), ancak Chrome'da doğru çalıştığı göz önüne alındığında, muhtemelen en azından Chrome (+ klonları) ve Firefox arasındaki farkları keşfetmek iyi bir fikir olacaktır, (ya da en azından açıkça kullanılabilir neler devlet hem de işlevsel olduğunu kodunu sağlarken şimdi çapraz tarayıcı desteği olmadığını).
Makyen

@Makyen, Firefox'ta OP kodu iyi çalışırken , boşluk kısmını kontrol etmeye odaklanmaya çalışıyorum çünkü temel bir sınırla boşlukları kontrol edemiyoruz. Ayrıca renklendirme kısmını da ekliyorum. Genel bir cevap vermeye çalışıyorum. Gradyan ile ilgili olarak, evet Firefox destek eksikliği ama yakında geleceğinden eminim (hala geç kaldıklarına şaşırıyorum, Chrome bunu neredeyse iki yıldan beri destekliyordu). Daha desteklenen yollar için başka bir soruya bağlandım, ancak çok açık değildi. Güncelleyecek.
Temani Afif

3

stroke-dasharraySVG ile kullanın .

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>

Yoksa kullanabilirsiniz radial-gradient(), repeating-conic-gradient()Firefox olmadan işlevlerini.

.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-gradientnedense
serseri
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.