📜  水效果 (1)

📅  最后修改于: 2023-12-03 14:55:58.078000             🧑  作者: Mango

水效果

水效果是指在图形界面或网页设计中,通过一些特殊的技术手段,使画面中的水具有动态、流动的效果。通常是通过让水的颜色和形状随时间的变化而产生出来的。

实现水效果的方式

实现水效果的方式有多种,以下列举一些主要的方式:

  1. 利用CSS动画

可以通过CSS的transform和animation属性来实现水波纹效果,具体实现可以查看代码片段

  1. 利用Canvas

Canvas是HTML5提供的一个绘图标签,通过利用它的API可以实现各种绘图效果,包括水效果。在Canvas中,可以通过绘制多条线条并逐渐变化其坐标值,从而实现水的波动效果。具体实现可以查看代码片段

  1. 利用SVG

SVG是一种基于XML的图像格式,可以在浏览器中直接显示。利用SVG的动画属性和滤镜效果,也可以实现水效果。具体实现可以查看代码片段

代码片段
CSS动画
.wave {
  position: relative;
  width: 200px;
  height: 200px;
  background: blue;
  border-radius: 50%;
  animation: wave 1.5s ease-in-out infinite;
}

@keyframes wave {
  0% {
    transform: translate(0, 0);
  }
  50% {
    transform: translate(-10px, -10px);
  }
  100% {
    transform: translate(0, 0);
  }
}
Canvas
<canvas id="canvas"></canvas>

<script>
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');

let t = 0;

function drawWave() {
  const width = canvas.width;
  const height = canvas.height;
  const waveHeight = 20; // 波浪高度
  const waveLength = 200; // 波浪长度
  const speed = 0.05; // 波浪速度
  const offset = height / 2; // 偏移量

  ctx.clearRect(0, 0, width, height);
  ctx.beginPath();

  for (let x = 0; x <= width; x += 10) {
    const y = waveHeight * Math.sin(x / waveLength * Math.PI * 2 + t);
    ctx.lineTo(x, y + offset);
  }

  ctx.strokeStyle = 'blue';
  ctx.stroke();
}

function loop() {
  t += speed;
  drawWave();
  requestAnimationFrame(loop);
}

loop();
</script>
SVG
<svg viewBox="0 0 400 400">
  <rect x="0" y="0" width="400" height="400" fill="#2a9d8f"/>
  <circle cx="200" cy="150" r="70" fill="#fff">
    <animate attributeName="r" from="70" to="85" dur="2s" repeatCount="indefinite"/>
    <animate attributeName="fill" values="#fff;#2a9d8f;#fff" dur="2s" repeatCount="indefinite"/>
    <animateTransform attributeName="transform" attributeType="XML" type="translate"
      values="-10 0; 0 10; 10 0; 0 -10; -10 0" dur="1.2s" repeatCount="indefinite"/>
    <animate attributeName="opacity" values="1;0;1" dur="2s" repeatCount="indefinite"/>
    <animateTransform attributeName="transform" attributeType="XML" type="rotate"
      from="0" to="360" dur="4s" repeatCount="indefinite"/>
    <animateMotion path="M 200 150 C 100 250, 300 250, 200 150 S 100 50, 200 150" dur="3s" repeatCount="indefinite"/>
    <animate attributeName="stroke-width" from="2" to="0" dur="2s" repeatCount="indefinite"/>
    <animate attributeName="stroke-dashoffset" from="615" to="0" dur="3s" repeatCount="indefinite" />
    <animate attributeName="stroke-dasharray" values="0 615; 40 575; 60 555; 80 535; 100 515" dur="3s" repeatCount="indefinite" />
  </circle>
</svg>

以上是三种实现水效果的方式,可以根据实际需要选择相应的方式来实现。