关于canvas画布使用fillRect()时高度出现双倍效果解决办法
1.canvas 标签
<canvas>
<span>不支持canvas标签</span>
</canvas>
2.绘制环境: getContext('2d') //目前支持2d的场景
3.绘画方块:(1) fillRect(L,T,W,H) //默认颜色是黑色
(2) strokeRect(L,T,W,H) //带边框的方块(默认一像素黑色边框,但是由于边框开始位置为一个像素点的1/2+相邻像素点的1/2,所以会显示2像素,解决办法:top值和left值增加0.5个像素)
注:(1)和(2)顺序不同那么绘制的方块也不同
(3) 当使用 fillRect(L,T,W,H) 设置canvas的宽度和高度时,只有内嵌css有效,外部css会出现拉伸的情况,例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script>
window.onload=function(){
var canvas=document.getElementById('canvas').getContext('2d');
canvas.fillRect(50,50,50,50);
}
</script>
<style>
body{
background: #000;
}
#canvas{
width: 300px;
height: 400px;
background:#fff;
}
</style>
</head>
<body>
<canvas id="canvas">
<span>不支持canvas标签</span>
</canvas>
</body>
</html>
显示情况如下:

该效果与我们预想的不同,这是因为标签中的宽高是画布中的真正宽度和高度,样式中的宽高等比例缩放,此时有两种修改方案:
①在代码js中添加设置宽高属性的代码设置宽度和高度:
canvas.setAttribute("height",canvas.clientHeight);
canvas.setAttribute("width",canvas.clientWidth);
②除去外部css中设置宽高属性的代码,给canvas标签直接添加宽度和高度属性:
<canvas id="canvas" width="300" height="400" style="background:#fff;">
<span>不支持canvas标签</span>
</canvas>
或
<script>
canvas.width = 300;
canvas.height = 500;
</scritp>
最后显示效果如下:

4.设置绘图,边界绘制:
window.onload=function(){
var canvas=document.getElementById('canvas').getContext('2d');
canvas.fillStyle='red'; //填充颜色(绘制canvas是有顺序的)
canvas.lineWidth=10; //线高度(数值)
canvas.strokeStyle='blue';//边线颜色
canvas.lineJoin='round'; //边界连接点样式,属性值:miter(默认),round(圆角),bevel(斜角)
// lineCap //端点样式,一条线的两个端点,属性值:butt(默认),round(圆角),square(高度多出为宽一半的值)
canvas.fillRect(50,50,100,100);
canvas.strokeRect(50.5,50.5,100,100);
}
6.绘图路径:
window.onload=function(){
var canvas=document.getElementById('canvas').getContext('2d');
canvas.fillStyle='red';
canvas.beginPath(); //开始绘制路径
canvas.moveTo(100,200); //移动到绘制路径的新目标点
canvas.lineTo(100,300); //新的目标点
canvas.lineTo(200,300); //新的目标点
canvas.closePath(); //结束绘制路径,闭合(起点和终点连接)
canvas.stroke(); //画线
canvas.beginPath();
canvas.rect(10,10,100,100);//矩形区域
canvas.closePath();
ccanvas.fill();
canvas.clearRect(10,10,100,100);//清除画布中的矩形区域
canvas.save();//保存路径
//相当于函数,写在这中间的代码相当于局部变量,不会影响外部属性值
canvas.restore();//恢复路径
}
7.[ 案例 ] 鼠标画线
window.onload=function(){
var canvas=document.getElementById('canvas')
var ctx=canvas.getContext('2d');
canvas.onmousedown=function(ev){
var ev= ev || window.event;
ctx.moveTo(ev.clientX-canvas.offsetLeft,ev.clientY-canvas.offsetTop);
document.onmousemove=function(ev){
var ev= ev || window.event;
ctx.lineTo(ev.clientX-canvas.offsetLeft,ev.clientY-canvas.offsetTop);
ctx.stroke();
}
document.onmouseup=function(){
document.onmousemove=null;
document.onmouseup=null;
}
}
}
关于canvas画布使用fillRect()时高度出现双倍效果解决办法的更多相关文章
- ScrollView嵌套ListView只显示一行之计算的高度不正确的解决办法(转)
ScrollView嵌套ListView只显示一行之计算的高度不正确的解决办法 分类: android应用开发2013-12-19 09:40 1045人阅读 评论(3) 收藏 举报 AndroidS ...
- 爬虫爬数据时,post数据乱码解决办法
最近在写一个爬虫,目标网站是:http://zx.bjmemc.com.cn/,可能是为了防止被爬取数据,它给自身数据加了密.用谷歌自带的抓包工具也不能捕获到数据.于是下了Fiddler. F ...
- Bootstrap中关闭第二个模态框时出现的问题和解决办法
Bootstrap中关闭第二个模态框时出现的问题和解决办法 1.关闭第二个模态框时,第一个模态框跟着消失. 解决办法: 第二个模态框的代码不要写在第一个模态框里面,确保两个模态框相对独立; 2.关闭第 ...
- oracle执行update语句时卡住问题分析及解决办法
转载:http://www.jb51.net/article/125754.htm 这篇文章主要介绍了oracle执行update语句时卡住问题分析及解决办法,涉及记录锁等相关知识,具有一定参考价值, ...
- 返回xml过长时被nginx截断的解决办法
返回xml过长时被nginx截断的解决办法 问题描述:通过网页获取数据,数据格式为xml.当xml比较短时,可以正常获取数据.但是xml长度过长时不能正常获取数据,通过观察返回数据的源代码,发现xml ...
- IDEA使用maven构建时控制台中文乱码的解决办法
使用maven clean install 项目时控制台中文乱码,解决办法如下: Setting->maven->runner VMoptions: -Dfile.encoding=UTF ...
- mongodb 更新数据时int32变为double的解决办法 & 教程
https://www.runoob.com/mongodb/mongodb-mongodump-mongorestore.html mongodb 更新数据时int32变为double的解决办法 ...
- java下载文件时文件名出现乱码的解决办法
转: java下载文件时文件名出现乱码的解决办法 2018年01月12日 15:43:32 橙子橙 阅读数:6249 java下载文件时文件名出现乱码的解决办法: String userAgent ...
- 当display=none时,元素和子元素高度为0的解决办法
在前端中为了某种需要,我们需要获取display=none的元素或者子元素的实际高度来进行某些处理,然而html对display=none的元素和子元素是不进行渲染的,如果我们没有规定这些元素的高度那 ...
随机推荐
- Oracle exp/imp数据导入导出工具基本用法
一.获取帮助 exp/imp help=y 二.数据导出 1.将数据库完全导出,设置full选项exp system/manager@orcl file=d:\db.dmp full=y 2.导出数据 ...
- PHP完成一个日历
今天我们就用php中的数组合date 做一个日历. 先让我们回顾一下PHP里面的date . 1.时间戳:表示从计算机元年/UNIX纪年(0时区 1970/1/1 00:00:00)到当前事件的秒数. ...
- vmware克隆虚拟机后网卡名称及网络地址xiuf
使用vmware克隆虚拟机后,若原主机网卡名称为eth0,那么克隆后的主机使用ifconfig查看仅能看到一个名称为eth1的网卡 并且在/etc/sysconfig/network-scripts/ ...
- CoolBlog开发笔记第3课:创建Django应用
教程目录 1.1 CoolBlog开发笔记第1课:项目分析 1.2 CoolBlog开发笔记第2课:搭建开发环境 前言 经过上一节我们已经创建了CoolBlog工程,但是关于CoolBlog的功能代码 ...
- Matlab: 作图
控制图的大小 figure('position',[x0,y0,dx,dy]); figure(fig number); 显示图例 legend('leg1','leg2') depend on ho ...
- JAVA优雅停机的实现
最近在项目中需要写一个数据转换引擎服务,每过5分钟同步一次数据.具体实现是启动engine server后会初始化一个ScheduledExecutorService和一个ThreadPoolExec ...
- 利用MUI滑动进行利息计算(移动端APP显示)
在开发移动端的应用时,会用到很多的手势操作,比如滑动.长按等,为了方便开放者快速集成这些手势,mui内置了常用的手势事件,其中滑动应用是比较常见的应用操作,本篇文章将讲述如何利用滑动改变对应值进行计算 ...
- 全选与单选chekbox的自定义实现(angular框架)
2017年7月4日,我原本可以像其他同时一样早点回家,玩几把王者荣耀,但是我没有,因为我选择留下来,写一篇博客. 项目中经常性的会遇到什么点击"全选"按钮,勾中所有"单选 ...
- ecshop中smarty比较操作符(eq,ne,neq)含义
eq相等, ne.neq不相等, gt大于, lt小于, gte.ge大于等于, lte.le 小于等于, not非, mod求模. is [not] div by是否能被某数整除, is [not ...
- 【Python3之多进程】
一.进程和线程的简单解释 进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握. 用生活举例: (转自阮一峰网络日志) 1.计算机的核心是CPU,它承担了所有 ...