当前位置:首页 > 文章列表 > 文章 > 前端 > JavaScript图表库实现指南:Canvas与SVG绘图详解

JavaScript图表库实现指南:Canvas与SVG绘图详解

2026-04-08 16:46:18 0浏览 收藏
热门推荐
漫画APP
动画内容聚合,热门资源快捷查看
立即下载
本文深入解析了如何用原生 JavaScript 构建轻量级图表库的核心逻辑,聚焦于 Canvas 与 SVG 两大绘图技术的本质差异与适用场景:Canvas 以高性能、命令式绘制见长,适合实时更新的动态图表,但需手动处理坐标映射、重绘和像素对齐;SVG 则凭借矢量特性、DOM 可访问性及天然事件支持,成为交互复杂、需缩放、语义化和无障碍能力的静态或中低频图表的理想选择。文章通过清晰的步骤演示、关键代码要点(如 Canvas 的 clearRect 正确用法、SVG 的 viewBox 响应式设计)以及双版本柱状图实现示例,揭示了“数据映射→图形渲染”这一主线,并强调理解底层原理比盲目封装更重要——它赋予开发者精准定制、高效调试和灵活演进的能力,让自研图表不再遥不可及。

如何用JavaScript实现一个图表库_如何使用Canvas或SVG绘制图形?

用 JavaScript 实现一个轻量图表库,核心在于抽象数据映射逻辑 + 图形渲染能力。Canvas 和 SVG 各有适用场景:Canvas 适合高频重绘(如实时折线图、动画),SVG 更适合交互丰富、需缩放/语义化/可访问性的静态或中低频图表(如柱状图、饼图)。不需要从零造轮子,但理解底层原理能帮你灵活定制或调试。

用 Canvas 绘制基础图表的关键步骤

Canvas 是位图绘制,靠 getContext('2d') 获取绘图上下文,所有图形都通过命令式 API 画上去:

  • 先设置画布尺寸(canvas.width/height,不是 CSS 样式),否则会模糊或拉伸
  • beginPath() → 绘图命令(moveTo, lineTo, arc 等)→ stroke()fill() 完成单个图形
  • 坐标原点在左上角,X 向右,Y 向下;需手动做「数据值 → 像素坐标」的线性映射(例如:pixelY = height - (value - min) / (max - min) * height
  • 文字用 fillText(),注意 textAligntextBaseline 对齐方式,否则标签容易错位
  • 清空重绘用 clearRect(0, 0, width, height),不要依赖 canvas.width = canvas.width(会重置所有上下文状态)

用 SVG 构建可交互图表的优势与写法

SVG 是基于 XML 的矢量标记语言,每个图形都是 DOM 节点,天然支持事件、CSS 样式、缩放和无障碍属性:

  • 直接用 JS 创建元素:document.createElementNS('http://www.w3.org/2000/svg', 'line'),设置 x1/y1 等属性即可
  • 数据绑定推荐用 dataset 属性(如 el.dataset.value = "42"),方便后续交互取值
  • 响应式处理:用 viewBox(如 viewBox="0 0 600 400")替代固定宽高,配合 CSS 宽度实现等比缩放
  • 交互增强:给 cursor: pointeraddEventListener('click', ...) 即可响应点击;用 </code> 子元素提供 tooltip 文字(悬停显示)</li><li>避免内联样式,用 class + CSS 控制颜色、过渡动画(如 <code>transition: fill 0.2s</code>)</li></ul><h3>封装一个极简柱状图函数(Canvas + SVG 双版本示意)</h3><p>不追求功能完整,只体现核心抽象:输入数据数组,输出可视化结果。</p><ul><li><strong>Canvas 版</strong>:接收 <code>ctx</code>, <code>data</code>, <code>opts = {x:0,y:0,width:300,height:200,padding:20}</code>,内部算柱宽、映射高度、循环绘制 <code>fillRect</code></li><li><strong>SVG 版</strong>:返回一个 <code><g></code> 元素,内部按数据生成多个 <code><rect></code>,设置 <code>y</code> 和 <code>height</code>(注意 SVG y 轴向下,柱子要从顶部往下画,即 <code>y = opts.y</code>,<code>height = valueScale * value</code>)</li><li>共用逻辑可抽成工具函数:比如 <code>scale(data, outputMin, outputMax)</code> 返回值域映射器,<code>autoTicks(min, max, count=5)</code> 生成坐标轴刻度</li></ul><p>基本上就这些。真正实用的图表库还会处理坐标轴、图例、动画缓动、移动端适配、导出 PNG/SVG 等,但起步时聚焦「数据 → 图形」这一条主线,Canvas 练手感,SVG 练结构,很快就能搭出可用的定制图表。</p><p>文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《JavaScript图表库实现指南:Canvas与SVG绘图详解》文章吧,也可关注golang学习网公众号了解相关技术文章。</p> </div> <div class="labsList"> </div> <div class="cateBox"> <div class="cateItem"> <a href="/article/561019.html" title="JavaScript高效定位二维数组差异元素行列索引" class="img_box"> <img src="/uploads/20260408/177563792569d615a518fdc.jpg" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="JavaScript高效定位二维数组差异元素行列索引">JavaScript高效定位二维数组差异元素行列索引 </a> <dl> <dt class="lineOverflow"><a href="/article/561019.html" title="JavaScript高效定位二维数组差异元素行列索引" class="aBlack">上一篇<i></i></a></dt> <dd class="lineTwoOverflow">JavaScript高效定位二维数组差异元素行列索引</dd> </dl> </div> <div class="cateItem"> <a href="/article/561021.html" title="7881手游平台官网入口详解" class="img_box"> <img src="/uploads/20260408/177563803369d61611ba6e9.png" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="7881手游平台官网入口详解"> </a> <dl> <dt class="lineOverflow"><a href="/article/561021.html" class="aBlack" title="7881手游平台官网入口详解">下一篇<i></i></a></dt> <dd class="lineTwoOverflow">7881手游平台官网入口详解</dd> </dl> </div> </div> </div> </div> <div class="leftContBox pt0"> <div class="pdl20"> <div class="contTit"> <a href="/articlelist.html" class="more" title="查看更多">查看更多<i class="iconfont"></i></a> <div class="tit">最新文章</div> </div> </div> <ul class="newArticleList"> <li> <div class="contBox"> <a href="/article/623719.html" class="img_box" title="JavaScript ResizeObserver 如何避免响应式死循环:contentRect、阈值与 disconnect 边界"> <img src="/uploads/20260830/1788094188-resizeobserver-entry-boundary.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="JavaScript ResizeObserver 如何避免响应式死循环:contentRect、阈值与 disconnect 边界"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  31分钟前  |   <a href="/articletag/1307_new_0_1.html" class="aLightGray" title="浏览器">浏览器</a> · <a href="/articletag/4701_new_0_1.html" class="aLightGray" title="javascript">javascript</a> · <a href="/articletag/39768_new_0_1.html" class="aLightGray" title="前端性能">前端性能</a> · <a href="/articletag/40780_new_0_1.html" class="aLightGray" title="Web API">Web API</a> · <a href="/articletag/41469_new_0_1.html" class="aLightGray" title="响应式设计">响应式设计</a> · <a href="javascript:;" class="aLightGray" title="JavaScript">JavaScript</a> <a href="javascript:;" class="aLightGray" title="响应式布局">响应式布局</a> <a href="javascript:;" class="aLightGray" title="ResizeObserver">ResizeObserver</a> <a href="javascript:;" class="aLightGray" title="contentRect">contentRect</a> <a href="javascript:;" class="aLightGray" title="disconnect">disconnect</a> </span> </dd> <dt class="lineOverflow"> <a href="/article/623719.html" class="aBlack" target="_blank" title="JavaScript ResizeObserver 如何避免响应式死循环:contentRect、阈值与 disconnect 边界">JavaScript ResizeObserver 如何避免响应式死循环:contentRect、阈值与 disconnect 边界</a> </dt> <dd class="cont2"> <span><i class="view"></i>257浏览</span> <span class="collectBtn user_collection" data-id="623719" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/623700.html" class="img_box" title="JavaScript View Transitions 如何避免并发导航动画冲突:skipTransition、finished 与回滚状态"> <img src="/uploads/20260830/1788072847-view-transition-initial.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="JavaScript View Transitions 如何避免并发导航动画冲突:skipTransition、finished 与回滚状态"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  6小时前  |   </span> </dd> <dt class="lineOverflow"> <a href="/article/623700.html" class="aBlack" target="_blank" title="JavaScript View Transitions 如何避免并发导航动画冲突:skipTransition、finished 与回滚状态">JavaScript View Transitions 如何避免并发导航动画冲突:skipTransition、finished 与回滚状态</a> </dt> <dd class="cont2"> <span><i class="view"></i>327浏览</span> <span class="collectBtn user_collection" data-id="623700" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/623699.html" class="img_box" title="CSS container-type 实战:让卡片组件按自身宽度切换布局"> <img src="/uploads/20260830/1788072717-container-query-narrow.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="CSS container-type 实战:让卡片组件按自身宽度切换布局"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  6小时前  |   </span> </dd> <dt class="lineOverflow"> <a href="/article/623699.html" class="aBlack" target="_blank" title="CSS container-type 实战:让卡片组件按自身宽度切换布局">CSS container-type 实战:让卡片组件按自身宽度切换布局</a> </dt> <dd class="cont2"> <span><i class="view"></i>266浏览</span> <span class="collectBtn user_collection" data-id="623699" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/623688.html" class="img_box" title="HTML dialog closedby 如何区分 Esc、点击外部与强制关闭:关闭原因和兼容降级"> <img src="/uploads/20260830/1788068451-dialog-logs.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="HTML dialog closedby 如何区分 Esc、点击外部与强制关闭:关闭原因和兼容降级"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  7小时前  |   </span> </dd> <dt class="lineOverflow"> <a href="/article/623688.html" class="aBlack" target="_blank" title="HTML dialog closedby 如何区分 Esc、点击外部与强制关闭:关闭原因和兼容降级">HTML dialog closedby 如何区分 Esc、点击外部与强制关闭:关闭原因和兼容降级</a> </dt> <dd class="cont2"> <span><i class="view"></i>479浏览</span> <span class="collectBtn user_collection" data-id="623688" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/623686.html" class="img_box" title="CSS backdrop-filter 怎么控制毛玻璃层:叠加顺序、透明背景与降级检查"> <img src="/uploads/20260830/1788068333-backdrop-filter-root-focus.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="CSS backdrop-filter 怎么控制毛玻璃层:叠加顺序、透明背景与降级检查"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  7小时前  |   </span> </dd> <dt class="lineOverflow"> <a href="/article/623686.html" class="aBlack" target="_blank" title="CSS backdrop-filter 怎么控制毛玻璃层:叠加顺序、透明背景与降级检查">CSS backdrop-filter 怎么控制毛玻璃层:叠加顺序、透明背景与降级检查</a> </dt> <dd class="cont2"> <span><i class="view"></i>496浏览</span> <span class="collectBtn user_collection" data-id="623686" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/623656.html" class="img_box" title="CSS anchor positioning 实战:anchor-name、position-anchor 与 fallback 位置如何联动"> <img src="/uploads/20260830/1788064148-anchor-fallback.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="CSS anchor positioning 实战:anchor-name、position-anchor 与 fallback 位置如何联动"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  8小时前  |   <a href="/articletag/161_new_0_1.html" class="aLightGray" title="布局">布局</a> · <a href="/articletag/4729_new_0_1.html" class="aLightGray" title="css">css</a> · <a href="/articletag/5401_new_0_1.html" class="aLightGray" title="前端开发">前端开发</a> · <a href="/articletag/40165_new_0_1.html" class="aLightGray" title="浏览器特性">浏览器特性</a> · <a href="javascript:;" class="aLightGray" title="anchor-name">anchor-name</a> <a href="javascript:;" class="aLightGray" title="position-try-fallbacks">position-try-fallbacks</a> <a href="javascript:;" class="aLightGray" title="CSS anchor positioning">CSS anchor positioning</a> <a href="javascript:;" class="aLightGray" title="position-anchor">position-anchor</a> <a href="javascript:;" class="aLightGray" title="前端浮层">前端浮层</a> </span> </dd> <dt class="lineOverflow"> <a href="/article/623656.html" class="aBlack" target="_blank" title="CSS anchor positioning 实战:anchor-name、position-anchor 与 fallback 位置如何联动">CSS anchor positioning 实战:anchor-name、position-anchor 与 fallback 位置如何联动</a> </dt> <dd class="cont2"> <span><i class="view"></i>454浏览</span> <span class="collectBtn user_collection" data-id="623656" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/623654.html" class="img_box" title="前端拖拽排序怎么保留键盘操作:Drag and Drop API、焦点恢复与提交校验"> <img src="/uploads/20260830/1788063892-keyboard-selected.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="前端拖拽排序怎么保留键盘操作:Drag and Drop API、焦点恢复与提交校验"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  8小时前  |   <a href="/articletag/243_new_0_1.html" class="aLightGray" title="前端">前端</a> · <a href="/articletag/4701_new_0_1.html" class="aLightGray" title="javascript">javascript</a> · <a href="/articletag/40050_new_0_1.html" class="aLightGray" title="可访问性">可访问性</a> · <a href="/articletag/40780_new_0_1.html" class="aLightGray" title="Web API">Web API</a> · <a href="javascript:;" class="aLightGray" title="键盘操作">键盘操作</a> <a href="javascript:;" class="aLightGray" title="前端拖拽排序">前端拖拽排序</a> <a href="javascript:;" class="aLightGray" title="焦点恢复">焦点恢复</a> <a href="javascript:;" class="aLightGray" title="Drag and Drop API">Drag and Drop API</a> <a href="javascript:;" class="aLightGray" title="提交校验">提交校验</a> </span> </dd> <dt class="lineOverflow"> <a href="/article/623654.html" class="aBlack" target="_blank" title="前端拖拽排序怎么保留键盘操作:Drag and Drop API、焦点恢复与提交校验">前端拖拽排序怎么保留键盘操作:Drag and Drop API、焦点恢复与提交校验</a> </dt> <dd class="cont2"> <span><i class="view"></i>383浏览</span> <span class="collectBtn user_collection" data-id="623654" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/623626.html" class="img_box" title="ResizeObserver 监听卡片宽度时如何避免循环触发:borderBoxSize 与帧内合并"> <img src="/uploads/20260830/1788055330-resizeobserver-frame-render.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="ResizeObserver 监听卡片宽度时如何避免循环触发:borderBoxSize 与帧内合并"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  11小时前  |   </span> </dd> <dt class="lineOverflow"> <a href="/article/623626.html" class="aBlack" target="_blank" title="ResizeObserver 监听卡片宽度时如何避免循环触发:borderBoxSize 与帧内合并">ResizeObserver 监听卡片宽度时如何避免循环触发:borderBoxSize 与帧内合并</a> </dt> <dd class="cont2"> <span><i class="view"></i>487浏览</span> <span class="collectBtn user_collection" data-id="623626" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/623601.html" class="img_box" title="JavaScript Promise.withResolvers 如何拆分异步控制器:旧写法迁移与异常收口"> <img src="/uploads/20260830/1788050997-promise-resolvers-control.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="JavaScript Promise.withResolvers 如何拆分异步控制器:旧写法迁移与异常收口"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  12小时前  |   </span> </dd> <dt class="lineOverflow"> <a href="/article/623601.html" class="aBlack" target="_blank" title="JavaScript Promise.withResolvers 如何拆分异步控制器:旧写法迁移与异常收口">JavaScript Promise.withResolvers 如何拆分异步控制器:旧写法迁移与异常收口</a> </dt> <dd class="cont2"> <span><i class="view"></i>412浏览</span> <span class="collectBtn user_collection" data-id="623601" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/623600.html" class="img_box" title="HTML inert 如何管理模态层焦点:inert、aria-hidden 与恢复焦点"> <img src="/uploads/20260830/1788050953-focus-restore-flow.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="HTML inert 如何管理模态层焦点:inert、aria-hidden 与恢复焦点"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  12小时前  |   <a href="/articletag/243_new_0_1.html" class="aLightGray" title="前端">前端</a> · <a href="/articletag/4701_new_0_1.html" class="aLightGray" title="javascript">javascript</a> · <a href="/articletag/40991_new_0_1.html" class="aLightGray" title="无障碍">无障碍</a> · <a href="javascript:;" class="aLightGray" title="html">html</a> <a href="javascript:;" class="aLightGray" title="无障碍">无障碍</a> <a href="javascript:;" class="aLightGray" title="dialog">dialog</a> <a href="javascript:;" class="aLightGray" title="inert">inert</a> </span> </dd> <dt class="lineOverflow"> <a href="/article/623600.html" class="aBlack" target="_blank" title="HTML inert 如何管理模态层焦点:inert、aria-hidden 与恢复焦点">HTML inert 如何管理模态层焦点:inert、aria-hidden 与恢复焦点</a> </dt> <dd class="cont2"> <span><i class="view"></i>430浏览</span> <span class="collectBtn user_collection" data-id="623600" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/623573.html" class="img_box" title="Popover API 如何实现点击外部关闭:popover、beforetoggle 与无障碍焦点验收"> <img src="/uploads/20260830/1788046542-popover-light-dismiss-flow.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="Popover API 如何实现点击外部关闭:popover、beforetoggle 与无障碍焦点验收"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  13小时前  |   <a href="/articletag/243_new_0_1.html" class="aLightGray" title="前端">前端</a> · <a href="/articletag/4701_new_0_1.html" class="aLightGray" title="javascript">javascript</a> · <a href="/articletag/40050_new_0_1.html" class="aLightGray" title="可访问性">可访问性</a> · <a href="/articletag/40780_new_0_1.html" class="aLightGray" title="Web API">Web API</a> · <a href="javascript:;" class="aLightGray" title="Toggle">Toggle</a> <a href="javascript:;" class="aLightGray" title="popover">popover</a> <a href="javascript:;" class="aLightGray" title="Popover API">Popover API</a> <a href="javascript:;" class="aLightGray" title="beforetoggle">beforetoggle</a> <a href="javascript:;" class="aLightGray" title="无障碍焦点">无障碍焦点</a> </span> </dd> <dt class="lineOverflow"> <a href="/article/623573.html" class="aBlack" target="_blank" title="Popover API 如何实现点击外部关闭:popover、beforetoggle 与无障碍焦点验收">Popover API 如何实现点击外部关闭:popover、beforetoggle 与无障碍焦点验收</a> </dt> <dd class="cont2"> <span><i class="view"></i>256浏览</span> <span class="collectBtn user_collection" data-id="623573" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/623546.html" class="img_box" title="adoptedStyleSheets 如何在多个 Shadow DOM 共享样式:构造、挂载与更新边界"> <img src="/uploads/20260830/1788042371-adopted-stylesheets-construction.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="adoptedStyleSheets 如何在多个 Shadow DOM 共享样式:构造、挂载与更新边界"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  14小时前  |   <a href="/articletag/243_new_0_1.html" class="aLightGray" title="前端">前端</a> · <a href="/articletag/4701_new_0_1.html" class="aLightGray" title="javascript">javascript</a> · <a href="/articletag/4729_new_0_1.html" class="aLightGray" title="css">css</a> · <a href="javascript:;" class="aLightGray" title="Web Components">Web Components</a> <a href="javascript:;" class="aLightGray" title="Shadow DOM">Shadow DOM</a> <a href="javascript:;" class="aLightGray" title="adoptedStyleSheets">adoptedStyleSheets</a> <a href="javascript:;" class="aLightGray" title="CSSStyleSheet">CSSStyleSheet</a> </span> </dd> <dt class="lineOverflow"> <a href="/article/623546.html" class="aBlack" target="_blank" title="adoptedStyleSheets 如何在多个 Shadow DOM 共享样式:构造、挂载与更新边界">adoptedStyleSheets 如何在多个 Shadow DOM 共享样式:构造、挂载与更新边界</a> </dt> <dd class="cont2"> <span><i class="view"></i>365浏览</span> <span class="collectBtn user_collection" data-id="623546" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> </ul> </div> </div> <div class="mainRight"> <!-- 右侧广告位banner --> <div class="rightContBox" style="margin-top: 0px;"> <div class="rightTit"> <a href="/courselist.html" class="more" title="查看更多">查看更多<i class="iconfont"></i></a> <div class="tit lineOverflow">课程推荐</div> </div> <ul class="lessonRecomRList"> <li> <a href="/course/9.html" class="img_box" target="_blank" title="前端进阶之JavaScript设计模式"> <img src="/uploads/20221222/52fd0f23a454c71029c2c72d206ed815.jpg" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="前端进阶之JavaScript设计模式"> </a> <dl> <dt class="lineTwoOverflow"><a href="/course/9.html" target="_blank" class="aBlack" title="前端进阶之JavaScript设计模式">前端进阶之JavaScript设计模式</a></dt> <dd class="cont1 lineTwoOverflow"> 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。 </dd> <dd class="cont2">543次学习</dd> </dl> </li> <li> <a href="/course/2.html" class="img_box" target="_blank" title="GO语言核心编程课程"> <img src="/uploads/20221221/634ad7404159bfefc6a54a564d437b5f.png" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="GO语言核心编程课程"> </a> <dl> <dt class="lineTwoOverflow"><a href="/course/2.html" target="_blank" class="aBlack" title="GO语言核心编程课程">GO语言核心编程课程</a></dt> <dd class="cont1 lineTwoOverflow"> 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。 </dd> <dd class="cont2">516次学习</dd> </dl> </li> <li> <a href="/course/74.html" class="img_box" target="_blank" title="简单聊聊mysql8与网络通信"> <img src="/uploads/20240103/bad35fe14edbd214bee16f88343ac57c.png" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="简单聊聊mysql8与网络通信"> </a> <dl> <dt class="lineTwoOverflow"><a href="/course/74.html" target="_blank" class="aBlack" title="简单聊聊mysql8与网络通信">简单聊聊mysql8与网络通信</a></dt> <dd class="cont1 lineTwoOverflow"> 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让 </dd> <dd class="cont2">500次学习</dd> </dl> </li> <li> <a href="/course/57.html" class="img_box" target="_blank" title="JavaScript正则表达式基础与实战"> <img src="/uploads/20221226/bbe4083bb3cb0dd135fb02c31c3785fb.jpg" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="JavaScript正则表达式基础与实战"> </a> <dl> <dt class="lineTwoOverflow"><a href="/course/57.html" target="_blank" class="aBlack" title="JavaScript正则表达式基础与实战">JavaScript正则表达式基础与实战</a></dt> <dd class="cont1 lineTwoOverflow"> 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。 </dd> <dd class="cont2">487次学习</dd> </dl> </li> <li> <a href="/course/28.html" class="img_box" target="_blank" title="从零制作响应式网站—Grid布局"> <img src="/uploads/20221223/ac110f88206daeab6c0cf38ebf5fe9ed.jpg" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="从零制作响应式网站—Grid布局"> </a> <dl> <dt class="lineTwoOverflow"><a href="/course/28.html" target="_blank" class="aBlack" title="从零制作响应式网站—Grid布局">从零制作响应式网站—Grid布局</a></dt> <dd class="cont1 lineTwoOverflow"> 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。 </dd> <dd class="cont2">485次学习</dd> </dl> </li> </ul> </div> <div class="rightContBox"> <div class="rightTit"> <a href="/ai.html" class="more" title="查看更多">查看更多<i class="iconfont"></i></a> <div class="tit lineOverflow">AI推荐</div> </div> <ul class="lessonRecomRList"> <li> <a href="/ai/13109.html" target="_blank" title="ljg-skills - "Prompt之神"李继刚开源的 AI 技能集" class="img_box"> <img src="/uploads/ai/20260616/ljg-skills-icon-8bbe1468e5.png" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="ljg-skills - "Prompt之神"李继刚开源的 AI 技能集" style="object-fit:cover;width:100%;height:100%;"> </a> <dl> <dt class="lineTwoOverflow"><a href="/ai/13109.html" class="aBlack" target="_blank" title="ljg-skills">ljg-skills</a></dt> <dd class="cont1 lineTwoOverflow"> ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。 </dd> <dd class="cont2">5465次使用</dd> </dl> </li> <li> <a href="/ai/13108.html" target="_blank" title="MELO音乐 - AI 音乐生成平台,支持多模态创作能力" class="img_box"> <img src="/uploads/ai/20260616/melo-icon-10bf590762.png" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="MELO音乐 - AI 音乐生成平台,支持多模态创作能力" style="object-fit:cover;width:100%;height:100%;"> </a> <dl> <dt class="lineTwoOverflow"><a href="/ai/13108.html" class="aBlack" target="_blank" title="MELO音乐">MELO音乐</a></dt> <dd class="cont1 lineTwoOverflow"> MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款! </dd> <dd class="cont2">4943次使用</dd> </dl> </li> <li> <a href="/ai/13107.html" target="_blank" title="UniScribe - AI 免费在线音视频转文字平台" class="img_box"> <img src="/uploads/ai/20260616/uniscribe-icon-3c88366a15.png" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="UniScribe - AI 免费在线音视频转文字平台" style="object-fit:cover;width:100%;height:100%;"> </a> <dl> <dt class="lineTwoOverflow"><a href="/ai/13107.html" class="aBlack" target="_blank" title="UniScribe">UniScribe</a></dt> <dd class="cont1 lineTwoOverflow"> UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。 </dd> <dd class="cont2">4851次使用</dd> </dl> </li> <li> <a href="/ai/13106.html" target="_blank" title="剧云 - 免费 AI 智能中文剧本创作平台" class="img_box"> <img src="/uploads/ai/20260615/d36c7176-icon-2b0cd581ce.png" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="剧云 - 免费 AI 智能中文剧本创作平台" style="object-fit:cover;width:100%;height:100%;"> </a> <dl> <dt class="lineTwoOverflow"><a href="/ai/13106.html" class="aBlack" target="_blank" title="剧云">剧云</a></dt> <dd class="cont1 lineTwoOverflow"> 剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。 </dd> <dd class="cont2">5115次使用</dd> </dl> </li> <li> <a href="/ai/13105.html" target="_blank" title="万象有声 - AI 一站式有声内容创作平台" class="img_box"> <img src="/uploads/ai/20260615/50267bac-icon-c146b001b5.png" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="万象有声 - AI 一站式有声内容创作平台" style="object-fit:cover;width:100%;height:100%;"> </a> <dl> <dt class="lineTwoOverflow"><a href="/ai/13105.html" class="aBlack" target="_blank" title="万象有声">万象有声</a></dt> <dd class="cont1 lineTwoOverflow"> 万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单! </dd> <dd class="cont2">5071次使用</dd> </dl> </li> </ul> </div> <!-- 相关文章 --> <div class="rightContBox"> <div class="rightTit"> <a href="/articlelist.html" class="more" title="查看更多">查看更多<i class="iconfont"></i></a> <div class="tit lineOverflow">相关文章</div> </div> <ul class="aboutArticleRList"> <li> <dl> <dt class="lineTwoOverflow"><a href="/article/207000.html" class="aBlack" title="JavaScript函数定义及示例详解">JavaScript函数定义及示例详解</a></dt> <dd> <span class="left">2025-05-11</span> <span class="right">502浏览</span> </dd> </dl> </li> <li> <dl> <dt class="lineTwoOverflow"><a href="/article/621422.html" class="aBlack" title="智能体安全引领产业升级——国内AI安全产品市场深度分析">智能体安全引领产业升级——国内AI安全产品市场深度分析</a></dt> <dd> <span class="left">2026-08-21</span> <span class="right">501浏览</span> </dd> </dl> </li> <li> <dl> <dt class="lineTwoOverflow"><a href="/article/619053.html" class="aBlack" title="CSS变量简化按钮悬停效果技巧">CSS变量简化按钮悬停效果技巧</a></dt> <dd> <span class="left">2026-05-31</span> <span class="right">501浏览</span> </dd> </dl> </li> <li> <dl> <dt class="lineTwoOverflow"><a href="/article/618916.html" class="aBlack" title="JavaScript符号类型详解与应用">JavaScript符号类型详解与应用</a></dt> <dd> <span class="left">2026-05-31</span> <span class="right">501浏览</span> </dd> </dl> </li> <li> <dl> <dt class="lineTwoOverflow"><a href="/article/612539.html" class="aBlack" title="HTML剪贴板复制粘贴怎么用">HTML剪贴板复制粘贴怎么用</a></dt> <dd> <span class="left">2026-05-26</span> <span class="right">501浏览</span> </dd> </dl> </li> </ul> </div> </div> </div> <script src="/assets/js/frontend/common.js"></script> </body> </html>