
24 边框与圆角单边边框、多值圆角与布局影响引入审批单需要左侧风险色条证书需要完整外框卡片型摘要需要圆角。统一写一个border无法表达这些差异而边框会直接影响内容可用宽度与分页。jquick-pdf 的样式模型已给出完整边框、四个单边边框和圆角属性本文以一个订单审核卡片为例说明组合方式。环境与依赖见第 21 篇。核心讲解边框的写法边框值是三段式字符串“类型 宽度 颜色”例如solid 1px #999类型用solid宽度带单位px、pt、mm、cm、in颜色用颜色名或#RRGGBB。border完整四边边框如border:solid 2px #334155。borderTop、borderRight、borderBottom、borderLeft单边边框语法与border相同如borderLeft:solid 8px #16a34a。只写单边时其余三边不会自动继承或补齐不写就是没有。这与“完整边框加局部覆盖”的直觉不同需要按期望结果显式列出。圆角的写法borderRadius圆角半径支持 1~4 个值按外扩/收缩规则依次对应四个角如borderRadius:32px 24px。borderTopLeftRadius、borderTopRightRadius、borderBottomRightRadius、borderBottomLeftRadius单独指定某个角的半径。四角一致时用单值需要上圆下直这类造型时用多值或四角属性。多值的角映射规则不直观时直接用四个borderXxxRadius属性把每个角写清楚比猜多值顺序更省事。边框与底色的组合边框颜色要和背景色一起看浅底配深边框如#f8fafc配#334155层次清晰深底配浅边框则要同时复核文字对比度。边框、底色、圆角三者共同决定卡片的观感改动其中一项都要回归另外两项。完整示例importcom.github.paohaijiao.executor.JQuickPdfFactory;importjava.nio.file.Files;importjava.nio.file.Paths;publicclassBorderDemo{publicstaticvoidmain(String[]args)throwsException{Stringtemplatepdfbody// 卡片外层完整边框 圆角div style\width:420px;padding:18px;backgroundColor:#f8fafc;border:solid 2px #334155;borderRadius:12px 12px\h1订单审核/h1// 状态行仅左边框充当状态色条用 padding 与色条隔开div style\borderLeft:solid 8px #16a34a;paddingLeft:12px\审核通过/div// 金额行仅下边框充当分隔线div style\borderBottom:solid 1px #cbd5e1;marginTop:12px\订单金额12800元/div/div/body/pdf;byte[]pdfnewJQuickPdfFactory().executeContent(template);Files.write(Paths.get(border-report.pdf),pdf);}}效果关键细节内边距决定视觉层次边框与文字之间靠padding留白borderLeft之类的属性只画线不负责间距。左侧色条若不配paddingLeft文字会紧贴色条卡片外层若不配padding内容会压在边框内侧。内边距同时向内容可用宽度收费width、两侧padding与边框宽度共同决定内容的实际可用空间。边框对内容宽度的影响边框是布局的一部分。四边边框从盒子内侧挤压内容paddingLeft会继续压缩文本行宽。宽度余量不足时文本提前换行行数增加进而影响分页位置。边框厚度建议从 1–2px 起步左侧色条这类装饰性边框可到 6–8px但要同步复核文字宽度。圆角与裁切圆角半径接近或超过盒子尺寸的一半时可能产生意外裁切或形变半径等于一半会趋近胶囊造型是否按预期渲染要看阅读器实现。内层元素的直角也可能露出圆角区域之外。圆角效果需要在目标阅读器查看不同阅读器对圆角的渲染存在差异。属性命名与引号包裹驼峰与连字符属性名互为别名例如borderRadius与border-radius示例项目里两种写法都出现过。边框值是含空格的三段式字符串写进 style 时必须用引号包裹如border:solid 2px #334155否则会被当成多个属性截断。同一文件内保持一种命名风格便于排查。边框与相邻元素的间距单边边框画在盒子的边界上。相邻块之间若没有margin上方块的borderBottom会紧贴下方块的文字分隔线显得拥挤用marginTop/marginBottom留出间距分隔线才会落在视觉上合适的位置。边距与边框一样会占用纵向空间累积后会影响分页。分页与表格边界圆角是单盒属性不会自动延续到下一页跨页或被表格拆分的带边框元素边框可能在页边界处被截断。表格单元格与分页边界处的圆角要单独测试带边框圆角的元素若被强行分页视觉上会出现断口。实战说明步骤外层使用完整border和borderRadius建立卡片轮廓。状态行只配置borderLeft用颜色承担状态语义。金额行只配置borderBottom作为分隔线。用padding把文字与边线隔开用margin控制块之间距离。执行executeContent写出 PDF。验证与结果预期卡片四边边框是否完整圆角是否生效。左侧色条与文字之间是否有间距文字贴线说明paddingLeft缺失。底部分隔线是否只出现在金额行其余边是否如预期没有边框。内容是否因边框和内边距变窄而提前换行。换用 A4、Letter 两种尺寸检查分页处的边框与圆角是否断裂。在目标阅读器确认圆角是否按预期渲染、内层元素的直角是否外露。结果预期页面出现一个浅色圆角审核卡片绿色左侧状态条与底部分隔线互不干扰文字与边线之间留有间距边框与圆角的具体观感再按目标阅读器确认。异常排查边框不显示核对值是否为“类型 宽度 颜色”三段式颜色或宽度是否缺失含空格的值是否被引号包裹。只有一边有边框确认是否只写了单边属性其余边需要时显式补上。圆角无效果或被裁切检查半径是否过大、盒子是否够大。文字换行异常检查padding与border是否吃掉了宽度。边框的业务语义同样的边框属性承担不同语义使用方式也不同作为分隔线时用borderBottom配 1px 浅色作为状态色条时用borderLeft配 6–8px 深色作为区域外框时用完整border配 1–2px。把这三类写成主题常量而不是散落的字面量模板才容易在换色时保持一致。生产注意事项把边框颜色、线宽和圆角定义为主题常量避免颜色散落在业务代码里用轻量线宽控制文件体积与布局稳定A4、Letter 两种尺寸分别回归。边框属于布局的一部分任何边框变更后都要重新检查分页。适用场景与分页控制审批卡片、发票分区、风险警示和证书外框都适合这套写法。可用backgroundColor、padding与分页控制属性如keepTogether组合出更稳的卡片但这两者都不保证长内容不被拆分——带边框圆角的块一旦跨页视觉上会出现断口仍需按实际内容验证。总结边框分为完整边框border与单边边框borderTop/borderRight/borderBottom/borderLeft值统一为“类型 宽度 颜色”圆角分为borderRadius多值与四个角单独属性。关键细节在于边框与padding共同占用内容宽度、只写单边不会让其余边继承、圆角在接近盒子尺寸时会被裁切、跨页元素的边框可能在页边界断裂。常见误区是用一个border表达所有需求或用大边框、大圆角做装饰却忽略它对可读宽度与分页的连带影响。按“完整边框、状态边框、分隔线”分层使用模板更容易维护。版本基线jquick-pdfx 4.0.0、JDK 8升级前请核对 README_zh.md 的版本对照表更多示例见 GitHub 仓库。