代码展示:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>canvas实现简易画板</title>
  6. <style>
  7. body, div {
  8. margin: 0;
  9. padding: 0;
  10. text-align: center;
  11. }
  12. #bk {
  13. margin: 10px auto;
  14. width: 400px;
  15. height: 36px;
  16. }
  17. .bk {
  18. width: 20px;
  19. height: 20px;
  20. display: inline-block;
  21. margin: 12px;
  22. border: 1px dotted gray;
  23. }
  24. #cav {
  25. border: 1px solid #ddd;
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <div id="bk"></div>
  31. <canvas id="cav" width="600" height="400"></canvas>
  32. <script>
  33. var canvas = document.getElementById('cav');
  34. var ctx = canvas.getContext('2d');
  35. var $bk = document.getElementById('bk');
  36. var bColor = ['#000000', '#999999', '#CC66FF', '#FF0000', '#FF9900', '#FFFF00', '#008000', '#00CCFF'];
  37. var col = "#FF0000";
  38. var fragment = document.createDocumentFragment();
  39. var $span = null;
  40. function initBrush() {
  41. for(var i=0; i<bColor.length; i++) {
  42. $span = document.createElement('span');
  43. $span.className = 'bk';
  44. $span.style.backgroundColor = bColor[i];
  45. $span.onclick = function() {
  46. col = window.getComputedStyle(this, null).getPropertyValue('background-color');
  47. }
  48. fragment.appendChild($span);
  49. }
  50. $bk.appendChild(fragment);
  51. }
  52. function initPainter() {
  53. canvas.onmousedown = function(e) {
  54. ctx.lineWidth = 2;
  55. ctx.strokeStyle = col;
  56. var x = e.offsetX;
  57. var y = e.offsetY;
  58. ctx.beginPath();
  59. ctx.moveTo(x, y);
  60. canvas.onmousemove = function(e) {
  61. var nx = e.offsetX;
  62. var ny = e.offsetY;
  63. ctx.lineTo(x, y);
  64. ctx.stroke();
  65. x = nx;
  66. y = ny;
  67. }
  68. document.onmouseup = function() {
  69. canvas.onmousemove = null;
  70. }
  71. }
  72. }
  73. window.onload = function() {
  74. initBrush();
  75. initPainter();
  76. }
  77. </script>
  78. </body>
  79. </html>

效果展示:

知识点

Window.getComputedStyle():是一个可以获取当前元素所有最终使用的CSS属性值。返回的是一个CSS样式声明对象([object CSSStyleDeclaration]),只读,而element.style能读能写。

语法如下

var style = window.getComputedStyle("元素", "伪类");

举例如下

  1. var elem1 = document.getElementById("elemId");
  2. var style = window.getComputedStyle(elem1, null);
  3. // this is equivalent:
  4. // var style = document.defaultView.getComputedStyle(elem1, null);

额外提示下:Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1) 之前,第二个参数“伪类”是必需的(如果不是伪类,设置为null),不过现在嘛,不是必需参数了。其中defaultView一般情况下是不需要写的,只有在FireFox3.6中才会使用。

如果我们想要获得某个具体的属性值,我们需要用到getPropertyValue方法,实例如下:

  1. window.getComputedStyle(document.querySelector("#testEL"),null).getPropertyValue("background-color");
  2. //或者是用另外一种方法
  3. window.getComputedStyle(element, null).getPropertyValue("float");

值得注意的是:使用getPropertyValue方法不支持驼峰写法,使用-来分割,例如:style.getPropertyValue("border-top-left-radius");如果我们不使用getPropertyValue方法,直接使用键值访问,其实也是可以的。但是,比如这里的的float,如果使用键值访问,则不能直接使用getComputedStyle(element, null).float,而应该是cssFloatstyleFloat,自然需要浏览器判断了,比较折腾!

另外还需注意的是在IE中的解决方法

在IE8及以下是不支持这个属性的,它自己使用currentStyle来获取css值,不过,currentStyle属性貌似不支持伪类样式获取,这是与getComputedStyle方法的差异。根据上面知识我们可以写一个封装好的获取样式函数:

  1. function getStyle(obj,attr){
  2. if(obj.currentStyle){ //IE
  3. return obj.currentStyle[attr];
  4. }else{
  5. return window.getComputedStyle(obj,"伪类")[attr];//Firefox
  6. }
  7. }

补充知识点

JS修改css样式的四种方法:

  1. 直接设置style的属性:element.style.backgroundColor = 'red'
  2. 直接设置属性:element.setAttribute('height', 100) //element.setAttribute('height', '100px')
  3. 设置cssTextelement.style.cssText = 'background-color: blue;color: red;'
  4. 改变classelement.className = 'blue';element.classList.add('blue')

参考链接:

https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle

http://www.zhangxinxu.com/wordpress/2012/05/getcomputedstyle-js-getpropertyvalue-currentstyle/

canvas简易画板的更多相关文章

  1. canvas简易画板。

    在学canvas的时候,想到可以做一个自己用来画画的简易画板,加上canvas的基础都已经学完,便尝试做了一个画板.如图 1.获取标签. var c=document.getElementById(' ...

  2. Kivy 中文教程 实例入门 简易画板 (Simple Paint App):3. 随机颜色及清除按钮

    1. 随机颜色 通过前面的教程,咪博士已经带大家实现了画板的绘图功能.但是,现在画板只能画出黄色的图案,还十分单调,接下来咪博士就教大家,如何使用随机颜色,让画板变得五彩斑斓. 改进后的代码如下: f ...

  3. Kivy 中文教程 实例入门 简易画板 (Simple Paint App):2. 实现绘图功能

    1. 理解 kivy 坐标系统 上一节中,咪博士带大家实现了画板程序的基础框架,以及一个基本的自定义窗口部件(widget).在上一节的末尾,咪博士留了一道关于 kivy 坐标系统的思考题给大家.通过 ...

  4. h5-10 canvas 简易祖玛

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. html5 canvas简易版捕鱼达人游戏源码

    插件描述:html5利用canvas写的一个js版本的捕鱼,有积分统计,鱼可以全方位移动,炮会跟着鼠标移动,第一次打开需要鼠标移出背景图,再移入的时候就可以控制炮的转动,因为是用的mouseover触 ...

  6. canvas实现画板

    canvas实现画板 主要用到知识点: 鼠标事件onmousedown() onmousemove() onmouseup() onmouseleave() 事件委托 canvas的一些方法 如:绘制 ...

  7. Kivy 中文教程 实例入门 简易画板 (Simple Paint App):1. 自定义窗口部件 (widget)

    1. 框架代码 用 PyCharm 新建一个名为 SimplePaintApp 的项目,然后新建一个名为 simple_paint_app.py 的 Python 源文件, 在代码编辑器中,输入以下框 ...

  8. Kivy 中文教程 实例入门 简易画板 (Simple Paint App):0. 项目简介 & 成果展示

    本教程咪博士将带领大家学习创建自己的窗口部件 (widget).最终,我们完成的作品是一个简易的画板程序. 当用 kivy 创建应用时,我们需要仔细思考以下 3 个问题: 我们创建的应用需要处理什么数 ...

  9. 一款基于HTML5 Canvas的画板涂鸦动画

    今天给各网友分享一款基于HTML5 Canvas的画板涂鸦动画.记得之前我们分享过一款HTML5 Canvas画板工具,可以切换不同的笔刷,功能十分强大.本文今天要再来分享一款基于HTML5 Canv ...

随机推荐

  1. re正则表达式-1

    匹配/查找/替换/分割函数: import re re.match('aa','aabbcc') 返回对象中span为开始位置和结束位置 re.match('aa','bbaacc') #返回值为No ...

  2. Python OpenCV人脸识别案例

    ■环境 Python 3.6.0 Pycharm 2017.1.3 ■库.库的版本 OpenCV 3.4.1 (cp36) ■haarcascades下载 https://github.com/ope ...

  3. 关于IWMS后台登录问题总结

    一.登录后台,点击登录无反应: 1.是因为网站文件夹没有权限,需要右击文件夹,将只读勾选去掉 2.在安全中加入Everyone对象. 二.登录后台后,左边显示不全,是因为会员权限不够,需要给权限.

  4. Add Languages to Your Xamarin Apps with Multilingual App Toolkit

    With Xamarin, you can extend your cross-platform apps with support for native speakers, reaching mar ...

  5. React Router 4.0 ---- 嵌套路由和动态路由

    嵌套路由,从广义上来说,分为两种情况:一种是每个路由到的组件都有共有的内容,这时把共有的内容抽离成一个组件,变化的内容也是一个组件,两种组件组合嵌套,形成一个新的组件.另一种是子路由,路由到的组件内部 ...

  6. python---反射详解

    反射即想到4个内置函数分别为:getattr.hasattr.setattr.delattr  获取成员.检查成员.设置成员.删除成员 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  7. BZOJ3724PA2014Final Krolestwo——欧拉回路+构造

    题目描述 你有一个无向连通图,边的总数为偶数.设图中有k个奇点(度数为奇数的点),你需要把它们配成k/2个点对(显然k被2整除).对于每个点对(u,v),你需要用一条长度为偶数(假设每条边长度为1)的 ...

  8. eolinker——分享项目只需两步

    登陆后打开项目概况 然后进入到分享项目界面,可根据自己的需求进行设置

  9. Alice's Chance POJ - 1698(按时间点建边)

    Alice's Chance Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7791   Accepted: 3174 De ...

  10. verilog parameter 位宽问题

    前言 一直以为parameter 的位宽是无限的,其实不然. 流程: 仿真一下就知道啦: 用处: 精准控制位宽理论上会占用更少的内存,其他好像并没有什么卵用,注意不要越界,我这里系统默认32bit位宽 ...