zoukankan      html  css  js  c++  java
  • 初学canvas,遇到width和height显示问题和用excanvas.js兼容IE问题

    /*-----------------------ITEYE 祈祷幸福博客原创,转载请注明。-------------------*/


    第一次认真写技术博客文~~~若有不严谨的地方,望指正。 



    今天是第一天认真开始学canvas,书上网上写的还是蛮简单的,结果一写代码,遇到了一些细节细节问题,分享一下自己总结的吧。 


    问题一:内部样式表重置canvas的width和height,图形显示不正确 
    首先,canvas默认的width是150px,height是300px。不要小看这个简单的设置,我就栽了跟头: 
    我看的初学pdf是canvas tutorial,上面的例子代码是这样的: 

    Html代码  收藏代码
    1. <body>  
    2.         <canvas id='tutorial' width='150px' height='150px'></canvas>  
    3. </body>  



    Css代码  收藏代码
    1. canvas{  
    2.         border:2px solid #000;  
    3.         margin:10px;  
    4.         padding:10px;  
    5.         color:red;  
    6. }  



    Javascript代码  收藏代码
    1. $(document).ready(function(){  
    2.         draw();  
    3. });  
    4. function draw(){  
    5.         var canvas = document.getElementById('tutorial');  
    6.         if(canvas.getContext){  
    7.                 var ctx = canvas.getContext('2d');  
    8.                 ctx.fillRect(25, 25, 100, 100);  
    9.         }  
    10. }  



    学前端的都知道,内容和表现是要分离的,所以我就改了一下: 

    Html代码  收藏代码
    1. <body>  
    2.         <canvas id='tutorial'></canvas>  
    3. </body>  



    Css代码  收藏代码
    1. canvas{  
    2.         150px;  
    3.         height:150px;  
    4.         border:2px solid #000;  
    5.         margin:10px;  
    6.         padding:10px;  
    7.         color:red;  
    8. }  


    Javascript部分没有变。于是悲剧就酿成了: 

    这是我看到的样子: 
     

    而教程上说的是这个样子: 
     

    我搜了各种资料都无果,也看了API,fillRect(x, y, w, h)显然应该是个正方形。 
    最后,我把代码改得和原代码一样,就是说使用行内样式写宽高,现代浏览器除了IE都正常了(至于IE嘛,见下文)。 

    再次搜索,大概找到了问题: 
    搜索结果:http://topic.csdn.net/u/20110205/00/04e5481d-2a0b-4c17-b0c0-4e89da146926.html 
    canvas有自己的width和height属性,和css设置的还不是等同的,而至于行内样式和内部样式表为什么会不同,我水平有限,还不能给出解答,若你知道原因,可以交流下~~ 

    为了稳妥起见,我觉得咱以后还是这样改宽高吧: 

    Html代码  收藏代码
    1. <body>  
    2.     <canvas id='tutorial'></canvas>  
    3. </body>  
    Javascript代码  收藏代码
    1. $(document).ready(function(){  
    2.     draw();  
    3. });  
    4. function draw(){  
    5.     var canvas = document.getElementById('tutorial');  
    6.     canvas.width = 150;  
    7.     canvas.height = 150;  
    8.     if(canvas.getContext){  
    9.         var ctx = canvas.getContext('2d');  
    10.         ctx.fillRect(25, 25, 100, 100);  
    11.     }  
    12. }  



    休息一下,再看问题二~:arrow: 

    问题二: 用excanvas.js兼容IE时,条件注释位置引起的显示问题 
    都知道IE9以下的版本是不支持html5的,更不要说canvas绘图了,所以,根据书上所说,我去下载了excanvas.js。 
    大家都知道,js很多时候都是放在body之后的,防止页面未加载完成就执行脚本。我个人习惯也是这样做,于是我理所当然得这样写了(片段代码): 

    Html代码  收藏代码
    1. <html>  
    2. <!--省略head代码-->  
    3.     <body>  
    4.         <canvas id='tutorial'></canvas>   
    5.     </body>  
    6.         <!--[if lt IE 9]>  
    7.             <script src="excanvas.min.js" type="text/javascript"></script>    
    8.         <![endif]-->  
    9.         <script src="jquery-1.5.1.min.js" type="text/javascript"></script>  
    10.         <script type="text/javascript">  
    11.             $(document).ready(function(){  
    12.                 draw();  
    13.             });  
    14.             function draw(){  
    15.                 var canvas = document.getElementById('tutorial');  
    16.                 if(canvas.getContext){  
    17.                     var ctx = canvas.getContext('2d');  
    18.                     ctx.fillRect(25, 25, 100, 100);  
    19.                 }  
    20.             }  
    21.         </script>  
    22. </html>  



    然后IE果断杯具了,没有显示出画布。 
    我以为是excanvas.js还不够强大,于是自作多情加了个html5.js,发现还是不行。然后搜了一篇文章,写的是html5.js要放在head里面,不然之后的html5标签无法辨认。 
    于是,我也试着把excanvas.js放在head里。显示正确。 
    注意下:以上的IE显示正确是在宽高用js函数来更改的情况下。 

    如果你是用问题一所说的行内样式更改的宽高,虽然非IE的现代浏览器显示正常,但是IE下显示结果是这样的: 
    ps、本人测的是IE8。 
     
    IE里面的canvas宽高还是默认的。 


    所以,综合来看,以后还是不要在样式表里面乱改canvas的宽和高,不然会酿成各种杯具。 


    PS、期间偶有点忘记条件注释砸写了,搜索的时候发现网上有两种写法,运行时候发现第二种是不可行的,建议写的时候注意一下。 
    <!--[if lt IE 9]><![endif]--> 
    <!--[if lt IE9]><![endif]--> 


    参考手册: 
    canvas在线手册图片版(HTML5 Canvas Cheat Sheet v1.x):http://www.nihilogic.dk/labs/canvas_sheet/HTML5_Canvas_Cheat_Sheet.png 
    本人看的pdf在线版:http://www.docin.com/p-136387127.html 

    转自 http://qidaoxingfu.iteye.com/blog/1147566

  • 相关阅读:
    Sqlserver 2008:sp_msforeachdb 坑爹的错误陷阱
    安装官方 Synaptics 驱动,终于解决 HP Pavilion G4 笔记本 讨厌的触摸板锁定问题!
    Sqlserver 2008+:变更数据捕获(CDC) 和 更改跟踪(CT)
    PHP.ini 性能优化
    PHP Notice: Undefined index: ... 问题的解决方案
    查询类方法代码分析
    页面跳转方法总结大全
    如何关闭searchIndexer.exe进程
    如何正确运用PHP ini_set函数
    PHP中的串行化变量和序列化对象
  • 原文地址:https://www.cnblogs.com/zhishaofei/p/4091640.html
Copyright © 2011-2022 走看看