วิธีสร้างวงกลมที่มีระยะห่างสม่ำเสมอ?


16

ฉันต้องการสร้างวงกลมจุดด้วย CSS และสร้างด้วยกระบวนการต่อไปนี้

แม้ว่ากระบวนการนี้จะแสดงวงกลมประ แต่ช่องว่างระหว่างจุดสิ้นสุดและจุดเริ่มต้นของเส้นประนั้นแคบลงและช่องว่างไม่สม่ำเสมอ

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

มีวิธีทำชุดช่องว่างหรือไม่? เราสามารถควบคุมช่องว่างระหว่างเส้นประหรือไม่

หากไม่สามารถทำได้ด้วย CSS เพียงอย่างเดียวเรากำลังพิจารณาใช้ JavaScript หรือสิ่งที่คล้ายกัน


4
สำหรับสิ่งที่คุ้มค่ามีเพียง Chrome (และโคลนฉันเดา) ดูเหมือนว่าจะมีปัญหากับรหัสของคุณ
ÁlvaroGonzá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 เฉพาะรุ่น SVG พื้นฐานรุ่นแรกของคุณใน Firefox สะดุดตา, Firefox (แม้รุ่นต่อคืน) ไม่สนับสนุนหรือconic-gradient() repeating-conic-gradient()ดังนั้นสิ่งเหล่านี้อาจเป็นแนวทางที่มีศักยภาพในอนาคต แต่ก็ไม่ใช่สิ่งที่สามารถใช้งานได้ในขณะนี้หากต้องการฟังก์ชั่นข้ามเบราว์เซอร์
Makyen

1
เนื่องจากว่าคำถามของรหัส OP ทำงานได้อย่างถูกต้องใน Firefox (เช่นปัญหาที่ระบุไว้ไม่มีอยู่ใน Firefox) แต่ใน Chrome มันอาจเป็นความคิดที่ดีที่จะสำรวจความแตกต่างระหว่างอย่างน้อย Chrome (+ clones) และ Firefox ในขณะที่ให้รหัสที่ใช้งานได้ทั้งสองอย่าง (หรืออย่างน้อยก็ระบุอย่างชัดเจนว่าสามารถใช้อะไรได้บ้างในขณะนี้ที่มีการสนับสนุนข้ามเบราว์เซอร์)
Makyen

@Makyen ในขณะที่รหัส OP ทำงานได้ดีใน Firefox ฉันพยายามที่จะมุ่งเน้นไปที่การควบคุมส่วนช่องว่างเพราะมีเส้นขอบพื้นฐานที่เราไม่สามารถควบคุมช่องว่างได้ ฉันยังเพิ่มส่วนสีด้วย ฉันพยายามทำให้เป็นคำตอบทั่วไป เกี่ยวกับการไล่ระดับสีใช่ Firefox ขาดการสนับสนุน แต่ฉันค่อนข้างแน่ใจว่ามันจะมาเร็ว ๆ นี้ (ฉันยังคงประหลาดใจที่พวกเขามาสายนี้ Chrome ได้สนับสนุนสิ่งนี้มาเกือบสองปี) ฉันเชื่อมโยงกับคำถามอื่นเพื่อรับการสนับสนุนเพิ่มเติม แต่ก็ไม่ชัดเจนมาก จะทำการอัพเดท
Temani Afif

3

ใช้stroke-dasharrayกับ 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>

หรือคุณสามารถใช้radial-gradient(), repeating-conic-gradient()ฟังก์ชั่นโดยไม่ต้อง 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-gradientกลายเป็น
ขรุขระ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.