经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » HTML5 » 查看文章
canvas的常用功能(电脑版)
来源:cnblogs  作者:不教一日闲过  时间:2019/10/11 8:57:48  对本文有异议

前言:

  canvas可以单独算为前端的一大知识模块, 今天就研究一下.

  先做下前文铺垫:

    ①创建canvas

  1. <canvas id="myCanvas" width="200" height="100" style="border:1px solid #000000;"></canvas>

    ②获取canvas

  1. var cavs = document.getElementById("cavs"); //获取canvas
  2. var ctx = cavs.getContext("2d"); //可以理解为生成一个2d画笔
  3. ctx.moveTo(100, 100); //落笔点
  4. ctx.lineTo(200, 200); //结束点

    ③常用样式

  1. ctx.strokeStyle = "#f00" //线条的颜色2
  2. ctx.lineWidth = 10; //线条粗细

    ④绘制线条

  1.       ctx.stroke(); //绘制线条

    ⑤填充图案

  1.      ctx.fillStyle = "yellow"; //填充颜色
         ctx.fill(); //进行填充

    ⑥开始结束

  1. ctx.beginPath(); //开始
  2. ctx.closePath(); //结束

    ⑦其他

  1. var img = ctx.getImageData(x, y, width, height); //截取canvas中图案
  2. ctx.putImageData(img, width, height) //将img放到canvas中
  3. ctx.clearRect(x,y,canvas.width,canvas.height) //清除画布

 

正文:

  说再多也没用, 最终还是进行实战, 终于进入正文了;

  HTML部分

  1. <div class="wrapper">
  2. <canvas id="cavs" width="1000" height="500"></canvas>
  3. <ul class="btn-list">
  4. <li><input type="color" id="colorBoard"></li>
  5. <li><input type="button" id="cleanBoard" value="清屏"></li>
  6. <li><input type="button" id="eraser" value="橡皮"></li>
  7. <li><input type="button" id="rescind" value="撤销"></li>
  8. <li><input type="range" id="lineRuler" value="线条" min="1" max="30"></li>
  9. </ul>
  10. </div>

  css部分

  1. *{
  2. padding: 0;
  3. margin: 0;
  4. }
  5. .wrapper{
  6. margin: 15px;
  7. }
  8. .wrapper canvas{
  9. border:1px solid #000;
  10. border-radius: 25px;
  11. box-shadow:10px 10px 5px #999;
  12. margin-bottom: 20px;
  13. }
  14. .wrapper ul{
  15. width: 1000px;
  16. text-align: center;
  17. }
  18. .wrapper ul li{
  19. display: inline-block;
  20. margin-left: 40px;
  21. }
  22. .wrapper ul li input{
  23. display: block;
  24. background: #ddd;
  25. color: #000;
  26. border-radius: 25px;
  27. border:none;
  28. padding: 10px 20px;
  29. font-size: 15px;
  30. transition-duration: 0.2s;
  31. }
  32. .wrapper ul li input:hover{
  33. background: #999;
  34. border: 1px solid #f00;
  35. box-shadow: 0 12px 16px 0 rgba(0,0,0,0.3);
  36. }

  js部分

  1. function ID(str) {
  2. return document.getElementById(str);
  3. }
  4. var darwingLineObj = {
  5. cavs:this.ID("canvas"),
  6. color:this.ID("color"),
  7. clear:this.ID("clear"),
  8. eraser:this.ID("eraser"),
  9. rescind:this.ID("rescind"),
  10. weight:this.ID("weight"),
  11. bool:false,
  12. arrImg:[],
  13. //初始化
  14. init:function(){
  15. this.draw();
  16. },
  17. draw:function(){
  18. var cavs = this.cavs,
  19. self = this,
  20. ctx = cavs.getContext("2d");
  21. ctx.lineWidth = 15;
  22. ctx.lineCap = "round"; //线条始终的样式
  23. ctx.lineJoin = "round"; //转弯的圆角
  24.  
  25. var c_x = cavs.offsetLeft, //元素距离左侧的位置
  26. c_y = cavs.offsetTop; //canvas距离顶部
  27. cavs.onmousedown = function(e){
  28. e = e || window.event;
  29. self.bool = true;
  30. var m_x = e.pageX - c_x;
  31. var m_y = e.pageY - c_y;
  32. ctx.beginPath();
  33. ctx.moveTo(m_x,m_y); //鼠标在画布上的触点
  34.  
  35. var imgData = ctx.getImageData(0, 0, cavs.width, cavs.height); //将每次画完拷贝到数组中
  36. self.arrImg.push(imgData);
  37. }
  38. cavs.onmousemove = function(e){
  39. if(self.bool){
  40. ctx.lineTo(e.pageX-c_x, e.pageY-c_y);
  41. ctx.stroke();
  42. }
  43. }
  44. cavs.onmouseup = function(e){
  45. self.bool = false;
  46. ctx.closePath();
  47. }
  48. self.color.onchange = function(e){ //设置颜色
  49. e = e || window.event;
  50. //console.log(e.target.value)
  51. ctx.strokeStyle = e.target.value;
  52. }
  53. self.clear.onclick = function(){
  54. ctx.clearRect(0,0,cavs.width,cavs.height)
  55. }
  56. self.eraser.onclick = function(){
  57. ctx.strokeStyle = "#fff";
  58. }
  59. self.rescind.onclick = function(){ //撤销的重点难点
  60. if (self.arrImg.length>0) {
  61. ctx.putImageData(self.arrImg.pop(),0,0)
  62. }
  63. }
  64. self.weight.onchange = function(e){ //设置线条粗细
  65. //console.log(e.target.value)
  66. ctx.lineWidth = e.target.value;
  67. }
  68. }//draw end
  69. }
  70. darwingLineObj.init();

 

结语:

  本文还有不足之处, 欢迎大家指正.

声明:

  参考: 渡一教育

 

 

 

    

原文链接:http://www.cnblogs.com/xihailong/p/11640834.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号