균일 한 간격으로 점선 원을 만드는 방법은 무엇입니까?


16

CSS로 점선을 만들고 싶었고 다음 프로세스로 만들었습니다.

이 프로세스에 의해 점선 원이 표시 될 수 있지만, 점선의 끝과 시작 사이의 간격이 좁아지고 간격이 균일하지 않았다.

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

간격을 균일하게 만드는 방법이 있습니까? 대시 사이의 간격을 제어 할 수 있습니까?

CSS만으로는 가능하지 않은 경우 JavaScript 또는 이와 유사한 것을 사용하는 것을 고려하고 있습니다.


4
가치있는 것은 Chrome (및 복제본 만)에 코드에 문제가있는 것 같습니다.
Álvaro González

3
네. 나에게 좋아 보인다
딸기

답변:


14

다음은 conic-gradient()대시 수와 간격 사이를 쉽게 제어 할 수 있는 최적화 된 솔루션 버전입니다.

우리는 완전한 투명성을 갖기 위해 mask

공간이 균일 한 CSS 점선 원

일을 재미있게 만들기 위해 대시에 더 복잡한 채색을 고려할 수도 있습니다.

원추형 그라데이션과 마스크가있는 투명한 CSS 대시

내용을 숨기지 않기 위해 의사 컨텐츠에 마스크 / 배경을 더 잘 적용하려면 내용이 일부 포함될 수 있습니다.


비슷한 결과를 얻기 위해 더 많은 CSS 아이디어를 얻는 관련 질문 : CSS Only Pie Chart-조각 사이에 간격 / 패딩을 추가하는 방법은 무엇입니까? . conic-gradient()(실제로 Firefox에서는 작동하지 않음) 보다 더 많은 지원되는 방법을 찾을 수 있지만 하나의 요소 만 필요한 위의 솔루션과 달리 많은 코드를 사용해야합니다.


SVG를 사용하면 일정한 간격을 유지하기 위해 계산이 필요합니다.

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 변수를 사용하면 쉽게 만들 수 있지만 모든 브라우저에서 지원되는 것은 아닙니다 (실제로는 Firefox에서는 작동하지 않습니다)

SVG 균일 공간 대시

SVG를 배경으로 쉽게 사용하여 더 유연하게 만들 수 있습니다.

배경으로 사용하는 경우 매번 다른 배경이 필요하도록 값을 수동으로 설정해야합니다. SVG를 마스크로 사용하여 색상을 쉽게 변경할 수 있습니다.

공간이 균일 한 SVG 점선 테두리


1
이것들은 Chrome에서 잘 보이게하는 흥미로운 방법이지만 Firefox의 첫 번째 기본 SVG 버전 기능입니다. 특히 Firefox (야간 버전도)는 conic-gradient()또는을 지원하지 않습니다 repeating-conic-gradient(). 따라서이 방법은 향후 실행 가능한 방법 일 수 있지만, 브라우저 간 기능이 필요한 경우 현재 사용할 수있는 방법이 아닙니다.
Makyen

1
OP 코드가 Firefox에서 올바르게 작동한다는 것 (즉, 명시된 문제는 Firefox에는 존재하지 않음)이지만 Chrome에서는 문제가된다면 최소한 Chrome (+ 클론)과 Firefox의 차이점을 살펴 보는 것이 좋습니다. 두 기능 모두에서 작동하는 코드를 제공하면서 (또는 브라우저 간 지원이 가능한 지금 사용할 수있는 것을 명시 적으로 명시해야 함 ).
Makyen

@Makyen은 Firefox에서 OP 코드가 잘 작동하는 동안 기본 경계를 사용하여 간격을 제어 할 수 없기 때문에 간격 부분을 제어 하는 데 집중하려고합니다 . 나는 또한 착색 부분을 추가하고 있습니다. 나는 일반적인 대답을하려고합니다. 그라디언트와 관련하여 예, Firefox에는 지원이 부족하지만 곧 출시 될 것이라고 확신합니다 (아직도 늦어 Chrome이 거의 2 년 동안 지원하고 있음). 더 많은 지원되는 방법에 대한 다른 질문에 연결했지만 그다지 명시 적이지는 않았습니다. 업데이트합니다.
Temani Afif

3

stroke-dasharraySVG와 함께 사용하십시오 .

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>

또는 Firefox없이 radial-gradient(), repeating-conic-gradient()기능을 사용할 수 있습니다 .

.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-gradient어떤 이유로 든
재규어
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.