纯 CSS 多边形绘制实战:border 与 transform 打造梯形、五角星、钻石与爱心(You-need-to-know-css)
前端文档教程【免费下载链接】You-need-to-know-cssCSS tricks for web developers~项目地址https://gitcode.com/gh_mirrors/yo/You-need-to-know-css点击查看免费下载在 You-need-to-know-css 的 Shapes常见形状专题中polygon.md 集中演示了六种其他多边形的纯 CSS 画法——梯形、五角星、缎带、钻石、爱心与军衔人字纹。它们不依赖任何图片或 SVG仅靠border的几何特性与transform的旋转/倾斜拼装而成。读完本文你将掌握边框三角形/梯形的构造原理、box-sizing对形状几何的关键影响以及多伪元素拼合复合图形的完整套路并能直接复制代码在项目中落地。背景知识border 形状的几何原理多边形绘制依赖两个前置属性box-sizing与transform原文档亦将二者列为背景知识。它们的核心作用分别在于box-sizing决定边框是否被计入元素的width/height。边框画形状的核心思路是利用相邻边框的 45° 斜角拼接因此必须清楚知道边框在盒子之外占了多少尺寸transform用于把若干个基本形三角形、矩形旋转或倾斜拼出五角星、爱心这类无法用一个元素直接画出的复合多边形。box-sizing决定 border 画法成败的开关polygon.md 开头有一行全局重置*{ box-sizing: border-box; }border-box会让width/height把边框与内边距包含在内这对日常布局是友好的但边框画形状恰恰依赖边框在内容盒之外的默认几何。因此示例在形状元素上显式恢复默认模式main .item div { box-sizing: content-box; }以梯形为例元素width: 80px; height: 0border: 40px solid。在content-box下实际总宽度为80 40 40 160px左右各 40px 的边框才会按预期向外延伸、形成斜边若沿用border-box边框会被压缩进 80px 内形状几何将完全变形。这一处重置里的再重置正是本示例能正确渲染的关键细节也解释了为什么全局重置后还要在形状容器上单独声明。transform把基本形拼成复合形transform的rotateZ()与skewY()在本示例中承担两类任务旋转拼合五角星由 1 个主体三角形 2 个伪元素三角形分别以rotateZ(35deg)、rotateZ(-35deg)、rotateZ(-70deg)旋转后叠放而成爱心则由两个圆角矩形以rotateZ(45deg)/rotateZ(-45deg)绕底部内角旋转拼出倾斜成型军衔人字纹用skewY(6deg)与skewY(-6deg)把左右两半矩形向中间收拢形成 V 形。先看演示仓库里的交互式多边形示例polygon.md 与中文版 zh-cn/polygon.md 都内嵌了一个 VueP 在线可运行模板vuep template#polygon_tlp/vuep与script v-pre typetext/x-template idpolygon_tlp。该仓库用 docsify 搭建文档站index.html 中引入了vue.min.js、vuep.min.js与babel.min.js均位于 libs/使得每个技巧页都能在浏览器里即时编辑、即时预览。按 README.md 的 Quick start 即可本地运行整个文档站npm install docsify-cli -g # 或 yarn global add docsify-cli docsify serve # 然后浏览器打开 http://localhost:3000打开/polygon页面即可看到六种形状并排展示的交互演示修改模板代码后效果实时刷新非常适合边改边理解各形状的几何构成。演示的外层容器同样值得留意main { width: 100%; padding: 60px 0; display: flex; justify-content: center; align-items: center; flex-wrap: wrap; } main div.item { min-width: 199px; height: 200px; padding: 20px; border: 1px solid #f5f5f5; flex: 1; display: flex; justify-content: center; align-items: center; } main div.item:not(:nth-child(3n)):not(:last-child) { border-right-width:0; }每个.item是一个 199px 起步、等高 200px 的卡片flex: 1让卡片在换行时均匀伸展:not(:nth-child(3n)):not(:last-child)选择器把非第三列、非末位的卡片右边框置 0形成干净的分隔网格线卡片内部用 Flex 居中承载形状元素保证六种形状在不同宽度下视觉统一。六种多边形的实现与拆解梯形trapezoid.trapezoid { width: 80px; height: 0; border: 40px solid #fff; border-top: 0 solid; border-bottom: 80px solid #b4a078; }这是最经典的边框梯形元素高度为 0四边先统一声明 40px 边框再通过border-top: 0 solid将顶边清零、border-bottom: 80px加厚底边。渲染结果中彩色底边框形成梯形的大底左右白色边框因相邻边框 45° 斜角拼接而成为两条斜边顶边为 0 使小顶恰好等于内容区宽度 80px。需要说明的是示例中左右边框用#fff是因为演示页背景为白色若页面背景不是白色一般可将其换成与背景一致的颜色或transparent效果等同。五角星star-5-points.star-5-points { width: 0; height: 0; position: relative; margin: 50px 0; border: 80px solid rgba(0,0,0,0); border-top: 0 solid; border-bottom: 56px solid #b4a078; transform: rotateZ(35deg); } .star-5-points::before { content: ; width: 0; height: 0; position: absolute; top: -36px; left: -52px; border: 24px solid rgba(0,0,0,0); border-top: 0 solid; border-bottom: 64px solid #b4a078; transform: rotateZ(-35deg); } .star-5-points::after { content: ; width: 0; height: 0; position: absolute; top: 3px; left: -86px; border: 80px solid rgba(0,0,0,0); border-top: 0 solid; border-bottom: 56px solid #b4a078; transform: rotateZ(-70deg); }五角星是典型的边框三角形拼合案例。width: 0; height: 0时只给border-bottom上色、其余三边设为rgba(0,0,0,0)透明即可得到一个等腰三角形——底边宽度等于左右边框之和高度等于底边框厚度。示例用主体元素一个底边 160px8080、高 56px 的三角形rotateZ(35deg)::before伪元素一个底边 48px2424、高 64px 的小三角形旋转 -35°定位在top:-36px; left:-52px::after伪元素一个与主体等大的三角形旋转 -70°定位在top:3px; left:-86px。三个三角形在position: relative的容器内旋转叠放恰好交错成五角星的五个尖角。调整各三角形的尺寸、角度与偏移量即可得到不同比例的五角星。缎带ribbon.ribbon { width: 0; height: 80px; border: 40px solid #b4a078; border-top: 0 solid; border-bottom: 28px solid rgba(0,0,0,0); }缎带的构造与梯形相反这次保留左右和上边框高 80px 的垂直色带把底边框设为 28px 透明。透明底边框与左右彩色边框在底部形成 45° 斜角产生向下的V 形收口形似横幅/缎带的燕尾末端。border-top: 0 solid仍是为了消除顶部多余的边框厚度。钻石diamond.diamond { width: 50px; height: 0; position: relative; margin: 20px 0 82px; border: 25px solid rgba(0,0,0,0); border-top-width: 0; border-bottom-color: #b4a078; } .diamond::after { content: ; width: 0; height: 0; position: absolute; top: 25px; left: -25px; border: 50px solid rgba(0,0,0,0); border-top: 70px solid #b4a078; border-bottom-width: 0; }钻石菱形由两个反向的三角形拼接而成主体元素border-bottom-color上色、左右透明得到向上指的三角形上半个菱形::after伪元素border-top: 70px上色、其余透明得到向下指的三角形下半个菱形定位在top:25px; left:-25px恰好与上半部分尖对尖拼接。注意写法上的差异主体用border-top-width: 0清顶边伪元素用border-bottom-width: 0清底边且伪元素边框整体更宽50px以匹配主体三角形的宽度保证接缝对齐。爱心heart.heart { content: ; display: block; width: 100px; min-height: 80px; position: relative; transform-origin: 50% 50% 0; } .heart:before { content: ; display: block; width: 50px; height: 80px; position: absolute; top: 0; left: 50px; border-radius: 50px 50px 0 0; background: #b4a078; transform: rotateZ(-45deg); transform-origin: 0 100% 0; } .heart:after { content: ; display: block; width: 50px; height: 80px; position: absolute; top: 0; left: 0; border-radius: 50px 50px 0 0; background: #b4a078; transform: rotateZ(45deg); transform-origin: 100% 100% 0; }爱心不再依赖边框而是两个上圆下方的矩形旋转重叠两个伪元素都是50px × 80px、border-radius: 50px 50px 0 0的圆顶矩形:before位于右侧left: 50pxtransform-origin: 0 100%左下角为旋转轴心旋转 -45°:after位于左侧left: 0transform-origin: 100% 100%右下角为轴心旋转 45°。两个矩形绕底部内角旋转后圆顶在上方形成左右两个心瓣矩形底部在下方汇聚成心尖组合出标准心形。transform-origin在这里是决定旋转后能否对齐拼合的关键参数。军衔人字纹army-chevron.army-chevron { width: 200px; height: 60px; position: relative; margin: 0 0 6px; padding: 12px; text-align: center; } .army-chevron::before { content: ; width: 51%; height: 100%; position: absolute; top: 0; left: 0; background: #b4a078; transform: skewY(6deg); } .army-chevron::after { content: ; width: 50%; height: 100%; position: absolute; top: 0; right: 0; background: #b4a078; transform: skewY(-6deg); }人字纹类似军衔臂章的 V 形章由两个被剪切倾斜的半矩形拼成左半部分skewY(6deg)、右半部分skewY(-6deg)两者相向倾斜、在中间交会形成 V 形尖角。细节上左侧宽度取51%而右侧取50%略微重叠以消除相邻两半之间可能出现的缝隙。容器预留padding: 12px与text-align: center如需在纹章中间放置文字也留有空间。完整可运行代码把 polygon.md 中的容器与六种形状整合在一起即得到一份可直接复制运行的完整示例形状颜色统一使用#b4a078该配色取自仓库文档约定的网易严选设计色详见 introduce.mdstyle *{ box-sizing: border-box; } main { width: 100%; padding: 60px 0; display: flex; justify-content: center; align-items: center; flex-wrap: wrap; } main div.item { min-width: 199px; height: 200px; padding: 20px; border: 1px solid #f5f5f5; flex: 1; display: flex; justify-content: center; align-items: center; } main div.item:not(:nth-child(3n)):not(:last-child) { border-right-width:0; } main .item div { box-sizing: content-box; } .trapezoid { width: 80px; height: 0; border: 40px solid #fff; border-top: 0 solid; border-bottom: 80px solid #b4a078; } .star-5-points { width: 0; height: 0; position: relative; margin: 50px 0; border: 80px solid rgba(0,0,0,0); border-top: 0 solid; border-bottom: 56px solid #b4a078; transform: rotateZ(35deg); } .star-5-points::before { content: ; width: 0; height: 0; position: absolute; top: -36px; left: -52px; border: 24px solid rgba(0,0,0,0); border-top: 0 solid; border-bottom: 64px solid #b4a078; transform: rotateZ(-35deg); } .star-5-points::after { content: ; width: 0; height: 0; position: absolute; top: 3px; left: -86px; border: 80px solid rgba(0,0,0,0); border-top: 0 solid; border-bottom: 56px solid #b4a078; transform: rotateZ(-70deg); } .ribbon { width: 0; height: 80px; border: 40px solid #b4a078; border-top: 0 solid; border-bottom: 28px solid rgba(0,0,0,0); } .diamond { width: 50px; height: 0; position: relative; margin: 20px 0 82px; border: 25px solid rgba(0,0,0,0); border-top-width: 0; border-bottom-color: #b4a078; } .diamond::after { content: ; width: 0; height: 0; position: absolute; top: 25px; left: -25px; border: 50px solid rgba(0,0,0,0); border-top: 70px solid #b4a078; border-bottom-width: 0; } .heart { content: ; display: block; width: 100px; min-height: 80px; position: relative; transform-origin: 50% 50% 0; } .heart:before { content: ; display: block; width: 50px; height: 80px; position: absolute; top: 0; left: 50px; border-radius: 50px 50px 0 0; background: #b4a078; transform: rotateZ(-45deg); transform-origin: 0 100% 0; } .heart:after { content: ; display: block; width: 50px; height: 80px; position: absolute; top: 0; left: 0; border-radius: 50px 50px 0 0; background: #b4a078; transform: rotateZ(45deg); transform-origin: 100% 100% 0; } .army-chevron { width: 200px; height: 60px; position: relative; margin: 0 0 6px; padding: 12px; text-align: center; } .army-chevron::before { content: ; width: 51%; height: 100%; position: absolute; top: 0; left: 0; background: #b4a078; transform: skewY(6deg); } .army-chevron::after { content: ; width: 50%; height: 100%; position: absolute; top: 0; right: 0; background: #b4a078; transform: skewY(-6deg); } /style main div classitemdiv classtrapezoid/div/div div classitemdiv classstar-5-points/div/div div classitemdiv classribbon/div/div div classitemdiv classdiamond/div/div div classitemdiv classheart/div/div div classitemdiv classarmy-chevron/div/div /main浏览器支持polygon.md 在文末为两个基础特性内嵌了 caniuse 支持数据box-sizingcss3-boxsizing本示例所有形状的几何计算都依赖它是现代浏览器均已支持的基础属性transformtransforms3d示例中五角星、爱心、人字纹都使用了rotateZ/skewY变换属于 transform 的 2D 能力范畴。此外introduce.md 中明确说明文档内示例未额外添加浏览器前缀建议在 Chrome、Firefox 等主流浏览器中查看投入生产环境时可使用 Autoprefixer 这类工具自动补齐前缀以处理兼容性。延伸阅读仓库中更多形状技巧本专题在 _sidebar.md 中被归入 Shapes常见形状分类除 polygon.md 外仓库还提供了多条可直接对照的形状方案parallelogram.md平行四边形的三种实现——嵌套元素skewX反相修正、伪元素背景倾斜推荐以及基于clip-path: polygon()的菱形图片裁剪含 hover 过渡动画bevel-corners.md切角八角形效果其中clip-path: polygon(...)用顶点坐标精确切出斜角ellipse.md借助border-radius的/语法实现圆、半圆、半椭圆与四分之一圆pie-chart.md用渐变、旋转动画与 SVGstroke-dasharray绘制饼图与多边形同属形状章节可相互印证transform旋转在图形绘制中的灵活用法。从中可以总结出一条通用经验能用border几何解决的基础形三角形、梯形优先用边框画需要复合拼接或裁剪的复杂形五角星、爱心、切角图片则组合transform旋转/倾斜或clip-path: polygon()顶点坐标完成。这正是 polygon.md 与其他形状文档共同构成的完整纯 CSS 造形方法论。赞分享前端文档教程【免费下载链接】You-need-to-know-cssCSS tricks for web developers~项目地址https://gitcode.com/gh_mirrors/yo/You-need-to-know-css点击查看免费下载相关推荐VisionReward-Image清华团队发布多维度视觉评估模型重构AI审美标准VisionReward Image清华团队发布多维度视觉评估模型重构AI审美标准 导语 清华大学团队推出的VisionReward Image模型通过将前端文档教程You-need-to-know-css 实战四种纯 CSS 方案实现切角效果bevel cornersYou need to know css 实战四种纯 CSS 方案实现切角效果bevel corners 切角bevel corners / cutou前端文档教程LeetCode《面试题 01.03. URL 化》解法全解doocs/leetcode 仓库中空格替换 %20 的多语言实现剖析LeetCode《面试题 01.03. URL 化》解法全解doocs/leetcode 仓库中空格替换 %20 的多语言实现剖析 导读 本文以 lcci/0前端文档教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

AI辅助开发App全流程实操:从需求梳理到上架避坑指南

AI辅助开发App全流程实操:从需求梳理到上架避坑指南

用AI工具把App从想法变成产品,我的全流程实操记录 先说个结论:AI确实能让你一个人干出一个App,但前提是你得清楚它在每一环节到底能帮到什么程度。我最近完整走了一遍“用AI工具快速开发一个App”的全流程,从需求梳理到上架准备&a…

2026/10/13 12:10:58 阅读更多 →
计量芯片通讯校验和机制全解析:从原理到量产排障

计量芯片通讯校验和机制全解析:从原理到量产排障

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 12:09:58 阅读更多 →
C++日期类设计:运算符重载与天数转换的完整实践

C++日期类设计:运算符重载与天数转换的完整实践

1. 项目概述与需求拆解1.1 这个日期类到底在解决什么问题第一次看到“设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算,如一日期加上天数、一日期减去天数、两日期相差的天数等”这个题目时,我第一反应是&#xff…

2026/10/13 12:09:58 阅读更多 →

最新新闻

从零搭建ELK日志分析平台:架构设计、组件选型与实战调优

从零搭建ELK日志分析平台:架构设计、组件选型与实战调优

说实话,我在接手公司日志平台之前,排查故障靠的是“三件套”组合拳:登录服务器、grep关键字、tail -f盯屏幕。最开始那几年业务量不大,这招勉强够用,可一旦服务器数量超过两位数、日志格式五花八门,这套土办…

2026/10/13 12:58:10 阅读更多 →
数论基础实战:从紫书第10章到Kuangbin专题14的题型拆解

数论基础实战:从紫书第10章到Kuangbin专题14的题型拆解

如果你正卡在紫薯第10章数学,准备转战Kuangbin专题14数论基础,我给你一句忠告——书上的公式全会了,不代表你看到题目能动手。我当年啃完紫书第10章,带着一堆“看起来都能推导”的公式点开专题14,第一题就把我按在地上…

2026/10/13 12:58:10 阅读更多 →
Conda报错排查指南:从repodata失败到依赖冲突的完整解决

Conda报错排查指南:从repodata失败到依赖冲突的完整解决

两行红字一贴,小白当场懵,老手也得先深吸一口气。Collecting package metadata (current_repodata.json): failed和Solving environment: failed这对组合,几乎每个用过 Anaconda 的人都撞见过:刚装完环境准备conda install pandas…

2026/10/13 12:58:10 阅读更多 →
基于Halton序列的图像加密解密算法详解与Matlab实现

基于Halton序列的图像加密解密算法详解与Matlab实现

做图像加密解密这个方向的,八成都有过这种感受:教材里的经典算法讲得头头是道,真到自己动手复现,却总在“看起来像那么回事”和“实际效果经不起推敲”之间反复横跳。我之前在做基于Halton序列的图像加密解密项目时,最…

2026/10/13 12:58:10 阅读更多 →
Kettle 9.3 源码编译实战:从 GitHub 构建可部署的 PDI 生产环境

Kettle 9.3 源码编译实战:从 GitHub 构建可部署的 PDI 生产环境

简介:本资源为Kettle(Pentaho Data Integration)最新9.3版本的官方安装包百度网盘直链,面向数据工程师、ETL开发人员及大数据初学者,解决国内用户因网络限制难以获取国际开源ETL工具的问题。资源以1个14KB的docx文档形…

2026/10/13 12:58:10 阅读更多 →
Agent上线最后一公里:评测门禁、可观测性埋点与AgentOps闭环落地指南

Agent上线最后一公里:评测门禁、可观测性埋点与AgentOps闭环落地指南

1. 从"能跑"到"敢上线":Agent 交付的最后一公里到底卡在哪做过 Agent 项目的人大概都有过这种体验:本地 Demo 跑得飞起,工具调用、多轮对话、RAG 检索全都正常,演示给同事看的时候掌声一片。可真到了要往生产…

2026/10/13 12:57:09 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →