js实现星星闪特效

首先介绍一下实现星星闪特效的基本思路,整个流程分为以下几步:

  1. 随机生成 N 个星星的位置和大小
  2. 再随机为每个星星设置一个动画延迟时间
  3. 使用 CSS3 动画为每个星星设置闪烁效果
  4. 可以通过 js 实现控制整个星空的暂停和继续

接下来,我将逐步详细讲解。

1. 随机生成 N 个星星的位置和大小

首先需要使用 js 随机生成一组星星的位置和大小,这可以使用循环来实现。可以控制星星的数量,随机生成坐标和大小的代码如下:

let starNum = 50;  // 星星的数量
let stars = [];  // 用来保存所有星星的数组

for(let i=0; i<starNum; i++){
  // 创建一个对象,用来保存星星的坐标和大小信息
  let star = {};
  // 随机生成星星的横坐标和纵坐标
  star.x = Math.floor(Math.random()*window.innerWidth);
  star.y = Math.floor(Math.random()*window.innerHeight);
  // 随机生成星星的大小,在 10~40 像素之间
  star.size = Math.floor(Math.random()*30 + 10);
  stars.push(star);
}

2. 为每个星星设置动画延迟时间

为了让每个星星的闪烁效果不一样,可以使用随机数为每颗星星指定一个动画延迟时间。代码如下:

for(let i=0; i<starNum; i++){
  // 随机生成星星的动画延迟时间
  stars[i].delay = Math.floor(Math.random()*10) + "s";
}

3. 使用 CSS3 动画为每个星星设置闪烁效果

这里可以使用 CSS3 中的 animation 属性来实现动画效果。为了让每个星星有所不同的闪烁效果,我们可以在 CSS 中指定每个星星的动画延迟时间。代码如下:

.star {
  position: absolute;
  background-color: #fff;
  border-radius: 50%;
  animation: star-shine 2s infinite ease-in-out;
}

.star:nth-child(1) {
  width: 20px;
  height: 20px;
  left: 100px;
  top: 170px;
  animation-delay: 1s;
}

.star:nth-child(2) {
  width: 30px;
  height: 30px;
  left: 220px;
  top: 300px;
  animation-delay: 2s;
}

...

/* 自定义动画 */
@keyframes star-shine {
  0% {
    opacity: 0;
    transform: scale(0.1);
  }
  5% {
    opacity: 1;
  }  
  50% {
    opacity: 0.6;
  }
  100% {
    opacity: 0;
    transform: scale(1.2);
  }        
}

在上面的代码中,可以看到 .star 样式表示每个星星的基础样式。animation 属性指定了该元素使用 star-shine 作为动画,每次动画持续时间为 2 秒,一直重复播放。同时,为了让每个星星的动画效果稍有不同,可以为每个星星单独设置 animation-delay 属性。

最后是 @keyframes 定义的 star-shine 动画效果,即让星星逐渐变亮、再逐渐变暗的闪烁过程。

4. 控制整个星空的暂停和继续

最后,可以使用 js 来控制整个星空是暂停还是继续播放的状态。这可以通过控制每个星星的 animation-play-state CSS 属性来实现。代码如下:

let isPlaying = true;  // 控制星空的继续或暂停

// 获取所有的星星元素
let starElements = document.querySelectorAll('.star');

// 暂停或继续触发的事件
function starToggle(){
  for(let i=0; i<starElements.length; i++){
    if(isPlaying){
      starElements[i].style.animationPlayState = 'paused';
    }else{
      starElements[i].style.animationPlayState = 'running';
    }
  }
  isPlaying = !isPlaying;  // 控制状态的变化
}

// 注册暂停或继续事件
let controlEl = document.querySelector('#control');
controlEl.addEventListener('click', starToggle);

需要注意的是,为了控制整个星空的动画状态,需要为每个星星设置相同的 animation-duration 属性。这样,所有星星的动画时长才能保持一致,从而实现整个星空的统一动画效果。

示例1:https://codepen.io/NovikovDS/pen/Vwvxyoo

示例2:https://codepen.io/Ivan989/pen/EapMrG

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js实现星星闪特效 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • js闭包和垃圾回收机制示例详解

    1. 什么是JavaScript闭包? 在JavaScript中,当一个函数访问到它定义的外部变量时,就创建了闭包。通俗的说,闭包就是一个函数和执行该函数的环境的组合体。 闭包的作用在于:可以将数据进行封装,使得外部无法访问到函数内部的数据,而只能通过暴露出的接口方法进行访问。这种特性很常见,比如函数库的实现、异步回调等等,都需要使用闭包。 下面是一个简单的…

    JavaScript 2023年6月10日
    00
  • js中将字符串转换成json的三种方式

    将字符串转换成 JSON 对象,在 JavaScript 中实际上有三种方式。 方法一:使用 JSON.parse() JSON.parse() 方法将 JSON 格式的字符串转换成 JavaScript 对象。 let jsonString = ‘{"name": "Tom", "age": 20…

    JavaScript 2023年5月27日
    00
  • javascript打印大全(打印页面设置/打印预览代码)

    下面是详细讲解“javascript打印大全(打印页面设置/打印预览代码)”的攻略: 打印页面设置 打印页面设置主要是使用window.print()方法,这个方法用于打印当前页面。在使用window.print()前,我们常常需要设置一些打印页面参数,如纸张大小、边距、横向还是纵向等等。 设置纸张大小 @media print { @page { size…

    JavaScript 2023年5月19日
    00
  • vue项目打包优化的方法实战记录

    为了优化Vue项目的打包体积和加载速度,我们可以采取以下几个方法: 1. 拆分第三方库和业务代码 在项目开发过程中,我们经常会使用一些第三方库,如lodash、moment等,这些库往往会占用较大的文件体积。为了减小打包体积,可以将它们拆分到不同的chunk中,例如使用webpack的SplitChunksPlugin插件进行拆分。除此之外,我们还可以将业务…

    JavaScript 2023年6月11日
    00
  • 前端使用koa实现大文件分片上传

    下面给出使用koa实现大文件分片上传的完整攻略。 什么是大文件分片上传 在前端上传大文件时,由于上传文件大小的限制和网络环境等因素,可能会出现上传失败或上传时间过长等问题。解决这些问题的方法之一就是将大文件进行分片上传,即将大文件划分成多个较小的块,分别上传到服务器上,最后再将这些块合并为原始文件。 实现分片上传的流程 分片上传一般分为以下几个步骤: 将文件…

    JavaScript 2023年6月11日
    00
  • Javascript 定时器调用传递参数的方法

    JavaScript 定时器调用传递参数的方法可以使用 setInterval 或 setTimeout 方法,并通过匿名函数或箭头函数传递参数。 使用 setInterval 方法来调用定时器并传递参数: setInterval(function(parameter1, parameter2){ // 执行相关操作 }, delay, parameter1…

    JavaScript 2023年6月11日
    00
  • qiankun 找不到入口问题彻底解决

    那我来详细讲解如何解决 “qiankun 找不到入口问题”。 问题背景 qiankun 是一个前端微服务框架,可以实现不同应用之间的动态加载和通信。但是,在使用 qiankun 的过程中,有时会遇到 找不到应用入口 的问题,这会导致应用无法正确加载。 解决步骤 1. 确认应用路径是否正确 首先确认引用路径是否正确。在主应用中,qiankun 会在指定路径下查…

    JavaScript 2023年6月11日
    00
  • JavaScript入门之语言基础第1/2页

    下面是《JavaScript入门之语言基础第1/2页》的完整攻略: 简介 本篇教程讲解的是 JavaScript 语言的基础知识,包括数据类型、运算符、变量等概念,是 JavaScript 入门的必备知识。同时,本篇教程提供了一些示例来帮助读者更好地理解这些概念。 数据类型 JavaScript 中有六种基本数据类型,分别为: Number:数字类型,包括整…

    JavaScript 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部