8个扇形组成一个中间镂空的圆环,每个扇形之间有几个角度的空白间隙。
如何实现这样的效果
.ring {
width: 120px;
height: 120px;
border-radius: 50%;
background: conic-gradient(
#ff6b6b 0% 25%,
#4ecdc4 25% 50%,
#45b7d1 50% 75%,
#96ceb4 75% 100%
);
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.ring::after {
content: "";
position: absolute;
width: 90px;
height: 90px;
background: white;
border-radius: 50%;
}
实现原理分步说明:
支持动画的改进版(添加旋转动画):
.ring {
animation: rotate 3s linear infinite;
}
@keyframes rotate {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
如果需要不同比例的分段,调整conic-gradient的百分比值即可。此方案兼容现代浏览器,如需支持老旧浏览器可改用transform拼接方案。
用8个div实现了,代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.hollow-ring {
width: 200px;
height: 200px;
position: relative;
border-radius: 50%;
overflow: hidden;
}
/* 扇形基础样式 */
.sector {
position: absolute;
width: 100%;
height: 100%;
background: #4a90e2;
/* 通过改动最后的45%可以调整扇形角度 */
clip-path: polygon(50% 50%, 100% 0%, 100% 45%);
transform-origin: 50% 50%;
}
/* 8个扇形旋转角度 */
.sector:nth-child(1) { transform: rotate(0deg); }
.sector:nth-child(2) { transform: rotate(45deg); }
.sector:nth-child(3) { transform: rotate(90deg); }
.sector:nth-child(4) { transform: rotate(135deg); }
.sector:nth-child(5) { transform: rotate(180deg); }
.sector:nth-child(6) { transform: rotate(225deg); }
.sector:nth-child(7) { transform: rotate(270deg); }
.sector:nth-child(8) { transform: rotate(315deg); }
/* 中间镂空 */
.inner-circle {
position: absolute;
width: 100px;
height: 100px;
background: white;
border-radius: 50%;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
</style>
</head>
<body>
<div class="hollow-ring">
<!-- 8个扇形 -->
<div class="sector"></div>
<div class="sector"></div>
<div class="sector"></div>
<div class="sector"></div>
<div class="sector"></div>
<div class="sector"></div>
<div class="sector"></div>
<div class="sector"></div>
<!-- 中心镂空 -->
<div class="inner-circle"></div>
</div>
</body>
</html>
【技术探索者之路】
一位专注务实的92年摩羯座开发者,2018年获得软件工程硕士学位。深耕全栈开发领域五载,现立足上海打造数字世界的桥梁。
技术图谱:
🔹 前端架构:精通Vue/React生态体系,构建优雅交互体验
🔹 后端引擎:SpringBoot/SpringCloud微服务架构专家
🔹 数据智造:Python自动化处理能手,打造高效数据管道
🔹 空间智能:正在拓展地理信息系统的开发新边疆
持续深耕技术领域,在个人公众号「当默默无声」定期分享:
• 全栈开发实战经验
• 微服务架构深度解析
• GIS与空间智能开发探索
• 前沿技术趋势解读
以代码丈量世界,用技术创造价值,期待与您在数字世界的交汇点相遇。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>镂空圆环效果</title>
<style>
.circle-container {
width: 200px;
height: 200px;
position: relative;
margin: 50px auto;
}
.circle {
width: 100%;
height: 100%;
border-radius: 50%;
background: conic-gradient(
#3498db 0deg 40deg,
transparent 40deg 45deg,
#3498db 45deg 85deg,
transparent 85deg 90deg,
#3498db 90deg 130deg,
transparent 130deg 135deg,
#3498db 135deg 175deg,
transparent 175deg 180deg,
#3498db 180deg 220deg,
transparent 220deg 225deg,
#3498db 225deg 265deg,
transparent 265deg 270deg,
#3498db 270deg 310deg,
transparent 310deg 315deg,
#3498db 315deg 355deg,
transparent 355deg 360deg
);
position: relative;
}
.inner-circle {
width: 60%;
height: 60%;
background-color: white;
border-radius: 50%;
position: absolute;
top: 20%;
left: 20%;
}
</style>
</head>
<body>
<div class="circle-container">
<div class="circle">
<div class="inner-circle"></div>
</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>可配置的镂空圆环效果</title>
<style>
:root {
--circle-size: 200px;
--gap-angle: 5deg;
--sector-angle: 40deg;
--circle-color: #3498db;
--inner-circle-ratio: 0.6;
}
.circle-container {
width: var(--circle-size);
height: var(--circle-size);
position: relative;
margin: 50px auto;
}
.circle {
width: 100%;
height: 100%;
border-radius: 50%;
background: conic-gradient(
var(--circle-color) 0deg calc(var(--sector-angle)),
transparent calc(var(--sector-angle)) calc(var(--sector-angle) + var(--gap-angle)),
var(--circle-color) calc(var(--sector-angle) + var(--gap-angle)) calc(2*var(--sector-angle) + var(--gap-angle)),
transparent calc(2*var(--sector-angle) + var(--gap-angle)) calc(2*var(--sector-angle) + 2*var(--gap-angle)),
var(--circle-color) calc(2*var(--sector-angle) + 2*var(--gap-angle)) calc(3*var(--sector-angle) + 2*var(--gap-angle)),
transparent calc(3*var(--sector-angle) + 2*var(--gap-angle)) calc(3*var(--sector-angle) + 3*var(--gap-angle)),
var(--circle-color) calc(3*var(--sector-angle) + 3*var(--gap-angle)) calc(4*var(--sector-angle) + 3*var(--gap-angle)),
transparent calc(4*var(--sector-angle) + 3*var(--gap-angle)) calc(4*var(--sector-angle) + 4*var(--gap-angle)),
var(--circle-color) calc(4*var(--sector-angle) + 4*var(--gap-angle)) calc(5*var(--sector-angle) + 4*var(--gap-angle)),
transparent calc(5*var(--sector-angle) + 4*var(--gap-angle)) calc(5*var(--sector-angle) + 5*var(--gap-angle)),
var(--circle-color) calc(5*var(--sector-angle) + 5*var(--gap-angle)) calc(6*var(--sector-angle) + 5*var(--gap-angle)),
transparent calc(6*var(--sector-angle) + 5*var(--gap-angle)) calc(6*var(--sector-angle) + 6*var(--gap-angle)),
var(--circle-color) calc(6*var(--sector-angle) + 6*var(--gap-angle)) calc(7*var(--sector-angle) + 6*var(--gap-angle)),
transparent calc(7*var(--sector-angle) + 6*var(--gap-angle)) calc(7*var(--sector-angle) + 7*var(--gap-angle)),
var(--circle-color) calc(7*var(--sector-angle) + 7*var(--gap-angle)) calc(8*var(--sector-angle) + 7*var(--gap-angle)),
transparent calc(8*var(--sector-angle) + 7*var(--gap-angle)) 360deg
);
position: relative;
}
.inner-circle {
width: calc(var(--inner-circle-ratio) * 100%);
height: calc(var(--inner-circle-ratio) * 100%);
background-color: white;
border-radius: 50%;
position: absolute;
top: calc((1 - var(--inner-circle-ratio)) * 50%);
left: calc((1 - var(--inner-circle-ratio)) * 50%);
}
</style>
</head>
<body>
<div class="circle-container">
<div class="circle">
<div class="inner-circle"></div>
</div>
</div>
</body>
</html>
3 回答4.8k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
2 回答1.9k 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
5 回答1.9k 阅读
问了下ChatGPT,代码我试了能实现划入高亮,手动设置高亮,使用vue代码能更少。
样式你可以再调整下。