Superellipse超椭圆?直接顺手开发一个好看又简单的生成工具(一)

前言

第一次意识到超椭圆 Superellipse 的时候,就是小米的价值 200 万 Logo 。其圆角给人感觉很圆润,作为一名前端er,自然想能否用 CSS - border-radius 实现。后来尝试不行,才主动简单了解了一下超椭圆。

原研哉采用的就是 n = 3 的超椭圆。

而后再去观察日常生活的最常见的超椭圆可能就是各个手机系统的图标了,很多都是应用的超椭圆,只是 n 的值可能不太一样。

超椭圆的定义可以参考下面这个:

是在笛卡儿坐标系下满足以下方程式的点的集合: 其中nab 为正数。这里设置 a b 的值都为 1 ,简化为 |x|^n + |y|^n = 1

实现功能

  • 设置曲率 N 值
  • 设置 stroke fill color
  • 设置 stroke width
  • 设置 rotate
  • SVG code
  • 导出 SVG
  • 彩带效果
  • CSS Background Code
  • 预设超椭圆 Demo
  • 小彩蛋,(点击中间预览 SVG 随机 | 按下键盘空格 )更换背景色。

核心代码

ts 复制代码
async function getSuperellipsePath(
  a = 50, // X 轴半径
  b = 50, // Y 轴半径
  nX = 4, // X 轴幂指数
  nY = 4, // Y 轴幂指数
  steps = 360, // 点的个数
) {
  // 计算超椭圆的路径点
  const nX2 = 2 / nX
  const nY2 = 2 / nY
  const points = await Array.from({ length: steps }, (_, i) => {
    const t = (i * 2 * Math.PI) / steps
    const cosT = Math.cos(t)
    const sinT = Math.sin(t)
    const x = Math.abs(cosT) ** nX2 * a * Math.sign(cosT)
    const y = Math.abs(sinT) ** nY2 * b * Math.sign(sinT)
    return { x, y }
  })
  return `${points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ')} Z`
}

在线预览

superellipse.mmeme.me/

代码仓库

github.com/pinky-pig/s...

如果觉得还不错,求求大家点个 star 🌟 ,在这里磕头了🙇🙇🙇。

相关推荐
小徐_23334 小时前
wot-ui-cli 1.1.0 发布:支持 OpenCode、Antigravity,wot-ui 图标迁移不再靠猜
前端
__zRainy__4 小时前
Node.js Web 框架选型指南:从 Express 到 Hono 的全景对比
前端·node.js·express·koa·nestjs·egg·fastify
西瓜有点饿5 小时前
PostCSS 和 UnoCSS 的作用和区别
前端·postcss
伟大的兔神5 小时前
我做了一个本地优先的 AI 图片工作台:Loomora v1.0.0 正式发布
前端·javascript·vue.js
90后的晨仔6 小时前
uni-app项目 Vue3 状态管理 Pinia 完全指南:从概念到实战的深度解析
前端
90后的晨仔7 小时前
uni-app 在 iOS 平台跳转页面时移除底部安全区域的完整技术指南
前端
用户938515635077 小时前
React + JWT 登录鉴权底层原理与工程化实践
前端·react.js
zww89491117 小时前
家政派单系统开发实战:架构设计与派单算法指南
前端·系统架构
fangzhanpeng1687 小时前
(前端)2.js变量作用域样例
开发语言·前端·javascript
赵广陆8 小时前
企业实战:web服务集成
前端·pycharm·fastapi