惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
雷峰网
雷峰网
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
B
Blog
Y
Y Combinator Blog
WordPress大学
WordPress大学
Microsoft Azure Blog
Microsoft Azure Blog
小众软件
小众软件
G
Google Developers Blog
云风的 BLOG
云风的 BLOG
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
博客园 - 叶小钗
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
量子位
The Cloudflare Blog
T
The Blog of Author Tim Ferriss
博客园_首页
B
Blog RSS Feed
Hugging Face - Blog
Hugging Face - Blog
IT之家
IT之家
阮一峰的网络日志
阮一峰的网络日志
L
LangChain Blog
宝玉的分享
宝玉的分享

张鑫旭-鑫空间-鑫生活

1分钟速度了解text-align match-parent声明 « 张鑫旭-鑫空间-鑫生活 光标的形状也能设置了,就是CSS caret-shape属性 « 张鑫旭-鑫空间-鑫生活 pretext与文字四面环绕效果的实现 « 张鑫旭-鑫空间-鑫生活 JSON.rawJSON方法的作用是什么? « 张鑫旭-鑫空间-鑫生活 如何使用CSS判断鼠标从哪个方向进入元素? « 张鑫旭-鑫空间-鑫生活 借助mediabunny纯JS实现视频水印、剪裁、合成等功能 « 张鑫旭-鑫空间-鑫生活 务必谨慎使用JS WeakRef弱引用 « 张鑫旭-鑫空间-鑫生活 CSS六边形头像的实现与蜂巢布局 « 张鑫旭-鑫空间-鑫生活 CSS corner-shape与背景底纹技术 « 张鑫旭-鑫空间-鑫生活 浅学WebTransport API:下一代Web双向通信技术 « 张鑫旭-鑫空间-鑫生活 HTML dialog元素新支持了closedBy属性 « 张鑫旭-鑫空间-鑫生活 HTML interestfor属性与悬停popover交互效果 « 张鑫旭-鑫空间-鑫生活 CSS3模拟window7炫酷界面效果展示 « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 纯js无图片无外链CSS图片幻灯片播放插件 « 张鑫旭-鑫空间-鑫生活 CSS border三角、圆角图形生成技术简介 « 张鑫旭-鑫空间-鑫生活 CSS “渐进增强”在web制作中常见应用举例 « 张鑫旭-鑫空间-鑫生活 让IE6/IE7/IE8浏览器支持CSS3属性 « 张鑫旭-鑫空间-鑫生活 jQuery – 高亮动态显示页面HTML代码插件 « 张鑫旭-鑫空间-鑫生活 翻译 – 逐渐消失的Flash网站 « 张鑫旭-鑫空间-鑫生活 CSS reset的重新审视 – 避免样式重置 « 张鑫旭-鑫空间-鑫生活 新浪微博插入话题后部分文字选中的js实现 « 张鑫旭-鑫空间-鑫生活 JavaScript实现http地址自动检测并添加URL链接 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变背景(gradient)效果 « 张鑫旭-鑫空间-鑫生活 CSS content内容生成技术以及应用 « 张鑫旭-鑫空间-鑫生活 CSS gradient渐变之webkit核心浏览器下的使用 « 张鑫旭-鑫空间-鑫生活 CSS渐变之CSS3 gradient在Firefox3.6下的使用 « 张鑫旭-鑫空间-鑫生活 区分IE8/IE7/IE6及其他浏览器-CSS “\9″hack « 张鑫旭-鑫空间-鑫生活 CSS实现跨浏览器兼容性的盒阴影效果 « 张鑫旭-鑫空间-鑫生活 CSS3&HTML5各浏览器支持情况一览表 « 张鑫旭-鑫空间-鑫生活
canvas HTML属性尺寸和CSS尺寸多个细节深入 « 张鑫旭-鑫空间...
张鑫旭,zhangxinxu · 2018-07-08 · via 张鑫旭-鑫空间-鑫生活

by zhangxinxu from http://www.zhangxinxu.com/wordpress/?p=7769
本文可全文转载,但需得到原作者书面许可,同时保留原作者和出处,摘要引流则随意。

一、canvas width/height HTML属性值合法性

我们可以使用widthheight这两个HTML属性控制<canvas>元素的尺寸。

从定义上讲,<canvas>元素的widthheight标准属性值只能是整数,但是实际上,你设置小数,浏览器不会认为是不合法的。例如:

<canvas height="88.888" style="background:green;"></canvas>

实时效果如下:

经测试,各个主流浏览器下都会渲染为88像素高度。

或者你自带px单位,也是有效的,例如:

<canvas height="88px" style="background:green;"></canvas>

实时效果如下:

经测试,各个主流浏览器下都会渲染为88像素高度。

但是,如果是其他单位,例如em,则会被忽略,或者说单位会自动忽略(包括px):

<canvas height="88em" style="background:green;"></canvas>

实时效果如下:

经测试,各个主流浏览器下都会渲染为88像素高度。


但是,如果设置的是负数,或者直接不设置,对于高度,则会以150像素高度呈现;对于宽度,则会以300像素宽度呈现。

例如下面的height负值以及直接不设置width/height属性:

<canvas height="-150" style="background:green;"></canvas>
<canvas style="background:green;"></canvas>

实时效果如下:

然而,在IE浏览器下,负数尺寸值会被当做0解析,因此,看不到尺寸。这个和Chrome和Firefox浏览器是不一样的。

为什么默认尺寸是300*150?

为什么<canvas>元素默认尺寸是300*150,而不是其他尺寸组合呢?这个是CSS规范中定义的,作为替换元素,默认的尺寸是300*150<canvas>元素就是替换元素,因此默认尺寸是300*150。由于<svg>元素也是替换元素,因此,<svg>默认的尺寸也是300*150。

canvas没有尺寸设置,我们可以通过HTML属性获取吗?

例如,下面HTML,没有widthheight设置,请问canvas.height的返回值是多少?

<canvas style="background:green;"></canvas>
console.log(document.querySelector('canvas').height);

结果返回值就是默认的150,而不是undefined

高度缺省时候依然能够获取

二、HTML属性尺寸和CSS尺寸关系

从视觉表现上而言,CSS的widthheight属性权重要大于<canvas>元素的widthheight属性权重,例如下面HTML代码,最终<canvas>元素高度是88像素。

<canvas height="150" style="background:green; height:88px;"></canvas>

实时效果如下:

<canvas>元素本质上就是一个图片,其很多样式表现和<img>元素是一致的,例如这里,CSS控制图片尺寸时候,如果高度或宽度缺省,<canvas>元素依然保持原始的高宽比例。具体描述为:<canvas>元素这里原始尺寸是300*150,CSS设置为88px,最终的宽度表现不是300而是等比例缩放的176px

但是,深究下来,和<img>还是有一点区别,就是<canvas>的等比例特性是强制的,会忽略HTML属性的设置,但<img>不会这样。对比下面的测试HTML:

<img src="./1.jpg" width="300" height="150" style="height:88px;">
<canvas width="300" height="150" style="background:green; height:88px;"></canvas>

可以看到<img>宽度依然是300px,并没有保持原始比例,这就是和<img>的区别。

Canvas绘制与CSS尺寸无关

当我们使用各个Canvas API进行图形图像绘制的时候,其坐标位置,尺寸大小等都是相对于<canvas>元素的HTML属性height,与CSS height没有任何关系。例如:

<canvas height="150" style="background:green; height:88px;"></canvas>

我们想以<canvas>元素中心点为圆心画一个圆,则垂直坐标应该是75,是HTML height属性值的一半,而非最终视觉展示高度的一半。

var canvas = document.querySelector('canvas');
var context = canvas.getContext('2d');
context.fillStyle = 'orange';
context.arc(150, 75, 75, 0, 2 * Math.PI);
context.fill();

实时效果如下:

<canvas>元素本质上是个位图,因此,在retina高密度屏幕下,如果如果绘制图像,则如果按照视觉尺寸来绘制,可能就会模糊,我们可以将<canvas>元素的尺寸用HTML高宽属性设置为2倍尺寸,然后使用CSS高宽属性设置视觉尺寸为布局需要的尺寸大小。

三、结束语

就放个笑脸吧~

本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址:http://www.zhangxinxu.com/wordpress/?p=7769

(本篇完)