html5自己做一个类似windows的画图软件的方法

这个绘图工具,我还没有做完,不过已经实现了总架构,以及常见的简易图形绘制功能:

1,可以绘制直线,圆,矩形,正多边形【已完成】

2,填充颜色和描边颜色的选择【已完成】

3,描边和填充功能的选择【已完成】

后续版本:

立即学习“前端免费学习笔记(深入)”;

橡皮擦,坐标系,线形设置,箭头,其他流程图形,裁剪与调整图形。。。。。

终极目标:

流程绘制软件

我是之前看见一位朋友在我的博客中留言说:

html5自己做一个类似windows的画图软件的方法

非常感谢这个朋友,今天终于抽出时间完成非常非常小的雏形!

完整的雏形代码,请自行打开,复制到本地测试.

html5自己做一个类似windows的画图软件的方法html5自己做一个类似windows的画图软件的方法

                windows简易画图工具 - by ghostwu    
  • 形状
  • 颜色
  • 绘制类型
  • 线条宽度
  • 橡皮擦
  • 线条
  • 圆形
  • 矩形
  • 正多边形
  • 箭头
  • 描边
  • 填充
  • 小号
  • 中号
  • 大号
// <![CDATA[ var oPaintBody = document.querySelector( '.paint-body' ); var oC = document.createElement( 'canvas' ); oC.setAttribute( 'width', '830' ); oC.setAttribute( 'height', '500' ); oPaintBody.appendChild( oC ); var aHeaderLi = document.querySelectorAll('.paint-header li'), aItem = document.querySelectorAll('.paint-body .item'), oCanvas = document.querySelector('.paint canvas'), oGc = oCanvas.getContext('2d'), cWidth = oCanvas.width, cHeight = oCanvas.height, curItem = aItem[0], aItemLi = curItem.querySelectorAll('li'); for (let i = 0, len = aHeaderLi.length; i < len; i++) { //头部选项卡切换功能 aHeaderLi[i].onclick = function () { for (let j = 0; j < len; j++) { aHeaderLi[j].classList.remove('active'); aItem[j].style.display = 'none'; } aItem[i].style.display = "block"; this.classList.add('active'); curItem = aItem[i]; aItemLi = curItem.querySelectorAll('li'); activeItem(aItemLi); } } activeItem(aItemLi); var role = null; function activeItem(aItemLi) { //canvas左侧选项卡切换功能 for (let i = 0, len = aItemLi.length; i < len; i++) { aItemLi[i].onclick = function () { checkPaintType(this); //绘制类型 for (let j = 0; j < len; j++) { aItemLi[j].classList.remove('active'); } this.classList.add('active'); } } } function Shape(canvasObj, cxtObj, w, h) { this.oCanvas = canvasObj; this.oGc = cxtObj; this.oCanvas.width = w; this.oCanvas.height = h; this.fillStyle = '#000'; this.storkeStyle = '#000'; this.lineWidth = 1; this.drawType = 'line'; this.paintType = 'stroke'; this.nums = 6; //正多边形的边数 } Shape.prototype = { init: function () { this.oGc.fillStyle = this.fillStyle; this.oGc.strokeStyle = this.strokeStyle; this.oGc.lineWidth = this.lineWidth; }, draw: function () { var _this = this; this.oCanvas.onmousedown = function (ev) { _this.init(); var oEvent = ev || event, startX = oEvent.clientX - _this.oCanvas.offsetLeft, startY = oEvent.clientY - _this.oCanvas.offsetTop; _this.oCanvas.onmousemove = function (ev) { _this.oGc.clearRect(0, 0, _this.oCanvas.width, _this.oCanvas.height); var oEvent = ev || event, endX = oEvent.clientX - _this.oCanvas.offsetLeft, endY = oEvent.clientY - _this.oCanvas.offsetTop; _this[_this.drawType](startX, startY, endX, endY); }; _this.oCanvas.onmouseup = function () { _this.oCanvas.onmousemove = null; _this.oCanvas.onmouseup = null; } } }, line: function (x1, y1, x2, y2) { this.oGc.beginPath(); this.oGc.moveTo(x1, y1); this.oGc.lineTo(x2, y2); this.oGc.closePath(); this.oGc.stroke(); }, circle: function (x1, y1, x2, y2) { this.oGc.beginPath(); var r = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); this.oGc.arc(x1, y1, r, 0, 2 * Math.PI, false); this.oGc.closePath(); this.oGc[this.paintType](); }, rect: function (x1, y1, x2, y2) { this.oGc.beginPath(); this.oGc.rect(x1, y1, x2 - x1, y2 - y1); this.oGc[this.paintType](); }, polygon: function (x1, y1, x2, y2) { var angle = 360 / this.nums * Math.PI / 180;//边对应的角的弧度 var r = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); this.oGc.beginPath(); for (var i = 0; i .paint * { margin: 0; padding: 0; } .paint ul, .paint li { list-style: none; } .paint li:hover { cursor: pointer; } .paint { width: 980px; margin: 20px auto; border: 1px solid #ccc; overflow: hidden; } .paint .paint-header ul { width: 980px; height: 40px; line-height: 40px; border-bottom: 1px solid #ccc; } .paint .paint-header li { float: left; width: 120px; height: 40px; line-height: 40px; text-align: center; } .paint li.active { box-shadow: #666 0px 1px 8px inset; } .paint .paint-body .siderbar { float: left; width: 150px; height: 500px; } .paint .paint-body .item { width: 150px; overflow: hidden; display: none; height: 500px; border-right: 1px solid #ccc; } .paint .paint-body canvas { float: right; } .paint .paint-body .item li { height: 40px; text-align: center; border-bottom: 1px solid #ccc; line-height: 40px; } .paint .paint-body .active { display: block; }

关于流程设计,后期要做的功能,思路基本上已经有了,好了,圆规正传,想要完成这个终极目标,完成一个画图工具应该就能接近目标了。先体验下目前的简易功能,下面是可以正常画图的,【需要你的浏览器支持canvas才可以额】
主要来讲下目标的雏形架构:

1,图形绘制部分,我封装了一个类Shape

function Shape(canvasObj, cxtObj, w, h) {        this.oCanvas = canvasObj;        this.oGc = cxtObj;        this.oCanvas.width = w;        this.oCanvas.height = h;        this.fillStyle = '#000';        this.storkeStyle = '#000';        this.lineWidth = 1;        this.drawType = 'line';        this.paintType = 'stroke';        this.nums = 6; //正多边形的边数    }

canvasObj: 就是canvas画布对象

cxtObj: 就是上下文绘图环境

w: canvas的宽度

h:  canvas的高度

fillStyle: 填充颜色

strokeStyle: 描边颜色

lineWidth: 线宽

drawType: 默认为画直线

paintType: stroke/fill 两种选择( 描边/填充)

2,在原型对象上扩展一个公共方法draw用来绘制图形

draw方法,主要获取起始点坐标(startX, startY),以及终点坐标( endX, endY );

然后调用init方法来获取绘制状态,绘制具体的图形靠下面这个关键方法:

_this[_this.drawType](startX, startY, endX, endY)

这个方法的drawType会根据界面的实时选择,变换对应的绘制类型,如:

_this[‘line’]( startX, startY, endX, endY )

调用的就是oShape对象中的line,画直线的方法

Shape.prototype = {        init: function () {            this.oGc.fillStyle = this.fillStyle;            this.oGc.strokeStyle = this.strokeStyle;            this.oGc.lineWidth = this.lineWidth;        },        draw: function () {            var _this = this;            this.oCanvas.onmousedown = function ( ev ) {                _this.init();                var oEvent = ev || event,                    startX = oEvent.clientX - _this.oCanvas.offsetLeft,                    startY = oEvent.clientY - _this.oCanvas.offsetTop;                _this.oCanvas.onmousemove = function ( ev ) {                    _this.oGc.clearRect( 0, 0, _this.oCanvas.width, _this.oCanvas.height );                    var oEvent = ev || event,                        endX = oEvent.clientX - _this.oCanvas.offsetLeft,                        endY = oEvent.clientY - _this.oCanvas.offsetTop;                    _this[_this.drawType](startX, startY, endX, endY);                };                _this.oCanvas.onmouseup = function(){                    _this.oCanvas.onmousemove = null;                    _this.oCanvas.onmouseup = null;                }            }        },        line: function ( x1, y1, x2, y2 ) {            this.oGc.beginPath();            this.oGc.moveTo( x1, y1 );            this.oGc.lineTo( x2, y2 );            this.oGc.closePath();            this.oGc.stroke();        },        circle : function( x1, y1, x2, y2 ){            this.oGc.beginPath();            var r = Math.sqrt( Math.pow( x2 - x1, 2 ) + Math.pow( y2 - y1, 2 ) );            this.oGc.arc( x1, y1, r, 0, 2 * Math.PI, false );            this.oGc.closePath();            this.oGc[this.paintType]();        },        rect : function( x1, y1, x2, y2 ){            this.oGc.beginPath();            this.oGc.rect( x1, y1, x2 - x1, y2 - y1 );            this.oGc[this.paintType]();        },        polygon : function( x1, y1, x2, y2 ){            var angle = 360 / this.nums * Math.PI / 180;//边对应的角的弧度            var r = Math.sqrt( Math.pow( x2 - x1, 2 ) + Math.pow( y2 - y1, 2 ) );            this.oGc.beginPath();            for( var i = 0; i < this.nums; i ++ ){                this.oGc.lineTo( x1 + r * Math.cos( angle * i ), y1 + r * Math.sin( angle * i ) );            }            this.oGc.closePath();            this.oGc[this.paintType]();        }    }

3,界面操作很简单,基本是选项卡的操作+html5的自定义属性+classList的应用

以上就是html5自己做一个类似windows的画图软件的方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1545030.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月21日 16:31:08
下一篇 2025年12月20日 06:59:10

相关推荐

  • html5实现下雪效果的方法

    利用canvas,实现一个下雪的效果,我们先预览下效果: 我们先分析下这个效果: 1,随机产生雪花 2,雪花的产生不是同时产生,而是有先后顺序的 3,雪花怎么表示 立即学习“前端免费学习笔记(深入)”; 4,怎么源源不断的下雪 5,雪花有大有小 搞清楚上面几个问题之后,这个效果基本上就实现了, 首先…

    好文分享 2025年12月21日
    000
  • html5 1px问题以及绘制坐标系网格的方法

    在canvas中,要画出1px的线条,默认情况下是不行的 context.beginPath(); context.moveTo( 100, 100 ); context.lineTo( 400, 100 ); context.closePath(); context.stroke(); conte…

    2025年12月21日
    000
  • 关于h5中新增的几个背景属性和文本属性

    一、背景图像显示: ①background-size:规定背景图像的大小; 值:像素值、百分比、auto、cover、contain ②background-origin :规定背景图像的起始位置; 值:padding-box(默认)、content-box、border-box ③backgrou…

    好文分享 2025年12月21日
    000
  • 防止html5的video标签在iphone中自动全屏的方法

      问题: 当在iphone中打开html5页面中的video视频时,会默认调取系统播放器,全屏播放视频资源。   解决方式: 1. 首先在html5页面的video标签中添加webkit-playsinline=true;         接着在UIWebView中设置allowsInlineMe…

    好文分享 2025年12月21日
    000
  • 如何解决html5 canvas 绘制字体、图片与图形模糊问题

    html5 canvas 绘制字体、图片与图形模糊问题 发生情况 多出现在高dpi设备,这意味着每平方英寸有更多的像素,如手机,平板电脑。当然很多高端台式电脑也有高分辨率高dpi的显示器。  canvas在浏览器中的缩放原理 如果没有设置style那么就以html的属性width,height作为尺…

    好文分享 2025年12月21日
    000
  • html5和html有什么区别

    浅谈:html5和html的区别 最近看群里聊天聊得最火热的莫过于手机网站和html5这两个词。可能有人会问,这两者有什么关系呢?随着这移动互联网快速发展的时代,尤其是4G时代已经来临的时刻,加上微软对“XP系统”不提供更新补丁、维护的情况下“html5+css3”也逐渐的成为新一代web前端技术,…

    好文分享 2025年12月21日
    000
  • HTML5新特性dataset的使用方法

    这篇文章主要介绍了html5自定义属性前缀data-及dataset的使用方法(html5 新特性),需要的朋友可以参考下 HTML5规定可以为元素添加非标准的属性,但要添加前缀 data- ,目的是为元素提供与渲染无关的信息,或者提供语义信息。这些属性可以任意添加、随便命名,只要以 data- 开…

    好文分享 2025年12月21日
    000
  • 如何用Windows自带画图工具吸取色值

    1、打开画图windows自带画图软件 2、用qq截图要吸取颜色的图片,ctrl+v粘贴到画图软件中 3、点击取色器,吸取颜色,这是会看到吸取成功的颜色 4、打开编辑颜色 5、这样就得到了RGB颜色 6、将RGB颜色转换成16进制,最简单的方法就是百度… 1、打开画图windows自带画图软件 2、…

    2025年12月21日 好文分享
    000
  • 巧妙地用HTML打开Windows文件管理

    (一)代码演示 Insert title here 注册 用户名: 密码: 性别: 男 女 擅长: Java Hadoop PHP 头像: (二)效果图 以上就是巧妙地用HTML打开Windows文件管理的详细内容,更多请关注创想鸟其它相关文章!

    2025年12月21日
    000
  • html5浏览器截图的示例

    这篇文章主要介绍了html5使用html2canvas实现浏览器截图的示例,非常具有实用价值,需要的朋友可以参考下 最近做项目为了解决全局异常信息记录,研究了一下浏览器全屏截图功能,方便用户发现异常时能够快速截图发给管理员。最终记录的异常信息如下,上面的【截图报告管理员】就是使用html2canva…

    2025年12月21日
    000
  • html5中sse服务器发送事件EventSource相关介绍

    本篇文章主要介绍了浅谈html5之sse服务器发送事件eventsource介绍,具有一定的参考价值,有兴趣的可以了解一下 前言 我前面文章讲过数据大屏,里面的数据时时更新。还有时时更新的股票数据,Facebook/Twitter 更新、估价更新、新的博文、赛事结果等等,都需要数据时时更新。之前我们…

    2025年12月21日
    000
  • 实例详解html5使用canvas实现图片下载功能

    这篇文章主要介绍了html5使用canvas实现图片下载功能的示例代码,非常具有实用价值,需要的朋友可以参考下 最近项目中需要实现一个下载图片的功能(如下图) 一开始考虑使用a标签的download属性进行下载: 下载海报 但是通过测试,发现再safari中,下载的文件不能带上拓展名,所以只好换一个…

    2025年12月21日
    000
  • 详解HTML5如何操作WebSQL数据库

    下面通过本文给大家分享html5操作websql数据库的实例代码,感兴趣的朋友一起看看吧 HTML代码: 列车时刻表查询 列车时刻表查询 请给我留言 姓名: 留言: 留言 查询 收藏 给我留言 Close 收藏成功,暂且不做处理!. 请点击右上角有个关闭按钮 提示: 你也可以点击弹窗的外部区域来关闭…

    2025年12月21日
    000
  • 韩顺平H5游戏开发坦克大战视频源码课件分享

    《韩顺平h5游戏开发坦克大战视频教程》是选自韩顺平的网络公开课,介绍了如何使用html5来制作坦克大战游戏,对h5的技术有很显著的提高.我将会带着大家做一个3d的俯视坦克大战游戏。将从最基本的控制,到敌人的ai与整个游戏的系统等一步步的带着大家实现一个完整的游戏。教程中我们重点是程序与unity的使…

    2025年12月21日
    000
  • 关于HTML5中性能优化的详解

    HTML5性能优化 –减少重绘         在HTML页面完成展现之后,动态改变页面元素或调整CSS样式都会引起浏览器重绘,性能的损耗直接取决于动态改变的范围:如果只是改变一个元素的颜色之类的信息则只会重绘该元素;而如果是增删节点或调整节点位置则会引起其兄弟节点也一并重绘。     …

    好文分享 2025年12月21日
    000
  • javascript如何实现拖放功能_相关的事件有哪些

    关键拖放事件包括源元素的dragstart、drag、dragend和目标元素的dragenter、dragover、dragleave、drop;需设置draggable=”true”,在dragstart中setData,在dragover中preventDefault,…

    2025年12月21日 好文分享
    000
  • 如何实现JavaScript验证表单_前端验证的最佳实践是什么

    JavaScript表单验证核心是提升体验与保障基础数据质量,但不可替代后端验证;需结合HTML5原生属性与JS增强交互,确保提示清晰可访问,并始终信任后端校验。 JavaScript 表单验证的核心目标是提升用户体验和保障基础数据质量,但它不能替代后端验证。前端验证应快速反馈、友好提示、不干扰正常…

    2025年12月21日
    000
  • javascript的SEO优化有哪些方法_如何让单页应用被搜索引擎收录

    单页应用(SPA)需通过服务端渲染(SSR)、预渲染或动态渲染使爬虫获取完整HTML,辅以语义化标签、动态元信息、规范路由及Sitemap等基础SEO实践来提升搜索引擎收录效果。 单页应用(SPA)默认对搜索引擎不友好,因为传统爬虫难以执行 JavaScript 渲染页面内容。要让搜索引擎收录 SP…

    2025年12月21日
    000
  • JavaScript如何实现数据可视化?

    JavaScript数据可视化核心是选用成熟图表库(如Chart.js、D3.js、ECharts、Plotly.js)将规范数据渲染为图形,需准备结构化数据、配置选项、嵌入网页,并注意响应式、交互及数据校验。 JavaScript 实现数据可视化,核心是借助成熟的图表库将结构化数据转化为图形界面,…

    2025年12月21日
    000
  • javascript可以开发游戏吗_怎样用canvas创建简单动画

    JavaScript配合HTML5可原生开发2D游戏动画;需获取2D上下文,用requestAnimationFrame实现清屏→绘制→循环;通过变量更新位置并重绘,配合边界检测防止越界。 当然可以,JavaScript 配合 HTML5 是开发轻量级 2D 游戏和动画的常用组合,无需插件,浏览器原…

    2025年12月21日
    000

发表回复

登录后才能评论
关注微信