
本文详细介绍了如何在svg中为描边应用渐变效果,特别是实现复杂的圆环形(conic)渐变。文章对比了svg内置的线性/径向渐变与结合css `conic-gradient` 和svg `
在SVG中,为图形元素(如圆形、路径等)的描边(stroke)应用渐变是一种常见的需求。SVG本身提供了两种原生的渐变类型:
这两种渐变通过在SVG的
示例:应用线性渐变到SVG描边
<svg width="200" height="200" viewBox="0 0 100 100">
<defs>
<linearGradient id="myLinearGradient" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="red"/>
<stop offset="50%" stop-color="yellow"/>
<stop offset="100%" stop-color="green"/>
</linearGradient>
</defs>
<circle cx="50" cy="50" r="40" fill="none" stroke="url(#myLinearGradient)" stroke-width="5"/>
</svg>在这个例子中,我们定义了一个从红色到黄色再到绿色的线性渐变,并将其应用到一个圆形的描边上。
然而,SVG原生的渐变类型并不直接支持“圆环形”(conic)渐变,即颜色围绕一个中心点旋转变化的渐变。虽然径向渐变在某些情况下可以模拟出类似效果,但实现真正的圆环形渐变通常非常复杂且难以控制。
为了在SVG描边上实现复杂的圆环形渐变,我们可以巧妙地结合CSS的 conic-gradient 函数和SVG的
更直观的遮罩理解:在SVG遮罩中,一个常见的模式是:用一个白色矩形覆盖整个区域,然后在这个矩形上“画”出你想要显示的部分(用黑色描边或填充)。当这个遮罩应用于一个元素时,遮罩中白色的区域会显示被遮罩元素的内容,黑色的区域会隐藏。如果想要描边显示而其他部分隐藏,我们可以让遮罩的描边部分是透明或黑色的,而其他部分是白色的。
原答案提供的方法是:
让我们按照原答案的逻辑来构建。
首先,为你的SVG元素(或其父容器)设置 conic-gradient 作为背景。
svg {
display: block; /* 确保SVG是块级元素 */
background-image: conic-gradient(from 180deg, green, orange, red);
}这里的 from 180deg 定义了渐变的起始角度,green, orange, red 定义了渐变的颜色序列。
在SVG的
TabTab AI
首个全链路 Data Agent,让数据搜集、处理到深度分析一步到位。
292
查看详情
<svg width="300" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<mask id="m1">
<!-- 遮罩的背景,通常是白色,表示默认可见 -->
<rect width="100" height="100" fill="white" />
<!-- 遮罩的核心形状:一个带有黑色描边的圆形 -->
<!-- transform="rotate(120 50 50)" 可以调整描边的起始位置 -->
<!-- stroke-dasharray 和 pathLength 用于控制描边的可见部分,实现进度条效果 -->
<circle transform="rotate(120 50 50)" cx="50" cy="50" r="45"
stroke="black" stroke-width="5" fill="none"
stroke-dasharray="300 360" pathLength="360" />
</mask>
</defs>
<!-- ... 后面会有一个应用遮罩的元素 -->
</svg>最后,创建一个
<rect width="100" height="100" fill="white" mask="url(#m1)" />
这个矩形本身填充为白色,但由于它应用了 m1 遮罩,只有遮罩中非黑色(即白色矩形减去黑色圆环)的部分才会显示。这样,最终效果就是:svg 元素的 conic-gradient 背景,通过 mask 的镂空,只在圆环描边处显现出来。
将上述CSS和SVG结合,得到一个完整的圆环形渐变描边示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SVG Conic Gradient Stroke</title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
background-color: #f0f0f0;
}
svg {
display: block;
width: 300px; /* 控制SVG显示大小 */
height: 300px;
/* 应用CSS圆环形渐变作为SVG的背景 */
background-image: conic-gradient(from 180deg, green, orange, red);
border-radius: 50%; /* 可选:使SVG背景也呈现圆形 */
}
</style>
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<mask id="conicGradientMask">
<!-- 遮罩背景:白色矩形,表示默认全部可见 -->
<rect width="100" height="100" fill="white" />
<!-- 遮罩形状:一个带有黑色描边的圆形。
黑色描边区域在应用遮罩时会隐藏被遮罩元素的内容。
我们希望只显示渐变在描边处,所以这个逻辑是反向的。
实际上,这个黑色描边是“挖空”了白色背景,使得只有描边以外的部分可见。
当mask应用于一个fill="white"的rect时,rect的白色区域会被mask中非黑色的部分覆盖。
所以,mask中的白色区域(rect减去circle的黑色描边)会显示被遮罩的rect的白色,
而mask中黑色描边区域则会隐藏被遮罩的rect的白色。
最终,我们需要一个反向的遮罩,即描边处是白色,其他地方是黑色。
这里通过将mask应用于一个fill="white"的rect,并利用svg的background-image来巧妙实现。
svg的background-image会在mask镂空的地方显示出来。
-->
<circle transform="rotate(120 50 50)" cx="50" cy="50" r="45"
stroke="black" stroke-width="5" fill="none"
stroke-dasharray="300 360" pathLength="360" />
</mask>
</defs>
<!-- 目标元素:一个填充为白色的矩形,应用了上述遮罩 -->
<!-- 最终效果是:SVG的conic-gradient背景,通过mask的镂空,只在圆环描边处显现出来 -->
<rect width="100" height="100" fill="white" mask="url(#conicGradientMask)" />
</svg>
</body>
</html>解析:
这种方法巧妙地利用了CSS conic-gradient 的强大表现力,并通过SVG
原始问题中提供了一个基于 stroke-dasharray 和 stroke-dashoffset 的进度条实现。我们可以将这种动态更新逻辑与上述圆环形渐变描边技术结合。
在遮罩中的
示例:动态更新圆环形渐变进度条
假设我们想将进度条从0%显示到60%。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SVG Conic Gradient Progress Bar</title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
background-color: #f0f0f0;
}
svg {
display: block;
width: 300px;
height: 300px;
background-image: conic-gradient(from 180deg, green, orange, red);
border-radius: 50%;
/* 旋转SVG以调整渐变起始点,与mask中的旋转保持一致 */
transform: rotate(-90deg); /* 假设进度条从顶部开始 */
}
</style>
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<defs>
<mask id="conicGradientProgressBarMask">
<rect width="100" height="100" fill="white" />
<!-- 注意:这里的transform和stroke-dasharray将根据实际需求调整 -->
<!-- 为了配合外部的rotate(-90deg),这里的transform可以省略或调整 -->
<circle class="progress-mask-circle" cx="50" cy="50" r="45"
stroke="black" stroke-width="5" fill="none"
stroke-dasharray="0 360" pathLength="360" />
</mask>
</defs>
<rect width="100" height="100" fill="white" mask="url(#conicGradientProgressBarMask)" />
</svg>
<script>
document.addEventListener('DOMContentLoaded', () => {
const progressBarCircle = document.querySelector('.progress-mask-circle');
const pathLength = parseFloat(progressBarCircle.getAttribute('pathLength'));
function setProgress(percentage) {
// 将百分比转换为dasharray的第一个值
// 例如,60% -> (60/100) * 360 = 216
const dashOffset = (percentage / 100) * pathLength;
// stroke-dasharray: 可见部分 剩余部分
progressBarCircle.setAttribute('stroke-dasharray', `${dashOffset} ${pathLength - dashOffset}`);
// 可以添加CSS transition来实现平滑过渡
progressBarCircle.style.transition = 'stroke-dasharray 1s ease-in-out';
}
// 模拟进度更新
let currentProgress = 0;
const targetProgress = 60; // 目标进度60%
// 初始设置进度
setProgress(currentProgress);
// 可以在某个事件触发时更新进度,例如:
setTimeout(() => {
setProgress(targetProgress); // 2秒后更新到60%
}, 2000);
});
</script>
</body>
</html>关键点:
通过这种方式,我们不仅实现了圆环形渐变描边,还使其具备了动态更新的能力,非常适合用于美观且功能丰富的进度条。
以上就是SVG描边渐变:实现圆环形(Conic)渐变效果的专业指南的详细内容,更多请关注其它相关文章!
# 用了
# 网络推广软件seo
# 全网营销推广特等易速达
# 网站推广软件哪个品牌好
# seo网址层级
# 抖音关键词排名优化教学
# 建设竞拍网站是什么
# 视频的SEO优化
# 免费图片网站建设
# 营销推广软件价格多少钱
# 杭州电商网站建设电话
# 中心点
# 只在
# 只显示
# css
# 我们可以
# 中非
# 在这个
# 第一个
# 应用于
# 进度条
# red
# 浏览器
# svg
# html
# css3
# java
# javascript
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
《爱南宁》认证电动车方法
《万兴喵影》导出视频方法
PHP页面重载后变量状态保持:实现用户档案连续浏览的教程
Microsoft Edge网页字体太淡看不清怎么办_Microsoft Edge字体渲染优化技巧
CSS布局中意外顶部空白的调试与解决:深入理解padding-top
《小宇宙》标记不友善评论方法
免费占卜在线神算_免费占卜手机神算
使用TinyButStrong生成HTML并结合Dompdf创建PDF教程
小米手机屏幕失灵乱跳怎么办 屏幕触控问题自检与临时解决方法【应急】
126邮箱申请入口官网_126邮箱注册免费登录2025
告别阻塞等待:如何使用GuzzlePromises优雅处理PHP异步操作,提升应用响应速度
淘口令快速解析技巧
英国搜索:多数英国人认为语言搜索是未来搜索
解决Pandas DataFrame高度碎片化警告:高效创建多列的策略
TikTok私信无法发送表情怎么办 TikTok消息表情发送修复方法
《地下城堡4:骑士与破碎编年史》墓穴挑战125攻略
一点万象签到领积分指南
《我的恋爱逃生攻略》中文名字输入方法
Apple Music无故扣费引质疑
wps文字怎么设置文字环绕图片的方式_wps文字如何设置文字环绕图片方式
《sketchbook》选中部分图案移动方法
苹果自助维修计划支持哪些设备机型
《三国:谋定天下》平民全阶段通用阵容
微博网页版访问入口 微博网页版网页端使用指南
2025SNH48年度青春盛典门票价格及购买方式
百度输入法在AutoCAD中无法输入中文怎么办_百度输入法CAD输入异常解决方法
Win10如何彻底关闭OneDrive Win10禁用云同步功能【纯净】
在J*a中如何实现类的继承与方法重用_OOP继承方法重用技巧分享
Linux如何自动分析系统异常日志_Linux日志智能检测
苹果手机手电筒无法开启
iPhone14无法连接蓝牙设备如何解决
Golang如何实现HTTP请求重试机制_Golang HTTP请求错误处理策略
iPhone 13 mini如何清理Safari缓存_iPhone 13 mini浏览器缓存清理方法
PHP utf8_encode 字符编码转换疑难解析与最佳实践
163邮箱网页版入口 163邮箱在线使用
pubmed数据库官方主页_pubmed学术论文查找官网直达
背部总是隐隐作痛怎么回事 背痛如何改善
《绝区零》2.3前瞻|直播|内容介绍
Symfony路由参数转换器:实体存在性验证与错误处理策略
智学网成绩单查询系统网_智学网学生平台登录
风车动漫官网首页入口登录 风车动漫在线观看正版地址
网易云音乐闹钟铃声设置教程
以下哪一个是适应长期护理制度发展而设立的新职业
宝妈做视频号该写什么标签话题?宝妈关注的话题有哪些?
PDF如何批量加注释_PDF多文件批注高亮操作教程
sublime怎么快速在浏览器中预览HTML_sublime配置View in Browser教程
极兔快递官网查询入口手机版 手机极兔快递登录查询入口官方
《百度畅听版》关闭兴趣推荐方法
win11怎么设置默认终端为Windows Terminal Win11替代CMD和PowerShell【技巧】
cad怎么隐藏指定的图层_cad隐藏或冻结图层方法
2025-12-06
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。