跳转到主内容
极星编程网:以代码为星,赴技术山海!

怎样用CSS制作环形菜单展开效果_通过sin与cos函数计算坐标

环形菜单坐标计算必须用 Math.sin 和 Math.cos,因为其本质是极坐标转直角坐标:cos 得 x 偏移,sin 得 y 偏移(CSS 中需取负以匹配逆时针视觉);JS 三角函数只接受弧度,角度须转为 Math.PI/180 倍数;圆心基于父容器 center 定位,子项用 absolute + left/top 计算;起始角如 12 点方向为 -Math.PI/2;纯 CSS 无法运算,需 JS 计算后通过 CSS 自定义属性传参并配合 calc 使用;transform rotate+translate 易错位,推荐绝对定位;响应式需动态适配半径与圆心,确保触摸区域≥44px。 环形菜单坐标计算为什么必须用
Math.sin
和
Math.cos
因为环形布局本质是极坐标转直角坐标:每个菜单项在圆周上的位置由角度 θ 决定,而
Math.cos(θ)
给出 x 偏移,
Math.sin(θ)
给出 y 偏移(注意:CSS y 轴向下为正,所以实际要用
-Math.sin(θ)
才符合视觉上“逆时针展开”的直觉)。 常见错误是直接用角度值当像素偏移,或混淆弧度/角度单位——JavaScript 三角函数只认弧度,
30
度得写成
Math.PI / 6
,不是
30
。 圆心设为父容器
transform-origin
中心点(如
50% 50%
),所有子项用
position: absolute
定位 每个子项的
left
=
centerX + radius * Math.cos(angleRad)
,
top
=
centerY - radius * Math.sin(angleRad)
角度等分要从起始偏移考虑:比如想第一个菜单在正上方(12点钟方向),对应角度是
-Math.PI / 2
,不是
0
用 CSS 自定义属性配合 JS 动态生成坐标的实操方式 纯 CSS 无法运行三角函数,必须用 JS 计算坐标后注入 style 或 CSS 变量。推荐用 CSS 自定义属性传参,让动画和布局分离: 给菜单容器加
style="--item-count: 5; --radius: 120px; --start-angle: -90;"
JS 读取这些变量:
const count = parseInt(getComputedStyle(el).getPropertyValue('--item-count'))
循环计算每个项的角度(弧度):
const rad = (startDeg + i * 360 / count) * Math.PI / 180
用
el.style.setProperty('--x', (radius * Math.cos(rad)).toFixed(2) + 'px')
等设置变量,CSS 里用
left: calc(50% + var(--x))
这样动画可完全用 CSS 过渡
left
/
top
,JS 只负责初始化坐标,不参与每一帧渲染。 立即学习 “ 前端免费学习笔记(深入) ”; 使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件 如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Andr​​oid友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Andr​​oid应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更 下载
transform: rotate()
和绝对定位坐标的区别与选型 有人尝试用
transform: rotate()
+
translate()
实现环形,但要注意:旋转中心默认是元素自身中心,叠加多次 transform 容易错位;而绝对定位坐标是直接锚定到父容器,更可控、调试更直观。 如果菜单项尺寸统一且需旋转文字朝向切线方向,才考虑
rotate()
配合
translate
—— 此时需额外计算文字旋转角度:
angleRad + Math.PI / 2
若只是展开收起动效,用
opacity
和
scale
配合已算好的
left
/
top
更稳定 避免在
transition
中同时过渡
transform
和
left/top
,会触发 layout,优先全用
transform
(即改用
translateX
/
translateY
) 响应式环形菜单容易被忽略的三个坑 环形菜单在 resize 或移动端常崩,核心问题不在三角函数,而在坐标基准没随视口变化: 半径
--radius
不能写死像素值,建议用
vmin
单位或 JS 监听
resize
重算(尤其 iPad 分屏时) 圆心坐标依赖父容器宽高,若父容器用
flex
或
grid
布局,确保其
height
不为
auto
,否则
50%
计算失效 手机端触摸区域小,每个菜单项至少保证
44px × 44px
可点击区,可用
padding
扩展 hit area,但不要影响
transform-origin
位置 真正麻烦的从来不是 sin/cos 公式本身,而是把数学结果稳稳落到不同尺寸、不同缩放、不同设备的像素网格上。

相关文章