使用 clip-path: shape() 创建 Squircle 形状

你是否厌倦了传统的方形和圆形元素?想要为你的网页或设计增添一些独特的曲线美?今天,就让我们一起来探索如何使用CSS的clip-path属性来创建一个时尚的 Squircle 形状吧!

什么是Squircle?

Squircle,顾名思义,是Square(方形)和Circle(圆形)的结合体。它既有方形的棱角感,又融入了圆形的柔和曲线,给人一种既现代又舒适的视觉感受。

核心思路

由于corner-shape(专门实现Squircle的属性)目前浏览器支持度有限,我们通过clip-path: shape()来模拟实现,核心是用CSS变量统一控制弧度,通过数学计算让边角的曲线过渡更自然,变量可直接用百分比或像素值,灵活度拉满。

完整实现代码

直接复制这段代码,就能快速实现基础的Squircle效果,关键变量--r可直接调整,0%为纯正方形,50%为极致的Squircle效果,中间数值可按需自定义。

CSS 复制代码
/* 基础Squircle样式,直接复用 */
.squircle {
  --r: 50%; /* 控制弧度,0%=正方形,50%=Squircle,支持像素值如20px */
  --_r: clamp(0%,var(--r)/2,25%);
  --_v: calc(var(--_r)*(1 - sqrt(2)/4));
  --_p: calc(var(--_v) - var(--_r)/2);
  clip-path: shape(
    from var(--_v) var(--_p),
    curve to 50% 0 with var(--_r) 0,
    curve to calc(100% - var(--_v)) var(--_p) with calc(100% - var(--_r)) 0,
    curve to calc(100% - var(--_p)) var(--_v) with calc(100% - 2*var(--_p)) calc(2*var(--_p)),
    curve to 100% 50% with 100% var(--_r),
    curve to calc(100% - var(--_p)) calc(100% - var(--_v)) with 100% calc(100% - var(--_r)),
    curve to calc(100% - var(--_v)) calc(100% - var(--_p)) with calc(100% - 2*var(--_p)) calc(100% - 2*var(--_p)),
    curve to 50% 100% with calc(100% - var(--_r)) 100%,
    curve to var(--_v) calc(100% - var(--_p)) with var(--_r) 100%,
    curve to var(--_p) calc(100% - var(--_v)) with calc(2*var(--_p)) calc(100% - 2*var(--_p)),
    curve to 0 50% with 0 calc(100% - var(--_r)),
    curve to var(--_p) var(--_v) with 0 var(--_r),
    curve to var(--_v) var(--_p) with calc(2*var(--_p)) calc(2*var(--_p))
  );
}

Demo 地址:codepen.io/editor/aire...

对比演示:clip-path实现 vs corner-shape原生

为了让大家直观看到效果差异,我们做一个可交互的对比demo,一边是clip-path: shape()的模拟实现,一边是corner-shape的原生实现,还能通过滑块实时调整弧度,代码如下(可直接运行测试)。

CSS 复制代码
.squircle {
  --r: 40%;
  --_r: clamp(0%,var(--r)/2,25%);
  --_v: calc(var(--_r)*(1 - sqrt(2)/4));
  --_p: calc(var(--_v) - var(--_r)/2);
        clip-path: shape(
    from var(--_v) var(--_p),
    curve to 50% 0 with var(--_r) 0,
    curve to calc(100% - var(--_v)) var(--_p) with calc(100% - var(--_r)) 0,
    curve to calc(100% - var(--_p)) var(--_v) with calc(100% - 2*var(--_p)) calc(2*var(--_p)),
    curve to 100% 50% with 100% var(--_r),
    curve to calc(100% - var(--_p)) calc(100% - var(--_v)) with 100% calc(100% - var(--_r)),
    curve to calc(100% - var(--_v)) calc(100% - var(--_p)) with calc(100% - 2*var(--_p)) calc(100% - 2*var(--_p)),
    curve to 50% 100% with calc(100% - var(--_r)) 100%,
    curve to var(--_v) calc(100% - var(--_p)) with var(--_r) 100%,
    curve to var(--_p) calc(100% - var(--_v)) with calc(2*var(--_p)) calc(100% - 2*var(--_p)),
    curve to 0 50% with 0 calc(100% - var(--_r)),
    curve to var(--_p) var(--_v) with 0 var(--_r),
    curve to var(--_v) var(--_p) with calc(2*var(--_p)) calc(2*var(--_p))
  );
}

.corner-shape {
  --r: 40%;
  border-radius: var(--r);
  corner-shape: squircle;
}

Demo 地址:codepen.io/editor/aire...

总结

这次的技巧核心是用clip-path: shape()弥补corner-shape的兼容性不足,通过 CSS 变量让 Squircle 效果的调节更简单,一行代码修改弧度,适配各类前端样式开发需求。

这种丝滑的圆角效果,用在按钮、卡片、头像等元素上,能让页面的视觉质感提升一个档次,大家赶紧把代码收藏起来,下次开发直接复用~

扩展阅读

相关推荐
222you8 分钟前
Claude Code接入DeepSeek-v4模型
java·服务器·前端
轻口味21 分钟前
AI 时代全栈开发破局:TypeScript 生态实战,从入门到部署一站式通关
前端·mongodb·docker·ai·typescript·react·next.js
ZC跨境爬虫30 分钟前
跟着MDN学HTML_day_45:(EventTarget接口)
前端·javascript·ui·html·媒体
漂移的电子44 分钟前
【el-tree】外层多选,某个属性内层单选
前端·javascript·vue.js
BJ-Giser1 小时前
Cesium 体积光阴影率分析和阴影体渲染效果
前端·可视化·cesium
幽络源小助理1 小时前
YK一点资讯Zblog主题源码, 游戏攻略新闻资讯模板
前端·php源码
RPGMZ1 小时前
RPGMZ NPC头顶自动显示一段消息
前端·游戏引擎·rpgmz·rpgmakermz
DFT计算杂谈1 小时前
AMSET 设置多核并行计算
java·前端·css·html·css3
花椒技术1 小时前
AI 协同开发落地复盘:1 小时生成首版后,为什么 Review 和修正又花了 2-3 天
前端·人工智能·架构
万少2 小时前
万少用9个AI工具,帮朋友完成了一个"不可能"的项目
前端