浅析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 相关文章推荐
a标签的css样式四个状态
Mar 09 HTML / CSS
值得收藏的HTML5资源(学习html5的朋友可以收藏下)
Jul 20 HTML / CSS
关于 HTML5 的七个传说小结
Apr 12 HTML / CSS
程序设计HTML5 Canvas API
Apr 08 HTML / CSS
HTML中使用SVG与SVG预定义形状元素介绍
Jun 28 HTML / CSS
HTML5 placeholder(空白提示)属性介绍
Aug 07 HTML / CSS
一些常用的HTML5模式(pattern) 总结
Jul 14 HTML / CSS
使用phonegap操作数据库的实现方法
Mar 31 HTML / CSS
HTML5 拖放(Drag 和 Drop)详解与实例代码
Sep 14 HTML / CSS
canvas仿写贝塞尔曲线的示例代码
Dec 29 HTML / CSS
Html5之自定义属性(data-,dataset)
Nov 19 HTML / CSS
CSS实现切角+边框+投影+内容背景色渐变效果
Nov 01 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
编写漂亮的代码 - 将后台程序与前端程序分开
2008/04/23 PHP
PHP-MySQL教程归纳总结
2008/06/07 PHP
ThinkPHP实现跨模块调用操作方法概述
2014/06/20 PHP
php使用PDO方法详解
2014/12/27 PHP
PHP中SESSION的注销与清除
2015/04/16 PHP
PHP创建多级目录的两种方法
2016/10/28 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
2016/12/19 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
javascript import css实例代码
2008/07/18 Javascript
对象特征检测法判断浏览器对javascript对象的支持
2009/07/25 Javascript
offsetParent 算法分析
2010/04/05 Javascript
Web前端设计模式  制作漂亮的弹出层
2010/10/29 Javascript
倒记时60刷新网页的js代码
2014/02/18 Javascript
Javascript中的异步编程规范Promises/A详细介绍
2014/06/06 Javascript
javascript特殊日历控件分享
2016/03/07 Javascript
深入理解jQuery中的事件冒泡
2016/05/24 Javascript
微信小程序 Tab页切换更新数据
2017/01/05 Javascript
详解vue嵌套路由-params传递参数
2017/05/23 Javascript
vue2.0自定义指令示例代码详解
2019/04/25 Javascript
微信小程序按钮点击跳转页面详解
2019/05/06 Javascript
Vue.js自定义指令学习使用详解
2019/10/19 Javascript
JavaScript实现移动端带transition动画的轮播效果
2020/03/24 Javascript
Vue + Scss 动态切换主题颜色实现换肤的示例代码
2020/04/27 Javascript
JavaScript cookie原理及使用实例
2020/05/08 Javascript
Python实现的多线程端口扫描工具分享
2015/01/21 Python
python创建列表和向列表添加元素的实现方法
2017/12/25 Python
python2与python3爬虫中get与post对比解析
2019/09/18 Python
Html5页面在微信端的分享的实现方法
2018/08/30 HTML / CSS
法国房车租赁网站:Yescapa
2019/08/26 全球购物
WebSphere 应用服务器都支持哪些认证
2013/12/26 面试题
如何提高SQL Server的安全性
2016/07/25 面试题
二手房购房意向书范本
2014/04/01 职场文书
领导工作表现评语
2015/01/04 职场文书
2015年物资管理工作总结
2015/05/20 职场文书
2019年第四季度财务部门工作计划
2019/11/02 职场文书