Làm thế nào để tạo các vòng tròn nét đứt với khoảng cách đồng đều?


16

Tôi muốn tạo một vòng tròn chấm bằng CSS và tạo nó với quy trình sau.

Mặc dù vòng tròn nét đứt có thể được hiển thị theo quy trình này, Khoảng cách giữa điểm cuối và điểm bắt đầu của đường đứt nét trở nên hẹp và khoảng cách không đồng nhất.

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

Có cách nào để làm cho khoảng cách đồng nhất? chúng ta cũng có thể kiểm soát khoảng cách giữa các dấu gạch ngang?

Nếu không thể với CSS một mình, chúng tôi đang xem xét sử dụng JavaScript hoặc một cái gì đó tương tự.


4
Đối với những gì nó có giá trị, chỉ Chrome (và bản sao, tôi đoán) dường như có vấn đề với mã của bạn.
Álvaro González

3
Vâng. Có vẻ tốt với tôi
Dâu tây

Câu trả lời:


14

Dưới đây là phiên bản tối ưu hóa của conic-gradient()giải pháp, nơi bạn có thể dễ dàng kiểm soát số lượng dấu gạch ngang và khoảng cách giữa

Để có sự minh bạch đầy đủ, chúng tôi xem xét mask

CSS nét tròn với không gian đồng nhất

Để làm cho mọi thứ hài hước, chúng ta thậm chí có thể xem xét một màu sắc phức tạp hơn cho dấu gạch ngang:

Dấu gạch ngang CSS trong suốt với conic-gradient và mặt nạ

Bạn có thể chắc chắn muốn một số nội dung bên trong để áp dụng tốt hơn mặt nạ / nền trên phần tử giả để tránh che giấu nội dung:


Câu hỏi liên quan để có thêm ý tưởng CSS để đạt được kết quả tương tự: Biểu đồ chỉ có CSS ​​- Làm thế nào để thêm khoảng cách / phần đệm giữa các lát? . Bạn sẽ tìm thấy nhiều cách được hỗ trợ hơn conic-gradient()(thực tế nó không hoạt động trên Firefox) nhưng bạn được yêu cầu sử dụng nhiều mã không giống như giải pháp trên, nơi chỉ cần một yếu tố.


Sử dụng SVG, bạn cũng sẽ cần một số tính toán để đảm bảo bạn có khoảng cách đồng đều:

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>

Với các biến CSS, chúng tôi có thể làm cho nó dễ dàng hơn nhưng nó không được hỗ trợ trong tất cả các trình duyệt (thực tế nó không hoạt động trong Firefox)

SVG dấu gạch ngang không gian

Chúng ta cũng có thể dễ dàng sử dụng SVG làm nền để làm cho mọi thứ linh hoạt hơn:

Khi được sử dụng làm nền, bạn cần đặt thủ công giá trị để bạn sẽ cần một nền khác nhau mỗi lần. Chúng ta chỉ có thể làm cho màu sắc dễ thay đổi bằng cách sử dụng SVG làm mặt nạ;

Đường viền nét đứt SVG với không gian đồng nhất


1
Mặc dù đây là những cách thú vị để làm điều này trông đẹp mắt trong Chrome, nhưng chỉ có các chức năng phiên bản SVG cơ bản đầu tiên của bạn trong Firefox. Đáng chú ý, Firefox (ngay cả phiên bản Nightly) không hỗ trợ conic-gradient()hoặc repeating-conic-gradient(). Vì vậy, đây có thể là một cách tiếp cận khả thi trong tương lai, nhưng nó không phải là thứ có thể sử dụng vào lúc này, nếu chức năng trình duyệt chéo là mong muốn.
Makyen

1
Cho rằng câu hỏi Mã OP hoạt động chính xác trong Firefox (nghĩa là vấn đề đã nêu của họ không tồn tại trong Firefox), nhưng trong Chrome, có lẽ nên tìm hiểu sự khác biệt giữa ít nhất là Chrome (+ nhái) và Firefox, trong khi cung cấp mã có chức năng ở cả hai (hoặc ít nhất là nêu rõ những gì có thể được sử dụng bây giờ có hỗ trợ trình duyệt chéo).
Makyen

@Makyen trong khi mã OP hoạt động tốt trong Firefox, tôi đang cố gắng tập trung vào phần điều khiển khoảng trống vì với đường viền cơ bản, chúng ta không thể kiểm soát các khoảng trống. Tôi cũng đang thêm phần tô màu. Tôi đang cố gắng để làm cho nó một câu trả lời chung chung. Liên quan đến độ dốc, vâng, Firefox thiếu hỗ trợ nhưng tôi khá chắc chắn rằng nó sẽ đến sớm (tôi vẫn ngạc nhiên khi họ đến muộn, Chrome đã hỗ trợ việc này từ gần hai năm). Tôi đã liên kết với một câu hỏi khác để biết nhiều cách hỗ trợ hơn nhưng nó không rõ ràng lắm. Sẽ cập nhật nó.
Temani Afif

3

Sử dụng stroke-dasharrayvới 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>

Hoặc bạn có thể sử dụng radial-gradient(), các repeating-conic-gradient()chức năng mà không cần 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-gradienttrở nên
lởm chởm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.