利用原生js实现随机颜色画布

2023-11-18

这几天复习了一下js的DOM(文档对象模型),部分,看到鼠标事件的时候想到可以试着写一个js画布的案例。

一、实现思路

1.利用js绑定鼠标按下事件,鼠标放开事件,在通过鼠标移动事件,获取鼠标所在位置。

2.通过鼠标移动事件动态创建节点挂载到页面上实现鼠标移动时出现轨迹。

3.然后封装一个生成随机颜色的函数实现挂载节点时颜色为随机色。

效果图如下:

就类似一个这样鼠标点击时在页面可以实现画笔的效果。

 二、代码分析部分

1. 主要分为3个鼠标事件一个随机颜色函数实现所有功能

var isDown = false;//鼠标左键是否按下

        //鼠标按下事件
        document.onmousedown = function (event) {
            var e = event || window.event;
            e.preventDefault(); //取消默认行为

    
            if (e.which == 1) {
                isDown = true;//如果按下鼠标左键,就将标识变为true
            }
        }

        document.onmouseup = function (event) {
            isDown = false;//鼠标释放时,将值变为false
        }

这里是鼠标按下事件和放开事件,然后这里用到了一个开关思想:首先用isDown判断鼠标左键是否被按下。

1.鼠标按下事件:给文档绑定一个鼠标事件,这里要接收一个事件对象event,然后用e接收event,这里要做一个兼容性的判断,如果没有的话就是window.event,之后阻止默认行为,这个e.which可以收集到是点击的那个键,为1的话是左键,2的话就是点击滚轮,3是鼠标右键,判断是否是点击的鼠标左键,则将开关isDown打开(true)

2.鼠标释放事件:释放时,将开关关闭(isDown=false)

2. 鼠标移动事件:动态添加节点

事件以及样式:

//鼠标移动事件
        document.onmousemove = function (event) {
            if (!isDown) { return }
            var e = event || window.event;
            e.preventDefault();
            var divDom = document.createElement("div");
            divDom.className = 'divDom'
            divDom.style.backgroundColor = getRandomColor();
            divDom.style.left = e.clientX + 'px'
            divDom.style.top = e.clientY + 'px'
            document.body.appendChild(divDom);
        }
<style>
        .divDom {
            width: 5px;
            height: 5px;
            border-radius: 3px;
            position: absolute;
        }
    </style>

   首先判断开关是否关闭,如果关闭,证明鼠标释放或没有点击,然后用e接收事件对象,组织默认行为,通过创建元素节点方法创建divDom元素,绑定上类名,设置背景颜色(这里是调用的随机颜色函数,下一步讲解),然后通过鼠标事件对象的clientX,clientY的位置将元素挂载。

3. 随机颜色函数

function getRandomColor() {
            var r = Math.floor(Math.random() * 256);
            var g = Math.floor(Math.random() * 256);
            var b = Math.floor(Math.random() * 256);
            return "rgb(" + r + "," + g + "," + b + ")";

        }

通过调用数学对象Math.random()函数生成[0,1)的随机数,将其乘以256,然后通过向下取整的方法得到0到255的数值,在用rgb的形式返回出去,得到一个随机的rgb值。

三、代码总结

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        .divDom {
            width: 5px;
            height: 5px;
            border-radius: 3px;
            position: absolute;
        }
    </style>
</head>

<body>
    <script type="text/javascript">

        var isDown = false;//鼠标左键是否按下

        //鼠标按下事件
        document.onmousedown = function (event) {
            var e = event || window.event;
            e.preventDefault(); //取消默认行为

            if (e.which == 1) {
                isDown = true;//如果按下鼠标左键,就将标识变为true
            }
        }

        document.onmouseup = function (event) {
            isDown = false;//鼠标释放时,将值变为false
        }

        //鼠标移动事件
        document.onmousemove = function (event) {
            if (!isDown) { return }
            var e = event || window.event;
            e.preventDefault();
            var divDom = document.createElement("div");
            divDom.className = 'divDom'
            divDom.style.backgroundColor = getRandomColor();
            divDom.style.left = e.clientX + 'px'
            divDom.style.top = e.clientY + 'px'
            document.body.appendChild(divDom);
        }

        function getRandomColor() {
            var r = Math.floor(Math.random() * 256);
            var g = Math.floor(Math.random() * 256);
            var b = Math.floor(Math.random() * 256);
            return "rgb(" + r + "," + g + "," + b + ")";

        }
    </script>
</body>

</html>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用原生js实现随机颜色画布 的相关文章

  • 如何使用 javascript 从 Audio Element 录制音频

    我正在使用 HTML5 和 Javascript 制作录音机 并且不想包含任何第三方 API 我的第一步是使用以下命令创建音频检索器和播放器
  • 类似于 iPhone(老虎机)的网络“选择器”选择框? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个类似 iPhone 的 选择器 控件 我可以在网络上使用它 可访问性不是问题 JavaS
  • JS专用鼠标按键

    我的鼠标侧面有两个按钮 其默认行为是 后退 和 前进 我想知道的是是否可以在 JavaScript 中检测这些鼠标按钮的点击 或者这些按钮是否是类似于键盘的 播放 音量调高 和 无线开 关 的 特殊 按钮纽扣 我不知道任何特定的鼠标事件 但
  • 使用 Ctrl+v 或右键单击 -> 粘贴检测粘贴的文本

    使用 JavaScript 如何检测用户将哪些文本粘贴到文本区域 您可以使用粘贴事件来检测大多数浏览器中的粘贴 尤其是 Firefox 2 当您处理粘贴事件时 记录当前选择 然后设置一个简短的计时器 在粘贴完成后调用一个函数 然后 该函数可
  • 使用 Javascript 防止刷新“跳转”

    我注意到 如果您在一个页面上并且向下滚动了很多 如果您刷新页面 大多数浏览器会将您跳回到您的位置 有什么办法可以防止这种情况发生吗 我研究了两个选项 但在 Webkit Firefox 上都不一致 window scrollTo 0 1 h
  • 这个作用域/闭包什么时候在 javaScript 中被垃圾回收?

    我正在做一门课程 该课程正在讨论范围 闭包并简要提到垃圾收集 课程中提出一个问题 范围保持多久 答案是 直到 不再有任何提及它 是的 所以我们基本上说的是 是的 闭包有点像对隐藏范围对象的引用 所以只要有一些函数仍然有一个闭包 范围 该范围
  • javascript RegExp 的奇怪行为:相同的正则表达式产生不同的结果[重复]

    这个问题在这里已经有答案了 可能的重复 为什么 Javascript 中带有全局标志的 RegExp 会给出错误的结果 https stackoverflow com questions 1520800 why regexp with gl
  • 将 viewbag 转换为 javascript 数组

    我想将数据从 ViewBag mytags 获取到 Javascript 数组 但我无法执行此操作 function var sampleTags new Array var array Html Raw Json Encode ViewB
  • 强制 Javascript 编码风格的工具[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要自动检查不同人编写的javascript源代码的风格 你知道有什么好的工具可以做到这一点吗 与 emacs 集成将是一个优势 先感谢
  • TinyMCE 选择文本并使用 javascript 激活链接对话

    我正在尝试编写一个自动化 使用黄瓜 水豚 硒 测试 它将在tinymce框中选择一些文本 单击链接按钮 然后打开链接选择页面 但链接按钮仅在选择某些文本时才变为活动状态 所以第一轮 tinyMCE activeEditor selectio
  • 在模型对象上设置属性?

    Hi 我正在构建 ASP NET MVC 站点并遇到了问题 在我的项目中 我得到了一个 modelview 类 其中包含几个属性 例如 public class myModelView public int MyProperty1 get
  • jsx转js后dom未定义错误

    我创建了一个 jsx 文件 如下所示 jsx dom function use strict define jquery react react dom function React ReactDOM var AppView React c
  • vue中有自动更新这段代码的东西吗?

    我在导航器中找到了这个按钮 当用户登录时会显示该按钮 而当用户注销时该按钮就会消失 但现在我需要在按钮删除 出现之前刷新页面 这是我的代码 Button div div class div div
  • javascript 中的类和类名有什么区别?

    为了找到某个类名的子对象 我必须创建自己的辅助函数 findChildrenByTagName function obj name var ret for var k in obj children if obj children k cl
  • 为什么 JavaScript 在不同浏览器中不一致?

    在花了无数个小时修复 JS 以使其跨浏览器兼容 主要是 IE 之后 我一直在思考以下问题 Why不是 JavaScript持续的跨浏览器 我的意思是 为什么 JS 不能像 Java 和 Flash 那样好呢 相反 我们必须求助于 jQuer
  • 如何以编程方式移动 OpenLayers Vector?

    API 文档为OpenLayers Feature Vector http dev openlayers org apidocs files OpenLayers Feature Vector js html说 Vector 本身根本没有方
  • ES6 - 有没有一种优雅的方法来导入所有命名导出而不是默认导出?

    我正在寻找一种优雅的方法来导入所有命名导出 而不必导入默认导出 在一个文件中 我导出许多命名常量以及默认值 myModule js const myDefault my default export const named1 named1
  • 如何了解来自不同...“命名空间”的变量?

    如何从外部 javascript 文件中访问在另一个地方声明的某个变量 假设在一个 html 文件中我有以下内容 在 otherfile html 的部分中 我有 alert a 我如何确保收到一条提示消息 某事 我认为Google Ads
  • Firebug 分析问题:“没有要分析的活动”

    我想用一些 javascript jQuery 尝试一些不同的选项 看看哪个是最快的 但是我无法让分析正常工作 这是我要测试的代码 this keypress function e console profile test retrieve
  • JS 中的展开/休息运算符如何工作? [复制]

    这个问题在这里已经有答案了 我正在努力完全理解扩展 休息运算符在 JS 中的工作原理 我已经阅读了 MDN 文档 但我仍然不完全清楚 我在下面提供了一个示例 我在其中使用了它并且它按预期工作 const users name Samir a

随机推荐

  • D360周赛复盘:模拟(思维题目)⭐⭐+贪心解决可能的最小和(类似上次)

    文章目录 2833 距离原点最远的点 思路 完整版 2834 找出美丽数组的最小和 思路 完整版 2833 距离原点最远的点 给你一个长度为 n 的字符串 moves 该字符串仅由字符 L R 和 组成 字符串表示你在一条原点为 0 的数轴
  • python+selenium基于po模式的web自动化测试框架

    一 什么是Selenium Selenium是一个基于浏览器的自动化测试工具 它提供了一种跨平台 跨浏览器的端到端的web自动化解决方案 Selenium主要包括三部分 Selenium IDE Selenium WebDriver 和Se
  • 深度学习之目标检测与目标识别

    一 目标识别分类及应用场景 目前可以将现有的基于深度学习的目标检测与识别算法大致分为以下三大类 基于区域建议的目标检测与识别算法 如R CNN Fast R CNN Faster R CNN 基于回归的目标检测与识别算法 如YOLO SSD
  • FW1配置文件

    FW1 sh conf Building configuration Running configuration Version 5 5R2 ip vrouter trust vr exit vswitch vswitch1 exit zo
  • 【Linux】向Linux 5.11.8内核加入新的系统调用

    目录 特殊声明 A mathcal A A 获取root权限
  • 【分布式】分布式相关书籍

    1 概述 1 1 分布式文章汇总 书籍 悟空聊架构 分布式文章汇总 评分 8分 第一章 主要讲解 拜占庭故障 这个讲解的非常好值得一看 第二章 主要讲解 Paxos 共识算法 这个图很好 但是仍然很难懂 第三章 动图讲解分布式 Raft 但
  • 开始学下VC++了

    有点迟了 以前光学DELPHI了 结果还是半瓶子的样子 现在接触下VC 要不会让人BS的 希望开个好点的头吧 不要老是三心二意的哦耶 PS QQ的五笔比搜狗的五笔好用不 个人感觉还是QQ的有点好用哦 嘿嘿 Orz 转载于 https www
  • mac安装python3.7_Mac安装python3.7

    mac默认安装的pyhon版本为2 7 如果要更新为python3 7 那么可以直接安装python3 7 千万不要卸载2 7版本 相信我 把系统自带的东西胡乱卸载掉的话你绝对会后悔的 步骤一 下载安装python3 7 方法一 使用hom
  • Flutter - 图片点击全屏浏览

    demo 地址 https github com iotjin jh flutter demo flutter好用的轮子推荐四 可定制的图片预览查看器photo view flutter九宫格图片查看器 效果图 关于九宫格布局实现 JhPh
  • 方差传递公式

    假设 Y f X 则 Var Y Sigma frac partial f partial x i Var x i
  • vue3-实现父子组件之间的通信(详解+源码)

    前言 vue3相对于vue2的父子传参方式有所改变 本文介绍三种 父组件给子组件传参 父组件调用子组件内的方法 子组件调用父组件的方法 如果不需要一种一种看可以直接下滑看全部代码 有注释也蛮好理解 一 父组件给子组件传参 1 父组件给子组件
  • 毕业设计-基于机器视觉的安全帽佩戴识别系统

    目录 前言 课题背景与意义 课题实现技术思路 目标检测 算法检测 算法实现 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的
  • Java之局部变量的作用域

    1 循环语句中变量 public static void main String args for int i 0 i lt 10 i int sum 3 System out println i sum 就上面最简单的程序说明吧 上面在f
  • 玻纤效应对skew的影响(三)

    玻纤效应对skew的影响 一 玻纤效应对skew的影响 二 对内skew对32Gbps NRZ和64Gbps PAM 4的影响 这一篇中 玻纤效应造成的对内skew将会加入到32Gbps NRZ和64Gbps PAM 4 SerDes全链路
  • 转载-浅析UDS诊断

    文章目录 前言 一 诊断和通信管理功能单元 0x10 DiagnosticSessionControl 0x11 ECUReset 0x27 SecurityAccess 0x28 CommunicationControl 0x3E Tes
  • maven工程编译生成source包

    开发Java服务端项目的时候 经常需要开发SDK作为依赖包提供给目标工程引用 但是目标工程在运行的调试的时候断点到依赖包里面的代码 由于依赖包的代码是编译后端class类 和源码有不少差异 不方便阅读 所以在开发的时候最好生成源码形式的依赖
  • Linux下Android Studio的安装步骤及关键点【整理】

    2013年google公司发布了一个新的Android集成开发环境 Android Studio 它为Android开发者提供了更多便利 而google慢慢地已经把重心放到Android Studio的开发上了 所以对于Android工程师
  • Allegro输出带等长规则的Excel操作指导

    Allegro输出带等长规则的Excel操作指导 Allegro可以输出带等长规则的Excel文件 方便检查和查阅 具体操作如下 打开规则管理器 选择Relative Propagation Delay 选择需要输出的match group
  • 如何清除SQL Server Management Studio的最近服务器列表

    SQL Server Management Studio SSMS 的 连接到服务器 对话框会记录用户所有访问过的服务器名称 这个功能对于经常连接多个数据库的人来说确实挺方便的 不过使用了一段时间之后 这个列表会变得很长 里面还有很多服务器
  • 利用原生js实现随机颜色画布

    这几天复习了一下js的DOM 文档对象模型 部分 看到鼠标事件的时候想到可以试着写一个js画布的案例 一 实现思路 1 利用js绑定鼠标按下事件 鼠标放开事件 在通过鼠标移动事件 获取鼠标所在位置 2 通过鼠标移动事件动态创建节点挂载到页面