【JavaScript】实现探照灯效果(附代码)

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: JavaScript实现探照灯效果,五角星+旋转+边界检测,图片自适应大小+不透明度0.8+阴影

 话不多说,先看实现效果

image.gif编辑

Implemetation

    • 探照灯:五角星+旋转+边界检测
    • 背景:底色+阴影
    • 图片:自适应大小+不透明度0.8+阴影
    • 文字:阴影

    UI Color matching

    前层画布:#222222

    后层画布:#eeeeee

    文字:#3399ff

    如果有小伙伴总是对配色产生烦恼,博主推荐三个优质配色网站

    渐变色:Gradient Colors Collection Palette - CoolHue 2.0

    配色:BrandColors - official brand color hex codes

    配色:Color Palettes for Designers and Artists - Color Hunt

    Engineering Structure

    image.gif编辑

    Code

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Polygonal searchlight</title>
    </head>
    <body>
    <!--设置一个高800,宽800大的画布-->
    <canvas id="canvas" height="800" width="800"></canvas>
    <script>
        var rot = 0;
        // 创建一个探照灯,开始时在(400,400)的位置,半径为150,x方向移动速度为vx,y方向移动速度为vy
        var searchLight = {
            x: 400,
            y: 400,
            radius: 230,
            vx: Math.random() * 5 + 10,
            vy: Math.random() * 5 + 10,
        }
        //界面开始加载
        window.onload = function () {
            //先加载画布
            var canvas = document.getElementById("canvas");
            //加载画布中的2d图像
            var ctx = canvas.getContext("2d");
            canvas.width = 800;
            canvas.height = 800;
            //设置刷新时间,每隔20毫秒刷新一次
            setInterval(function () {
                draw(ctx);
                update(canvas.width, canvas.height);
            }, 30);
        }
        //绘制底片的照片和文字
        function draw(context) {
            //对画布进行清空
            context.clearRect(0, 0,800, 800);
            context.save();
            context.beginPath();
            context.fillStyle = "black";
            context.fillRect(0, 0, context.canvas.width, context.canvas.height);
            //将画布背景换成灰色
            context.fillStyle = "#d6dde3";
            context.shadowColor='#878787';
            context.shadowOffsetX=5;
            context.shadowOffsetY=5;
            context.shadowBlur=2;
            context.save();
            context.translate(searchLight.x, searchLight.y);
            context.rotate(rot / 180 * Math.PI);
            context.scale(searchLight.radius,searchLight.radius);
            //绘制路径
            starPath(context);
            context.fill();
            //使用clip进行绘制区域的剪辑
            context.restore();
            context.clip();
            context.font = "bold 45px Arial";
            context.textAlign = " left";
            context.textBaseline = "middle";
            context.fillStyle = "#3fa9f5";
            context.fillText("CSDN", 450, 370);
            context.fillText("北村南", 450, 420);
            //实现图片自适应
            let image = new Image();
            image.src = 'Fengdi.jpg';
            //设置图片不透明度
            context.globalAlpha=0.8;
            context.drawImage(image, 200, 300, 200, 200);
            context.restore();
        }
        //update动画碰撞检测(*)
        function update(canvasWidth, canvasHeight) {
            rot += 1;
            searchLight.x += searchLight.vx;
            searchLight.y += searchLight.vy;
            if (searchLight.x - searchLight.radius <= 0) {
                searchLight.vx = -searchLight.vx;
                searchLight.x = searchLight.radius;
            }
            if (searchLight.x + searchLight.radius >= canvasWidth) {
                searchLight.vx = -searchLight.vx;
                searchLight.x = canvasWidth - searchLight.radius;
            }
            if (searchLight.y - searchLight.radius <= 0) {
                searchLight.vy = -searchLight.vy;
                searchLight.y = searchLight.radius;
            }
            if (searchLight.y + searchLight.radius >= canvasHeight) {
                searchLight.vy = -searchLight.vy;
                searchLight.y = canvasHeight - searchLight.radius;
            }
        }
        //绘制一个五角星(*)
        function starPath(ctx) {
            ctx.beginPath();
            for (var i = 0; i < 5; i++) {
                ctx.lineTo(Math.cos((18 + i * 72) / 180 * Math.PI),
                    -Math.sin((18 + i * 72) / 180 * Math.PI));
                ctx.lineTo(Math.cos((54 + i * 72) / 180 * Math.PI) * 0.5,
                    -Math.sin((54 + i * 72) / 180 * Math.PI) * 0.5);
            }
            ctx.closePath();
        }
    </script>
    </body>
    </html>

    image.gif


    目录
    相关文章
    |
    JavaScript
    vue3:vue3.2升级至vue3.3/vue升级版本
    vue3:vue3.2升级至vue3.3/vue升级版本
    628 0
    |
    前端开发 JavaScript 容器
    学习JavaScript笔记
    学习JavaScript笔记
    82 0
    |
    6月前
    |
    JavaScript 数据库
    【vue】vue2 数据回显取消编辑不修改原数据
    【vue】vue2 数据回显取消编辑不修改原数据
    222 1
    |
    数据采集 存储 算法
    数据挖掘1——课后习题
    数据挖掘1——课后习题
    317 0
    |
    6月前
    |
    人工智能 决策智能
    【AI Agent系列】【阿里AgentScope框架】2. Pipeline模块入门:使用Pipeline模块实现最简单的多智能体交互
    【AI Agent系列】【阿里AgentScope框架】2. Pipeline模块入门:使用Pipeline模块实现最简单的多智能体交互
    300 0
    |
    Web App开发 数据采集 缓存
    曲鸟全栈UI自动化教学(四):Selenium工作原理及Webdriver对浏览器的配置和操作
    曲鸟全栈UI自动化教学(四):Selenium工作原理及Webdriver对浏览器的配置和操作
    493 0
    曲鸟全栈UI自动化教学(四):Selenium工作原理及Webdriver对浏览器的配置和操作
    |
    前端开发 程序员 API
    教你实现微信8.0『炸裂』的礼花表情特效
    作为一个前端程序员,这就勾起了我的好奇心,虽然我从来没有实现过这样的动画,但是我还是忍不住想要去实现,最终我花了2天时间去看一些库的源码到我自己实现一个类似的效果,在这里我总结一下,并且手把手地教大家怎么学习实现。而🎉有一个自己的名字,叫做五彩纸屑,英文名字叫 confetti。
    教你实现微信8.0『炸裂』的礼花表情特效
    |
    SQL 前端开发 JavaScript
    基于python+django+vue.js开发的学生宿舍管理系统
    基于python+django+vue.js开发的学生宿舍管理系统
    270 0
    |
    传感器 Ubuntu API
    ESP-IDF 蓝牙开发 之 添加 characteristic
    我们主要需要认清目标:我们不是来研究蓝牙协议的,我们是来使用 ESP32-C3 跑蓝牙协议,用来 数据传输通讯的。我们要会用 ESP—IDF 提供的示例框架,根据自己的实际需求修改代码,这就是我们最终的目的 !
    316 1
    ESP-IDF 蓝牙开发 之 添加 characteristic