[关闭]
@wangjialin 2016-04-18T18:22:45.000000Z 字数 4714 阅读 871

《JavaScript DOM 编程艺术》读书笔记(五)

读书总结


Modernizr

Modernizr是一个开源JavaScript库,用法和功能如下:

HTML5新元素

点击查看HTML5标签

  1. 更加语义化的标签(Internet Explorer 9+, Firefox, Opera, Chrome 以及 Safari 支持以下标签):
  2. <artical>, <aside>, <footer>, <header>, <section>, <nav>, <source>, <time>, <figcaption>, <figure>, <mark>, <embed>, <progress>

除了上面的,还有很多HTML5标签,下面从实例出发,了解下其中的canvas:
根据路径绘图~画一个小盒子
首先,明确canvas本质就是一个画布,在python里面有类似的用法,所以我们先来熟悉一下用canvas标签来画一个简单的小方块------点击查看demo
核心代码如下:

  1. function draw() {
  2. var canvas = document.getElementById("draw-in-me");
  3. if (canvas.getContext) {
  4. var ctx = canvas.getContext("2d");
  5. ctx.beginPath();
  6. ctx.moveTo(120.0, 32.0);
  7. //三次贝塞尔曲线
  8. ctx.bezierCurveTo(120.0, 36.4, 116.4, 40.0, 112.0, 40.0);
  9. ctx.lineTo(8.0, 40.0);
  10. ctx.bezierCurveTo(3.6, 40.0, 0.0, 36.4, 0.0, 32.0);
  11. ctx.lineTo(0.0, 8.0);
  12. ctx.bezierCurveTo(0.0, 3.6, 3.6, 0.0, 8.0, 0.0);
  13. ctx.lineTo(112.0, 0.0);
  14. ctx.bezierCurveTo(116.4, 0.0, 120.0, 3.6, 120.0, 8.0);
  15. ctx.lineTo(120.0, 32.0);
  16. ctx.closePath(); //关闭此次绘制
  17. ctx.fill(); //默认填充黑色
  18. ctx.lineWidth = 2.0;
  19. ctx.strokeStyle = "rgb(255, 255, 255)"; //路径颜色
  20. ctx.stroke(); //实际绘制路径
  21. }
  22. }

原理很简单,canvas是一块有着横纵坐标的画布,左上角为原点,越往右x越大,越往下y越大,变量ctx引用的是画布的绘图空间(二维),简单的根据矢量作图就是在一个二维平面上面确定几个点,连线作为绘图经过的路径,这里中间对绘图结果做了一个边角的处理,可以参考三次贝塞尔曲线是什么用js计算三次贝塞尔曲线

根据位图绘图~处理灰度图片
这个例子是将一个彩色图片用canvas处理成灰度版,并用 onmouseover 以及 onmouseout 来进行彩色版和灰度版本的切换,点击查看demo------demo;
核心代码如下:

  1. function convertToGS(img) {
  2. //存储原始彩色版
  3. img.color = img.src;
  4. //创建灰度版
  5. img.grayscale = createGSCanvas(img);
  6. //在onmouseover时候发生切换
  7. img.onmouseover = function() {
  8. this.src = this.color;
  9. }
  10. img.onmouseout = function() {
  11. this.src = this.grayscale;
  12. }
  13. img.onmouseout();
  14. }
  15. function createGSCanvas(img) {
  16. var canvas = document.createElement("canvas");
  17. canvas.width = img.width;
  18. canvas.height = img.height;
  19. var ctx = canvas.getContext("2d");
  20. //将图片绘制入画布
  21. ctx.drawImage(img, 0, 0);
  22. //getImageData只能操作和脚本处于同一个域中的图片
  23. var c = ctx.getImageData(0, 0, img.width, img.height);
  24. //按照像素修改图片的颜色
  25. for (var i = 0; i < c.height; i++) {
  26. for (var j = 0; j < c.width; j++) {
  27. var x = (i * c.width + j) * 4;
  28. var r = c.data[x];
  29. var g = c.data[x + 1];
  30. var b = c.data[x + 2];
  31. c.data[x] = c.data[x + 1] = c.data[x + 2] = (r+g+b)/3;
  32. }
  33. }
  34. ctx.putImageData(c, 0, 0, 0, 0, c.width, c.height);
  35. return canvas.toDataURL();
  36. }
  37. //添加load事件,如果有其他脚本,换用addEventLoad函数比较好
  38. window.onload = function() {
  39. convertToGS(document.getElementById("cute"));
  40. }

原理:首先创建切换函数,鼠标悬停(onmouseover)时图片为彩色版,离开(onmouseout)时图片为灰度版;接着完成构建灰度图片的函数,简单讲先把图片写入画布(ctx.drawImage(img, 0, 0)),然后读出图片的每一个像素,然后将该像素的rgb颜色变为(r+g+b)/3后修改图片参数(ctx.putImageData),这样在鼠标悬停时为原本的彩色,离开时调用这个函数将图片处理成灰度版。原理应该是很好理解的,但是具体操作的时候会遇到几个问题:

  1. <?php
  2. $pic = 'http://avatar.csdn.net/7/5/0/1_molaifeng.jpg';
  3. $arr = getimagesize($pic);
  4. $pic = "data:{$arr['mime']};base64," . base64_encode(file_get_contents($pic));
  5. ?>
  6. <img src="<?php echo $pic ?>" />
  1. var uimageObj = new Image();
  2. UimageObj.crossOrigin = 'anonymous'; // crossOrigin attribute has to be set before setting src.If reversed, it wont work.
  3. UimageObj.src = obj_data.srcUser;
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注