一、CSS三角函数是什么?

你可能听说过sin()cos()这些数学函数,现在它们悄悄溜进了CSS的世界。简单来说,CSS Trigonometric Functions(三角函数)让我们可以直接在样式表中计算角度、距离和位置,不用再依赖JavaScript或者复杂的公式。

比如你想让一堆小图标均匀地排列在一个圆圈上,以前可能需要写循环计算坐标,现在用cos()sin()就能轻松搞定。

技术栈:纯CSS

/* 定义一个圆形菜单,8个按钮均匀分布 */
.circle-menu {
  position: relative;
  width: 300px;
  height: 300px;
  margin: 50px auto;
}

.menu-item {
  position: absolute;
  width: 50px;
  height: 50px;
  background: #3498db;
  border-radius: 50%;
  /* 使用三角函数计算位置 */
  /* 角度递增45度(360/8),半径100px */
  top: calc(50% + sin(calc(var(--i) * 45deg)) * 100px - 25px);
  left: calc(50% + cos(calc(var(--i) * 45deg)) * 100px - 25px);
}
<div class="circle-menu">
  <div class="menu-item" style="--i: 0;"></div>
  <div class="menu-item" style="--i: 1;"></div>
  <!-- 省略其他6个... -->
</div>

注释说明:

  • --i是自定义属性,表示第几个元素
  • sin(角度)cos(角度)会返回-1到1之间的值
  • 乘以半径100px后得到偏移量
  • 最后减去元素宽度的一半(25px)实现居中

二、波形动画的魔法

三角函数最擅长的就是制造平滑的周期性运动。比如我们要做一个呼吸灯效果,或者模拟水波纹扩散,用sin()函数就能让动画变得自然流畅。

技术栈:纯CSS

.wave {
  width: 100px;
  height: 100px;
  background: #e74c3c;
  border-radius: 50%;
  animation: pulse 2s infinite;
}

@keyframes pulse {
  0%, 100% {
    /* 通过sin函数产生0到1之间的波动 */
    transform: scale(calc(1 + sin(0turn) * 0.2));
  }
  50% {
    /* 0.25turn等于90度,sin达到峰值1 */
    transform: scale(calc(1 + sin(0.25turn) * 0.2));
  }
}

注释说明:

  • 0turn表示0度,1turn表示360度
  • scale(1 + sin() * 0.2)让元素在原始大小上下波动20%
  • 关键帧设置在0%、50%、100%实现平滑循环

更复杂的波浪效果可以结合多个动画:

.wave-box {
  height: 100px;
  background: linear-gradient(
    to right,
    #3498db,
    #2ecc71
  );
  /* 两个不同频率的波浪叠加 */
  mask: 
    radial-gradient(
      circle at 25% 50%,
      black calc(20% + sin(var(--time)) * 15%),
      transparent 0
    ),
    radial-gradient(
      circle at 75% 50%,
      black calc(20% + cos(var(--time)) * 15%),
      transparent 0
    );
  animation: wave 3s linear infinite;
}

@property --time {
  syntax: "<angle>";
  initial-value: 0deg;
  inherits: false;
}

@keyframes wave {
  to {
    --time: 1turn;
  }
}

三、实际应用场景

  1. 圆形导航菜单
    像开头展示的那样,用三角函数可以轻松实现雷达扫描式的菜单布局,比传统定位方式更灵活。

  2. 数据可视化
    在饼图或雷达图中,不需要依赖SVG或Canvas,直接用CSS就能绘制准确的角度标记。

  3. 动态背景
    创建会"呼吸"的背景图案,比如模拟水面波纹、浮动气泡等效果。

  4. 加载动画
    让多个元素沿着复杂路径运动,比如模拟行星轨道。

技术栈:纯CSS

/* 行星轨道示例 */
.orbit {
  position: relative;
  width: 200px;
  height: 200px;
}

.planet {
  position: absolute;
  width: 20px;
  height: 20px;
  background: #f1c40f;
  border-radius: 50%;
  top: calc(50% + sin(var(--angle)) * 80px - 10px);
  left: calc(50% + cos(var(--angle)) * 80px - 10px);
  animation: orbit 5s linear infinite;
  animation-delay: calc(var(--i) * -1s);
}

@keyframes orbit {
  to {
    --angle: 1turn;
  }
}

四、注意事项与总结

虽然CSS三角函数很强大,但使用时要注意:

  1. 浏览器支持
    目前所有现代浏览器都支持,但老旧设备可能需要备用方案。

  2. 性能考量
    过度复杂的计算可能影响渲染性能,特别是在低端设备上。

  3. 可读性
    大量嵌套的calc()和三角函数会让代码难以维护,建议合理拆分。

  4. 单位处理
    角度单位可以用deg、rad或turn,但要保持一致性。

总的来说,CSS Trigonometric Functions为我们打开了新世界的大门,让很多原本需要JavaScript的视觉效果现在用纯CSS就能实现。从简单的圆形布局到复杂的波形动画,这些数学函数让样式表变得更加强大和灵活。下次当你需要处理环形布局或周期性动画时,不妨试试这些三角函数,可能会收获意想不到的效果!