ng-zorro-antd QRCode 组件自定义填充(nzPadding)完全指南:从 Demo 到源码实现
UI组件前端【免费下载链接】ng-zorro-antdAngular UI Component Library based on Ant Design项目地址https://gitcode.com/gh_mirrors/ng/ng-zorro-antd点击查看免费下载导读本文围绕 ng-zorro-antdAngular 版 Ant Design 组件库QRCode 组件的填充Padding定制能力展开基于仓库中 padding 示例 与其配套的 padding.ts 代码深入讲解nzPadding参数的作用、用法与底层实现原理。读完本文你将掌握如何通过nzPadding为二维码四周留出干净、可扫描的安全边距理解填充值在 canvas 与 SVG 两种渲染管线中的真实作用方式并能根据二维码规范规避无法识别的常见坑。一、示例概览一行属性实现带衬垫的二维码在 ng-zorro-antd 的 QRCode 组件示例中padding.md 用一句话点明主题自定义 QR 码的填充。对应的 padding.ts 给出了最精简的完整可运行示例import { Component } from angular/core; import { NzQRCodeModule } from ng-zorro-antd/qr-code; Component({ selector: nz-demo-qr-code-padding, imports: [NzQRCodeModule], template: nz-qrcode [nzPadding]2 nzValuehttps://ng.ant.design/ / nz-qrcode nzTypesvg [nzPadding]2 nzValuehttps://ng.ant.design/ / , styles: nz-qrcode { margin-right: 12px; padding: 0; } }) export class NzDemoQrCodePaddingComponent {}这个示例同时展示了两种渲染形态默认canvas渲染的二维码设置[nzPadding]2通过nzTypesvg切换到SVG渲染的二维码同样设置[nzPadding]2。两者都使用nzValue指向https://ng.ant.design/说明nzPadding与渲染类型正交、可任意组合。示例样式中对nz-qrcode设置了margin-right: 12px和padding: 0用于让两个二维码在演示页中并排展示、避免外边距干扰这与组件内部的nzPadding内衬是两个不同概念需要注意区分。二、nzPadding API 速查参数、类型与默认值在组件官方文档 index.zh-CN.md 的 API 表中nzPadding的定位清晰可见参数说明类型默认值[nzPadding]二维码填充number0再对照 qrcode.component.ts 的源码定义readonly nzPadding inputnumber(0);可以看到这是一个以number像素单位为输入、默认值为0的输入属性。也就是说不传nzPadding时二维码模块矩阵紧贴绘制边界四周没有额外留白传入正数如示例中的2时二维码内容四周会额外空出相应数量的模块格作为静区quiet zone填充。围绕nzPaddingAPI 表中还有一组高度相关的属性在实际布局中经常一起使用一并列出以便对照参数说明类型默认值[nzValue]扫描后的文本string \| string[]-[nzType]渲染类型canvas \| svgcanvas[nzColor]二维码颜色string#000000[nzBgColor]二维码背景颜色string#FFFFFF[nzSize]二维码大小number160[nzBordered]是否有边框booleantrue[nzStatus]二维码状态active \| expired \| loading \| scannedactive[nzLevel]二维码容错等级L \| M \| Q \| HM其中nzBgColor默认#FFFFFF白底与nzPadding的组合恰好构成二维码规范要求的白色静区填充区域使用背景色绘制确保扫码器能正确识别定位图案。三、填充值在源码中如何被处理getMarginSize 与数据管线nzPadding并不是直接传给渲染层而是先经过一层数据归一化。整个 QR 码数据生成集中在 qrcode-data.ts 的createQRCodeData函数中export const createQRCodeData ( value: string | string[], level DEFAULT_LEVEL, minVersion: number, size: number, boostLevel: boolean, marginSize: number, imageSettings?: ImageSettings ) { const cs memoizedQrcode(value, level, minVersion, boostLevel); const mg getMarginSize(marginSize); const ncs cs.getModules().length mg * 2; const cis getImageSettings(cs.getModules(), size, mg, imageSettings); return { cells: cs.getModules(), margin: mg, numCells: ncs, calculatedImageSettings: cis, qrcode: cs }; };这里的关键点有三个归一化marginSize即nzPadding被传入getMarginSize。看 utils.ts 的实现export const getMarginSize (marginSize: number): number Math.max(Math.floor(marginSize), 0);它会对输入做向下取整并钳制到非负数。这意味着即使传入小数如2.7或负数最终生效的填充值也只会是2或0这类安全值。从源码结构可以推断这是为了防御性地避免非法输入破坏后续的坐标计算。总网格数numCells 模块数 mg * 2即填充值会同时在左、右、上、下四个方向各贡献mg个网格单位所以总尺寸变化是2 * mg。这个numCells随后作为 SVG 的viewBox与 canvas 的坐标系基准。联动图标定位getImageSettings也会接收margin当设置了nzIcon时图标位置会基于cells.length / 2居中计算见 utils.ts填充的存在不会破坏图标居中逻辑。组件层 qrcode.component.ts 的updateQRCodeData将nzPadding()作为marginSize参数传入并把计算出的margin、cells、numCells、calculatedImageSettings分别写入 signal再由模板分发给 canvas / svg 子组件渲染。四、canvas 渲染margin 如何变成像素当nzType为默认的canvas时宿主组件 qrcode.component.ts 渲染nz-qrcode-canvas子组件并把margin、cells、numCells、size、color、bgColor传下去。真正的绘制逻辑在 qrcode-canvas.component.ts。绘制前先建立坐标系setupCanvasconst pixelRatio window.devicePixelRatio || 1; canvas.nativeElement.height canvas.nativeElement.width this.size() * pixelRatio; canvas.nativeElement.style.width canvas.nativeElement.style.height ${this.size()}px; const scale (this.size() / this.numCells()) * pixelRatio; ctx.scale(scale, scale); ctx.fillStyle this.bgColor(); ctx.fillRect(0, 0, this.numCells(), this.numCells());画布物理像素由size * devicePixelRatio决定CSS 尺寸始终是nzSize默认 160px保证高分屏下二维码依然清晰坐标系按size / numCells缩放把模块网格映射为像素先用背景色fillRect铺满整个numCells × numCells区域——这一步正是填充区的来源nzPadding扩大后的numCells区域全部以nzBgColor填充天然形成白色静区。模块绘制分两条路径renderQRCode浏览器支持Path2D时用 generatePath 生成紧凑的 SVG 路径字符串并通过ctx.fill(new Path2D(path))一次填充不支持时退化为逐格fillRect。注意generatePath(cells, this.margin())中每个路径点的坐标都加上margin偏移如M${start margin} ${y margin}...从而使模块矩阵整体右移、下移mg个网格单位四周空出静区而背景已经由整块fillRect(0, 0, numCells, numCells)铺底视觉上就是带衬垫的二维码。若同时配置了nzIcon还会在图标区域执行挖空excavateModules并在图标load成功后以x margin、y margin的偏移绘制图标onImageLoadSuccess填充值同样参与图标定位。五、SVG 渲染viewBox 与路径偏移当nzTypesvg时宿主渲染nz-qrcode-svg子组件见 qrcode.component.ts模板结构在 qrcode-svg.component.tssvg [attr.height]size() [attr.width]size() [attr.viewBox]viewBox roleimg path [attr.fill]bgColor() [attr.d]backgroundPath shapeRenderingcrispEdges / path [attr.fill]color() [attr.d]foregroundPath shapeRenderingcrispEdges / ... /svginitializeViewBox以numCells建立视图坐标系this.viewBox 0 0 ${this.numCells()} ${this.numCells()}; this.backgroundPath M0,0 h${this.numCells()}v${this.numCells()}H0z;即viewBox的边长 模块数 2 × margin背景路径同样铺满整个带填充的坐标系前景路径generatePath(cellsToDraw, this.margin())与 canvas 分支共用同一套带 margin 偏移的路径生成逻辑。因此 SVG 与 canvas 两种模式对nzPadding的处理完全一致填充改变的是坐标系尺寸与模块偏移而非缩放模块本身。这也意味着填充后单个模块的物理像素会略微变小因为size不变而网格数增加在尺寸足够大的场景下不影响扫描识别。SVG 分支对图标image的处理同样以(calculatedImageSettings.x || 0) margin()作为偏移getImageX/getImageY保持与 canvas 一致的布局语义。六、为什么需要填充静区、容错等级与识别上限二维码能稳定识别靠的是模块本身之外的一圈静区quiet zone。官方文档 index.zh-CN.md 的注意章节给出了两条与本主题直接相关的工程经验内容上限nzValue保守上限为 738 或更少字符如果使用了容错等级上限还会进一步降低。填充本身不消耗内容容量但如果nzSize固定而nzPadding过大模块会变得更小、更难扫描因此应避免在内容接近上限时使用过大的 padding。容错等级Error Correction Level组件默认nzLevelM可纠正约 15% 错误。四级容错为L约 7%、M约 15%、Q约 25%、H约 30%。并非所有位置都可缺损——三个定位角直接影响初始定位中间的内容编码区才可容忍缺损。当链接很短内容编码信息少时不同容错等级生成的图片不会发生变化。这一点与 padding 的实践关联在于合理留白 足够容错等级是二维码在深色背景、图标遮挡等恶劣条件下仍可扫描的双保险。关于容错等级的内部实现可参看 utils.ts 的ERROR_LEVEL_MAPL/M/Q/H 分别映射到 qrcodegen 的Ecc.LOW/MEDIUM/QUARTILE/HIGH以及 qrcode-data.ts 中基于qrcodegen.encodeSegments的编码流程。七、常见用法与注意事项小结基于 padding.ts 示例与源码行为整理出以下可落地的实践建议最小可扫描留白二维码规范通常要求静区宽度不少于 4 个模块示例中nzPadding2属于轻度留白左右各 2 格适合模块数较多的场景在打印、深色卡片等场景可适当加大。配合 nzBgColor 使用nzPadding区域以nzBgColor绘制默认白底是最稳妥的选择若自定义nzBgColor请确保与周边底色一致否则填充区会呈现色块。两种渲染类型行为一致canvas与svg对nzPadding的语义完全相同可按需选择。SVG 适合缩放与导出场景矢量清晰canvas 适合截图与高频重绘场景。与 nzBordered 区分nzBordered默认true控制的是二维码外框描边宿主类ant-qrcode-border见 qrcode.component.ts与nzPadding的内部留白是两回事两者可叠加使用。输入防御nzPadding最终经过Math.max(Math.floor(x), 0)归一化传入负数或小数会被安全钳制不必担心产生非法布局。八、延伸阅读完整 API 与容错等级说明QRCode 官方文档中文示例源码padding.ts 及其他 democolor.md、icon.md、status.md、download.md组件实现qrcode.component.ts、qrcode-canvas.component.ts、qrcode-svg.component.ts数据与工具函数qrcode-data.ts、utils.ts组件测试qrcode.component.spec.ts以上路径均位于本仓库components/qr-code目录下可对照源码进一步验证文中所述实现细节。赞分享UI组件前端【免费下载链接】ng-zorro-antdAngular UI Component Library based on Ant Design项目地址https://gitcode.com/gh_mirrors/ng/ng-zorro-antd点击查看免费下载相关推荐ng-zorro-antd Badge 封顶数字nzOverflowCount完整指南从 Demo 到源码实现ng zorro antd Badge 封顶数字nzOverflowCount完整指南从 Demo 到源码实现 导读 本指南围绕 ng zorro antUI组件前端ng-zorro-antd 浮动按钮组弹出方向nzPlacement完整指南从 Demo 到源码实现ng zorro antd 浮动按钮组弹出方向nzPlacement完整指南从 Demo 到源码实现 导读 本篇指南聚焦 ng zorro antd 中UI组件前端ng-zorro-antd Grid 栅格 nzFlex 属性完全指南从 Flex 填充到弹性布局实战ng zorro antd Grid 栅格 nzFlex 属性完全指南从 Flex 填充到弹性布局实战 nz col 提供的 nzFlex 属性是 ng zoUI组件前端上一篇MobX进阶教程如何自定义observables和扩展MobX功能下一篇如何通过Free-courses-with-Certificates快速获得10技术认证创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考