浅析canvas元素的html尺寸和css尺寸对元素视觉的影响


Posted in HTML / CSS onJuly 22, 2019

遇到的问题:canvas元素变形失真的原因

一个DOM元素存在三种尺寸:style尺寸,html尺寸,css尺寸。

使用canvas元素时,canvas元素默认宽高是300px * 150px。这里的默认尺寸是html尺寸。

为了更好地帮助理解,以作画为例。画板是css尺寸或者style尺寸,画布是html尺寸。

如果我们没有显示指定canvas元素的html尺寸,而在css文件中指定了它的css尺寸。结果是十分令人困惑。

例如我们在一个默认300px * 150px的画布上画了一个圆半径为50px的圆。

<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>canvas尺寸</title>
    <style>
        #canvas {
            width: 200px;
            height: 200px;
        }
    </style>
</head>
<body>
<div>
    <canvas id="canvas"></canvas>
</div>
<script>
    window.onload = function () {
        const canvas = document.getElementById("canvas");
        const ctx = canvas.getContext("2d");
        ctx.beginPath();
        ctx.strokeStyle = "#aaaaaa";
        ctx.arc(100, 100, 50, 0, 2 * Math.PI);
        ctx.stroke();
        ctx.closePath();
    };
</script>
</body>
</html>

最后显示的结果如下:

浅析canvas元素的html尺寸和css尺寸对元素视觉的影响

可以看出画布的尺寸确实是200 * 200。但是圆已经变成了椭圆,图形发生了形变。这是为什么呢?

如果移除css设定的尺寸又会怎么样呢?

浅析canvas元素的html尺寸和css尺寸对元素视觉的影响

可以看出此时图形是正常的。画布的尺寸确实是默认的300 * 150。

从对比以及想象中我们可以得出结论:

起初我们是在300 150的画布上绘制一个圆。绘制完成之后,我们又希望将画布的尺寸变成200 200,同时画布还是那块画布,不作更换。

可行的方法是将画布经行拉伸。假设画布存在弹性,那么一块画布从300 150拉伸成200 200。画布上的圆的长半轴变成原来的1.33倍,短半轴变成0.68倍。此时圆自然就是椭圆了。

结论:

在使用canvas画图的时候,为了避免不必要的麻烦,一定记得为canvas元素设定html尺寸的宽高。

总结

以上所述是小编给大家介绍的浅析canvas元素的html尺寸和css尺寸对元素视觉的影响,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

HTML / CSS 相关文章推荐
CSS3中的元素过渡属性transition示例详解
Nov 30 HTML / CSS
实现CSS3中的border-radius(边框圆角)示例代码
Jul 19 HTML / CSS
CSS3绘制超炫的上下起伏波动进度加载动画
Apr 21 HTML / CSS
css3的动画特效之动画序列(animation)
Dec 22 HTML / CSS
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
May 28 HTML / CSS
Html5 localStorage入门教程
Apr 26 HTML / CSS
html5中地理位置定位api接口开发应用小结
Jan 04 HTML / CSS
使用phonegap克隆和删除联系人的实现方法
Mar 31 HTML / CSS
canvas压缩图片以及卡片制作的方法示例
Dec 04 HTML / CSS
h5使用canvas画布实现手势解锁
Jan 04 HTML / CSS
css中z-index: 0和z-index: auto的区别
Aug 23 HTML / CSS
企业开发CSS命名BEM代码规范实践
Feb 12 HTML / CSS
详解通过focusout事件解决IOS键盘收起时界面不归位的问题
Jul 18 #HTML / CSS
详解window.open被浏览器拦截的解决方案
Jul 18 #HTML / CSS
data:image data url 文件转为Blob上传后端的方法
Jul 16 #HTML / CSS
基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能
Jul 09 #HTML / CSS
Html5移动端适配IphoneX等机型的方法
Jun 25 #HTML / CSS
微信小程序之html5 canvas绘图并保存到系统相册
Jun 20 #HTML / CSS
使用canvas一步步实现图片打码功能的方法
Jun 17 #HTML / CSS
You might like
PHP与Java进行通信的实现方法
2013/10/21 PHP
php、java、android、ios通用的3des方法(推荐)
2016/09/09 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
2012/10/12 Javascript
jquery插件jquery倒计时插件分享
2013/12/27 Javascript
ie8本地图片上传预览示例代码
2014/01/12 Javascript
js限制input标签中只能输入中文
2015/06/26 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
2016/01/19 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
JS清除字符串中重复值的实现方法
2016/08/03 Javascript
微信小程序实现topBar底部选择栏效果
2018/07/20 Javascript
vue填坑之webpack run build 静态资源找不到的解决方法
2018/09/03 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
2019/01/06 Javascript
JS判断数组里是否有重复元素的方法小结
2019/05/21 Javascript
解决layer图标icon不加载的问题
2019/09/04 Javascript
vue 根据选择条件显示指定参数的例子
2019/11/09 Javascript
javascript事件循环event loop的简单模型解释与应用分析
2020/03/14 Javascript
Vue-cli3多页面配置详解
2020/03/22 Javascript
json_decode 索引为数字时自动排序问题解决方法
2020/03/28 Javascript
JavaScript enum枚举类型定义及使用方法
2020/05/15 Javascript
python 矩阵增加一行或一列的实例
2018/04/04 Python
python 删除指定时间间隔之前的文件实例
2018/04/24 Python
Python面向对象类的继承实例详解
2018/06/27 Python
如何通过python的fabric包完成代码上传部署
2019/07/29 Python
Django CSRF跨站请求伪造防护过程解析
2019/07/31 Python
python 创建一维的0向量实例
2019/12/02 Python
python json.dumps中文乱码问题解决
2020/04/01 Python
基于Python爬取51cto博客页面信息过程解析
2020/08/25 Python
HTML5 Canvas draw方法制作动画效果示例
2013/07/11 HTML / CSS
联想智利官方网站:Lenovo Chile
2020/06/03 全球购物
关工委先进个人事迹材料
2014/05/23 职场文书
计算机专业自荐信范文
2014/05/28 职场文书
护士2014年终工作总结
2014/11/11 职场文书
2015年安全教育月活动总结
2015/03/26 职场文书
webpack的移动端适配方案小结
2021/07/25 Javascript
Python 多线程处理任务实例
2021/11/07 Python