地址:https://chu295.github.io/295/

  1. let height = window.innerHeight
  2. let width = window.innerWidth
  3. var ctx
  4. var meteorArr = [
  5. { x: width / 6, y: -height / 10, length: height / 5, r: 3, vx: 5, vy: 25, color: '#fff' },
  6. ]
  7. window.onload = () => {
  8. console.log('要下流星雨了')
  9. let canvas = document.querySelector('#canvas')
  10. let context = canvas.getContext('2d')
  11. ctx = context
  12. canvas.height = height
  13. canvas.width = width
  14. draw()
  15. }
  16. function draw() {
  17. ctx.clearRect(0, 0, width, height) // 清空上一幕
  18. ctx.save(); // 保存状态
  19. ctx.rotate(-20 * Math.PI / 180) // 旋转画布
  20. meteorArr.map((item, index) => {
  21. // 绘画
  22. ctx.beginPath(); //开始路径
  23. ctx.arc(item.x, item.y, item.r, 0, Math.PI, false);
  24. ctx.lineTo(item.x, item.y - item.length);
  25. ctx.closePath()
  26. ctx.fillStyle = item.color;
  27. ctx.fill();
  28. // 渲染完一颗星星,然后处理数据,计算下一帧的位置
  29. // 如果超出边界,删除这课星星
  30. if (meteorArr[index].x > width + 100 || meteorArr[index].y > height + meteorArr[index].length * 2) {
  31. meteorArr.splice(index, 1)
  32. } else {
  33. meteorArr[index].x += item.vx
  34. meteorArr[index].y += item.vy
  35. }
  36. })
  37. // 控制流星数量
  38. if (meteorArr.length > 100) {
  39. } else {
  40. let random = Math.random()
  41. if (random > 0.5) {
  42. meteorArr.push(createStart())
  43. } else {
  44. }
  45. }
  46. ctx.restore(); // 恢复状态
  47. window.requestAnimationFrame(draw)
  48. }
  49. // 创建星星
  50. function createStart() {
  51. let random = Math.random()
  52. let vx = random * 1 + 1
  53. let obj = {
  54. x: random * width - height / 3,
  55. y: random * -200,
  56. length: random * 50 + 200,
  57. r: random * 3,
  58. vx: vx,
  59. vy: vx * 5,
  60. color: 'rgba(255,255,255,0.7)'
  61. }
  62. return obj
  63. }
文档更新时间: 2019-05-10 14:29