Come creare cerchi tratteggiati con spaziatura uniforme?


16

Volevo creare un cerchio tratteggiato con CSS e crearlo con il seguente processo.

Sebbene il cerchio tratteggiato possa essere visualizzato con questo processo, il divario tra la fine e l'inizio della linea tratteggiata si è ridotto e il divario non era uniforme.

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

C'è un modo per rendere uniforme il divario? possiamo anche controllare il divario tra i trattini?

Se ciò non è possibile solo con i CSS, stiamo considerando l'utilizzo di JavaScript o qualcosa di simile.


4
Per quello che vale, solo Chrome (e i cloni, immagino) sembra avere problemi con il tuo codice.
Álvaro González

3
Sì. Mi sembra buono
Strawberry

Risposte:


14

Ecco una versione ottimizzata della conic-gradient()soluzione in cui è possibile controllare facilmente il numero di trattini e lo spazio tra

Per avere piena trasparenza, consideriamo mask

Cerchio tratteggiato CSS con spazio uniforme

Per rendere le cose divertenti possiamo anche considerare una colorazione più complessa ai trattini:

Tratteggi CSS trasparenti con gradiente conico e maschera

Potresti sicuramente desiderare un po 'di contenuto all'interno, quindi applica meglio la maschera / sfondo su uno pseudo elemento per evitare di mascherare il contenuto:


Domanda correlata per ottenere più idee CSS per ottenere un risultato simile: Solo grafico a torta CSS - Come aggiungere spaziatura / riempimento tra le sezioni? . Troverai più modi supportati rispetto a conic-gradient()(in realtà non funziona su Firefox) ma ti viene richiesto di usare molto codice a differenza della soluzione sopra in cui è necessario un solo elemento.


Usando SVG avrai anche bisogno di alcuni calcoli per assicurarti di avere una spaziatura uniforme:

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>

Con le variabili CSS possiamo renderlo più semplice ma non è supportato in tutto il browser (in realtà non funziona in Firefox)

Tratteggi spaziali uniformi SVG

Possiamo anche usare facilmente SVG come sfondo per rendere le cose più flessibili:

Se utilizzato come sfondo, è necessario impostare manualmente il valore in modo da avere sempre bisogno di uno sfondo diverso. Possiamo solo cambiare facilmente il colore usando SVG come maschera;

Bordo tratteggiato SVG con spazio uniforme


1
Mentre questi sono modi interessanti per farlo che sembrano belli in Chrome, solo la tua prima versione SVG di base funziona in Firefox. In particolare, Firefox (anche la versione notturna) non supporta conic-gradient()o repeating-conic-gradient(). Quindi, questi potrebbero essere un approccio praticabile in futuro, ma non è qualcosa che può essere utilizzato al momento, se si desidera la funzionalità cross-browser.
Makyen

1
Dato che la domanda del codice OP funziona correttamente in Firefox (ovvero il problema dichiarato non esiste in Firefox), ma in Chrome, probabilmente sarebbe una buona idea esplorare le differenze tra almeno Chrome (+ cloni) e Firefox, fornendo allo stesso tempo un codice funzionante in entrambi (o almeno esplicitamente indicare cosa può essere utilizzato ora con supporto cross-browser).
Makyen

@Makyen mentre il codice OP funziona bene in Firefox, sto cercando di concentrarmi sul controllo della parte gap perché con un bordo di base non possiamo controllare le lacune. Sto anche aggiungendo la parte colorazione. Sto cercando di renderlo una risposta generica. Per quanto riguarda il gradiente, sì, Firefox non ha il supporto, ma sono abbastanza sicuro che arriverà presto (sono ancora sorpreso che siano in ritardo, Chrome lo supporta da quasi due anni). Ho collegato a un'altra domanda per modi più supportati, ma non era molto esplicito. Lo aggiornerà.
Temani Afif

3

Utilizzare stroke-dasharraycon 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>

Oppure è possibile utilizzare radial-gradient(), repeating-conic-gradient()funzioni senza 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-gradientdiventa nervoso per qualche motivo ...
sanriot
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.