html5如何实现图片形状裁剪_html5自定义形状裁剪【代码】

CSS clip-path 是目前最轻量、无需 JS、不破坏语义的任意形状裁剪方案,支持 SVG 路径和基础几何函数,Chrome 73+、Firefox 68+、Safari 15.4+ 稳定支持,IE 完全不支持,Edge 旧版亦不支持。

clip-path 实现任意形状裁剪最直接

HTML5 本身不提供“图片裁剪成心形/星形”这类原生 API,但现代浏览器(Chrome 73+、Firefox 68+、Safari 15.4+)已稳定支持 CSS clip-path,它能用 SVG 路径或基础几何函数定义可见区域,是目前最轻量、无需 JS、不破坏语义的方案。

注意:IE 完全不支持,Edge 旧版(

  • clip-path: circle(50% at 50% 50%) → 圆形裁剪(居中,半径为宽高最小值的一半)
  • clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%) → 矩形(等效于无裁剪)
  • clip-path: path("M20,50 Q50,10 80,50 T140,50") → 使用 SVG path 字符串(需转义双引号,且 Safari 对 path() 支持较晚)

用内联 SVG 精确控制复杂轮廓

当需要五角星、波浪边、手绘路径等非规则图形时,clip-pathpath() 函数可能受限(尤其 Safari 15.4 之前),更稳妥的方式是把 定义在 SVG 中,再通过 URL 引用。

关键点:SVG 必须放在 内,且引用时路径需带 ID;图片要用 标签(不能是 CSS background-image),否则裁剪不生效。


  
    
      
    
  

@@##@@

Canvas 裁剪适合动态生成或老浏览器兜底

如果必须支持 IE 或需要运行时计算裁剪形状(比如鼠标拖拽调整星形顶点),就得用 Canvas。核心是调用 ctx.clip() —— 它不是“把图切掉”,而是**设置后续绘制的遮罩区域**,所以得先画路径,再 drawImage

容易踩的坑:clip() 只对之后的绘制生效,且默认裁剪区域是整个 canvas,不手动 beginPath() + moveTo() 就会出错;另外,Canvas 像素操作无法响应式缩放,需监听 window.resize 重绘。

  • ctx.beginPath(),再用 ctx.moveTo()/ctx.lineTo() 描出形状
  • 调用 ctx.clip() 锁定裁剪区
  • ctx.drawImage(img, dx, dy, dw, dh) 把图“画进”该区域
  • 若要导出裁剪后图片,用 canvas.toDataURL()

别忽略尺寸与坐标系差异

clip-path 的百分比单位基于元素自身

盒模型(border-box),而 SVG 默认使用用户坐标系(即 viewBox 定义的坐标空间),Canvas 则完全基于像素。三者混用时极易错位。

例如:一张 width="300",用 clip-path: circle(100px at 150px 150px) 是精确的;但若把它放进 viewBox="0 0 300 300" 的 SVG ,同样数值才匹配。没设 viewBox 的 SVG, 会按 100%×100% 解析,导致形状被拉伸。

最省事的做法:统一用相对单位(%)或确保所有上下文的宽高一致;调试时临时加 outline: 1px solid red 看元素实际尺寸。