流星雨效果

文章目录

  • html + css实现
  • js+canvas实现

html + css实现

  • 对于 HTML 来说,:root 表示 元素,除了优先级更高之外,与 html 选择器相同。
  • 带有前缀 – 的属性名,比如 --example–name,表示的是带有值的自定义属性,其可以通过 var() 函数在全文档范围内复用的。
  • perspective: 指定了观察者与 z=0 平面的距离,使具有三维位置变换的元素产生透视效果
  • transform-style:设置元素的子元素是位于 3D 空间中还是平面中。
  • 高斯模糊 : filter: blur(10px);

效果:
在这里插入图片描述

代码:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div class="container">
      <!-- 带有前缀 -- 的属性名,比如 --example--name,表示的是带有值的自定义属性,其可以通过 var() 函数在全文档范围内复用的。 -->
      <div class="line" style="--color: #ffcdc6; --x: 3; --z: 3; --d: 1"></div>
      <div class="line" style="--color: #fff; --x: 3; --z: 2; --d: 2"></div>
      <div class="line" style="--color: #fff; --x: 4; --z: 1; --d: 3"></div>
      <div class="line" style="--color: #ffffff; --x: 4; --z: 0; --d: 1"></div>
      <div
        class="line"
        style="--color: rgb(250, 255, 174); --x: 6; --z: -1; --d: 2"
      ></div>
      <div class="line" style="--color: #b7dfff; --x: 6; --z: -2; --d: 3"></div>
      <div class="line" style="--color: #fff; --x: 8; --z: -3; --d: 1"></div>
      <div class="line" style="--color: #fff; --x: 10; --z: -4; --d: 2"></div>
      <div
        class="line"
        style="--color: #ffffff; --x: 12; --z: -5; --d: 3"
      ></div>
      <div class="line" style="--color: #fff; --x: 14; --z: -6; --d: 1"></div>
      <div class="line" style="--color: #fff; --x: 16; --z: -7; --d: 2"></div>
      <div class="line" style="--color: #fff; --x: 18; --z: -8; --d: 3"></div>
      <div
        class="line"
        style="--color: #f4c0ff; --x: 20; --z: -9; --d: 1"
      ></div>
    </div>
  </body>
  <style>
    /* 对于 HTML 来说,:root 表示 <html> 元素,除了优先级更高之外,与 html 选择器相同。 */
    :root {
      --background-color: #2c3e50;
    }
    * {
      margin: 0;
      padding: 0;
    }
    html {
      font-size: 14px;
    }
    body {
      width: 100vw;
      height: 100vh;
      background-color: var(--background-color);
      display: flex;
      justify-content: center;
      align-items: center;
    }
    .container {
      position: relative;
      width: 100vw;
      height: 100vh;
      background-color: #000;
      overflow: hidden;
      display: flex;
      justify-content: center;
      align-items: center;
      /* perspective: 指定了观察者与 z=0 平面的距离,使具有三维位置变换的元素产生透视效果 */
      perspective: 800px;
      /* transform-style:设置元素的子元素是位于 3D 空间中还是平面中。 */
      transform-style: preserve-3d;
    }
    .line {
      position: absolute;
      width: 200px;
      height: 3px;
      border-radius: 3px;
      background-image: linear-gradient(
        to right,
        var(--color),
        #ffffff50,
        transparent
      );
      animation: down 1s linear infinite both;
      animation-delay: calc(var(--d) * 0.3s);
    }
    .line::before,
    .line::after {
      position: absolute;
      content: "·";
      width: 10px;
      height: 10px;
      background-image: inherit;
    }
    .line::before {
      /* 高斯模糊 */
      filter: blur(5px);
    }
    .line::after {
      /* 高斯模糊 */
      filter: blur(10px);
    }
    @keyframes down {
      0% {
        transform: translateY(calc(var(--z) * 60px))
          translateZ(calc(var(--z) * 100px)) rotate(-45deg)
          translateX(calc(var(--x) * 100px));
      }
      100% {
        transform: translateY(calc(var(--z) * 60px))
          translateZ(calc(var(--z) * 100px)) rotate(-45deg)
          translateX(calc(var(--x) * -100px));
      }
    }
  </style>
</html>

js+canvas实现

效果:
在这里插入图片描述
代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>流星雨</title>
    <script>
      // 画笔
      var context;
      //   装星星的容器
      var arr = new Array();
      //   星星数
      var starCount = 800;
      //   装流星雨的容器
      var rains = new Array();
      //   流星数
      var rainCount = 20;

      function init() {
        var stars = document.getElementById("stars");
        windowWidth = window.innerWidth; //当前的窗口的高度
        stars.width = windowWidth;
        stars.height = window.innerHeight;
        context = stars.getContext("2d");
      }

      //创建一个星星对象
      var Star = function () {
        this.x = windowWidth * Math.random(); //横坐标
        this.y = 5000 * Math.random(); //纵坐标
        this.text = Math.random() < 0.7 ? "." : "*"; //文本
        this.color = "white"; //颜色
        this.getColor = function () {
          var _r = Math.random();
          if (_r < 0.5) {
            this.color = "#333";
          } else {
            this.color = "white";
          }
        };
        //初始化
        this.init = function () {
          this.getColor();
        };
        //绘制
        this.draw = function () {
          context.fillStyle = this.color;
          context.fillText(this.text, this.x, this.y);
        };
      };

      //画月亮
      function drawMoon() {
        var moon = new Image();
        moon.src = "./images/moon.jpg";
        context.drawImage(moon, -5, -10);
      }
      //星星闪起来 (重新绘制星星达到一闪一闪的效果)
      function playStars() {
        for (var n = 0; n < starCount; n++) {
          arr[n].getColor();
          arr[n].draw();
        }

        setTimeout("playStars()", 300);
      }

      /*创建流星雨对象*/
      var MeteorRain = function () {
        this.x = -1;
        this.y = -1;
        this.length = -1; //流星长度
        this.angle = 30; //倾斜角度
        this.width = -1; //流星所占宽度
        this.height = -1; //流星所占高度
        this.speed = 1; //速度
        this.offset_x = -1; //横轴移动偏移量
        this.offset_y = -1; //纵轴移动偏移量
        this.alpha = 1; //透明度
        this.color1 = ""; //流星的色彩
        this.color2 = ""; //流星的色彩
        /****************初始化函数********************/
        this.init = function () //初始化
        {
          this.getPos();
          this.alpha = 1; //透明度
          this.getRandomColor();
          //最小长度,最大长度
          var x = Math.random() * 80 + 150;
          this.length = Math.ceil(x);
          // x = Math.random()*10+30;
          this.angle = 30; //流星倾斜角
          x = Math.random() + 0.5;
          this.speed = Math.ceil(x); //流星的速度
          var cos = Math.cos((this.angle * 3.14) / 180);
          var sin = Math.sin((this.angle * 3.14) / 180);
          this.width = this.length * cos; //流星所占宽度
          this.height = this.length * sin; //流星所占高度
          this.offset_x = this.speed * cos; //横轴移动偏移量
          this.offset_y = this.speed * sin; //纵轴移动偏移量
        };
        /**************获取随机颜色函数*****************/
        this.getRandomColor = function () {
          var a = Math.ceil(255 - 240 * Math.random());
          //中段颜色
          this.color1 = "rgba(" + a + "," + a + "," + a + ",1)";
          //结束颜色
          this.color2 = "black";
        };
        /***************重新计算流星坐标的函数******************/
        this.countPos = function () //
        {
          //往左下移动,x减少,y增加
          this.x = this.x - this.offset_x;
          this.y = this.y + this.offset_y;
        };
        /*****************获取随机坐标的函数*****************/
        this.getPos = function () //
        {
          //横坐标200--1200
          this.x = Math.random() * window.innerWidth + 200; //窗口宽度
          //纵坐标小于600
          this.y = Math.random() * window.innerHeight - 200; //窗口高度
        };
        /****绘制流星***************************/
        this.draw = function () //绘制一个流星的函数
        {
          context.save();
          context.beginPath();
          context.lineWidth = 1; //宽度
          context.globalAlpha = this.alpha; //设置透明度
          //创建横向渐变颜色,起点坐标至终点坐标
          var line = context.createLinearGradient(
            this.x,
            this.y,
            this.x + this.width,
            this.y - this.height
          );
          //分段设置颜色
          line.addColorStop(0, "white");
          line.addColorStop(0.3, this.color1);
          line.addColorStop(0.6, this.color2);
          context.strokeStyle = line;
          //起点
          context.moveTo(this.x, this.y);
          //终点
          context.lineTo(this.x + this.width, this.y - this.height);
          context.closePath();
          context.stroke();
          context.restore();
        };
        this.move = function () {
          //清除上一次显示的流星像素
          var x = this.x + this.width - this.offset_x;
          var y = this.y - this.height;
          context.clearRect(x - 3, y - 3, this.offset_x + 5, this.offset_y + 5);
          //重新计算位置,往左下移动
          this.countPos();
          //透明度增加
          this.alpha -= 0.002;
          //重绘
          this.draw();
        };
      };

      //流星移动
      function playRains() {
        for (var n = 0; n < rainCount; n++) {
          var rain = rains[n];
          rain.move(); //移动
          if (rain.y > window.innerHeight) {
            //超出界限后重来
            context.clearRect(
              rain.x,
              rain.y - rain.height,
              rain.width,
              rain.height
            );
            rains[n] = new MeteorRain();
            rains[n].init();
          }
        }
        setTimeout("playRains()", 2);
      }

      //页面加载的时候
      window.onload = function () {
        init();
        //画星星
        for (var i = 0; i < starCount; i++) {
          var star = new Star();
          star.init();
          star.draw();
          arr.push(star);
        }
        //画流星
        for (var i = 0; i < rainCount; i++) {
          var rain = new MeteorRain();
          rain.init();
          rain.draw();
          rains.push(rain);
        }
        drawMoon(); //绘制月亮
        playStars(); //绘制闪动的星星
        playRains(); //绘制流星
      };
    </script>
    <style type="text/css">
      body {
        background-color: black;
      }

      body,
      html {
        width: 100%;
        height: 100%;
        overflow: hidden;
      }
    </style>
  </head>
  <body>
    <canvas id="stars"></canvas>
  </body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/227328.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Threejs项目实战之一:汽车外观换肤效果三维展示

目录 最终效果1 创建项目2 安装插件3 编写代码3.1 准备工作3.2 代码编写3.2.1 在template标签中构建html页面3.2.2 在style标签中构建页面样式文件3.2.3 在script标签中编写js代码 最终效果 先看下最终实现的效果 接下来&#xff0c;我们就从创建项目开始&#xff0c;一步一步…

ChatGPT/GPT4科研实践篇: AI绘图+论文写作+编程

1、熟练掌握ChatGPT提示词技巧及各种应用方法&#xff0c;并成为工作中的助手。 2、通过案例掌握ChatGPT撰写、修改论文及工作报告&#xff0c;提供写作能力及优化工作 3、熟练掌握ChatGPT融合相关插件的应用&#xff0c;完成数据分析、编程以及深度学习等相关科研项目。 4、…

【Windows本地端口占用脚本自动化】

本地启动多个Java微服务&#xff0c;因为停电或者内存回收原因&#xff0c;IDEA直接退出&#xff1b;再次启动各个服务会提示端口占用。 每次都cmd输入命令手动Kill比较繁琐&#xff0c;可以把此脚本放在桌面上作为一个小工具&#xff0c;运行即可。 代码(核心部分是chatGPT自…

k8s中的Pod网络;Service网络;网络插件Calico

Pod网络&#xff1b;Service网络&#xff1b;网络插件Calico Pod网络 在K8S集群里&#xff0c;多个节点上的Pod相互通信&#xff0c;要通过网络插件来完成&#xff0c;比如Calico网络插件。 使用kubeadm初始化K8S集群时&#xff0c;有指定一个参数–pod-network-cidr10.18.0…

【react】动态页面转换成html文件下载,解决样式问题

需求 今天遇到一个需求&#xff0c;挺恶心人的&#xff0c;将一个在线文档页面&#xff0c;可以导出成为html页面查看。 看到网上有使用fs模块&#xff0c;通过react的ReactDOMServer.renderToStaticMarkup将组件转成html字符串&#xff0c;输出文件了。 但是我尝试了&#x…

返回列表中满足指定条件的连续元素:只返回第一个不符合条件元素之前的各元素itertools.takewhile()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 返回列表中满足指定条件的连续元素&#xff1a; 只返回第一个不符合条件元素之前的各元素 itertools.takewhile() [太阳]选择题 请问以下代码输出的结果是&#xff1f; import itertools a …

在VSCode中运行Python脚本文件时如何传参

以下实验所处的操作系统环境说明&#xff1a; OS版本MacOSMonterey 12.1VSCodeOctober 2023 (version 1.84.2) 一、背景 在 VSCode 中写好 Python 脚本后&#xff0c;如果要运行起来&#xff0c;可以怎么做呢&#xff1f; 一般有以下几种方式&#xff1a; 1、直接在 VSCode…

【ARM Trace32(劳特巴赫) 使用介绍 11 -- Trace32 ARMv8/v9 系统寄存器读写】

文章目录 Trace32 ARMv8/v9 系统寄存器读写 Trace32 ARMv8/v9 系统寄存器读写 本文主要介绍如何使用trace32 来对 ARMv8 的系统寄存器及debug 寄存器进行配置&#xff0c;具体配置方法如下&#xff1a; 步骤1&#xff1a; 步骤2&#xff1a; 步骤3&#xff1a; 步骤4&#xf…

商务与经济统计案例分析:3-1Pelican 商店——python 实现

商务与经济统计案例分析:3-1Pelican 商店 要求Python实现 要求 1.净销售额的描述统计量和各种不同类型顾客的净销售额的描述统计量。 2.关于年龄与净销售额之间关系的描述统计量。 Python实现 0.相关分析&#xff1a;2-1案例 1.净销售额的描述统计量和各种不同类型顾客的净销…

【Docker二】docker网络模式、网络通信、数据管理

目录 一、docker网络模式&#xff1a; 1、概述 2、docker网络实现原理&#xff1a; 3、docker的网络模式&#xff1a; 3.1、bridge模式&#xff1a; 3.2、host模式&#xff1a; 3.3、container模式&#xff1a; 3.4、none模式&#xff1a; 3.5、自定义网络模式&#xf…

stateflow——如何查看状态机中参数变化及状态机断点调试

法一&#xff1a;使用Data Inspector 点击“符号图窗”和“属性”&#xff0c;如图&#xff1b;在选择变量n并右键点击inspector&#xff0c;最后在logging&#xff0c;如图 法二&#xff1a;log active state 和法一类似使用data inspector查看&#xff0c;类似的查看方法和…

《机器学习实战》MNIST 数据集的导入方法

1、在网上下载数据集 mnister 数据集有两个类型&#xff0c; &#xff08;1&#xff09;一个是手写的阿拉伯数字图片&#xff1a;MNIST 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1dd-I-laysPbT8wxbyvxTvg 提取码&#xff1a;1234 &#xff08;2…

【Flink系列五】Checkpoint及Barrier原理

本章内容 一致性检查点从检查点恢复状态检查点实现算法-barrier保存点Savepoint状态后端&#xff08;state backend&#xff09; 本文先设置一个前提&#xff0c;流处理的数据都是可回放的&#xff08;可以理解成消费的kafka的数据&#xff09; 一致性检查点&#xff08;che…

基于ssm少儿编程管理系统源码和论文

idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 环境&#xff1a; jdk8 tomcat8.5 开发技术 ssm 基于ssm少儿编程管理系统源码和论文744 摘要 网络的广泛应用给生活带来了十分的便利。所以把少儿编程管理系统与现在网络相结合&#xff0c;利用java技术建设…

安装python第三方库后,在pycharm中不能正常导入

python小白学习opencv&#xff0c;使用pip安装完opencv库后import cv2报错&#xff0c;按照如下设置解决&#xff1a; 需要正确设置python解释器路径

VC++使用GetProcessTimes获取进程创建时间、销毁时间、用户态时间、内核态时间

一、GetProcessTimes函数简介&#xff08;微软MSDN&#xff09; 微软提供了一个非常有用的API函数GetProcessTimes用来获取进程创建时间、销毁时间、用户态时间、内核态时间&#xff0c;msdn连接为&#xff1a;GetProcessTimes 函数 (processthreadsapi.h) 其函数原型为&#…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux文件管理(3)》(27)

《Linux操作系统原理分析之Linux文件管理&#xff08;3&#xff09;》&#xff08;27&#xff09; 8 Linux文件管理8.6 文件管理和操作8.6.1 系统对文件的管理8.6.2 进程对文件的管理 8 Linux文件管理 8.6 文件管理和操作 8.6.1 系统对文件的管理 Linux 系统把所有打开的活动…

智能优化算法应用:基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.北方苍鹰算法4.实验参数设定5.算法结果6.参考…

12.07

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//窗口设置//去掉表头this->setWindowFlags(Qt::FramelessWindowHint);//重新设置大小this->resize(800,420);//设置背景颜色this->setStyleSheet("background-color:whi…

mfc140.dll丢失的解决方法,以及解决方法的优缺点

如果你在使用电脑时遇到了“mfc140.dll丢失”的错误提示&#xff0c;这可能会阻止你运行特定的应用程序或游戏。这篇文章将向你介绍导致此错误出现的原因以及mfc140.dll丢失的解决方法&#xff0c;让你的电脑系统恢复正常运行。 一.mfc140.dll丢失的解决方法以及优缺点 方法 1…