¿Cómo crear círculos discontinuos con espaciado uniforme?

16

Quería hacer un círculo punteado con CSS y lo creé con el siguiente proceso.

Aunque el círculo punteado podría mostrarse mediante este proceso, el espacio entre el final y el comienzo de la línea punteada se volvió estrecho y el espacio no fue uniforme.

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

¿Hay alguna manera de hacer que la brecha sea uniforme? ¿podemos controlar también la brecha entre guiones?

Si eso no es posible solo con CSS, estamos considerando usar JavaScript o algo similar.

Temani Afif
fuente
44
Por lo que vale, solo Chrome (y clones, supongo) parece tener problemas con su código.
Álvaro González
3
Sí. Me parece bien
Fresa

Respuestas:

14

Aquí hay una versión optimizada de la conic-gradient()solución donde puede controlar fácilmente la cantidad de guiones y el espacio entre

Para tener total transparencia consideramos mask

Círculo discontinuo CSS con espacio uniforme

Para hacer las cosas divertidas , incluso podemos considerar una coloración más compleja en los guiones:

Guiones CSS transparentes con gradiente cónico y máscara

Seguramente querrás algo de contenido dentro, así que mejor aplica la máscara / fondo en un pseudo elemento para evitar enmascarar el contenido:


Pregunta relacionada para obtener más ideas de CSS para lograr un resultado similar: Gráfico de sectores de CSS solamente: ¿cómo agregar espaciado / relleno entre sectores? . Encontrará más formas compatibles que conic-gradient()(en realidad no funciona en Firefox), pero debe usar mucho código, a diferencia de la solución anterior, donde solo se necesita un elemento.


Usando SVG también necesitará algunos cálculos para asegurarse de tener un espaciado 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 las variables CSS podemos facilitarlo, pero no es compatible con todos los navegadores (en realidad no funciona en Firefox)

SVG guiones espaciales uniformes

También podemos usar fácilmente el SVG como fondo para hacer las cosas más flexibles:

Cuando se usa como fondo, debe establecer manualmente el valor para que necesite un fondo diferente cada vez. Solo podemos hacer que el color sea fácil de cambiar usando SVG como máscara;

SVG borde discontinuo con espacio uniforme

Temani Afif
fuente
1
Si bien estas son formas interesantes de hacer esto que se ven bien en Chrome, solo su primera versión básica de SVG funciona en Firefox. Cabe destacar que Firefox (incluso la versión Nightly) no es compatible conic-gradient()o no repeating-conic-gradient(). Por lo tanto, estos podrían ser un enfoque viable en el futuro, pero no es algo que pueda usarse en este momento, si se desea la funcionalidad de navegador cruzado.
Makyen
1
Dado que la pregunta del código de OP funciona correctamente en Firefox (es decir, su problema declarado no existe en Firefox), pero sí en Chrome, probablemente sería una buena idea explorar las diferencias entre al menos Chrome (+ clones) y Firefox, mientras proporciona código que es funcional en ambos (o al menos explícitamente, qué se puede usar ahora que tiene soporte para navegadores cruzados).
Makyen
@Makyen, mientras que el código OP funciona bien en Firefox, estoy tratando de centrarme en el control de la parte de la brecha porque con un borde básico no podemos controlar las brechas. También estoy agregando la parte de coloración también. Estoy tratando de que sea una respuesta genérica. Con respecto al gradiente, sí, Firefox carece de soporte, pero estoy bastante seguro de que llegará pronto (todavía estoy sorprendido de que lleguen tarde a esto, Chrome lo ha estado apoyando desde hace casi dos años). Me vinculé a otra pregunta para obtener formas más compatibles, pero no fue muy explícita. Lo actualizaré.
Temani Afif
3

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

O puede usar radial-gradient(), repeating-conic-gradient()funciones sin 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
fuente
3
conic-gradientse vuelve irregular por alguna razón ...
sanriot