‘壹’ html5 canvas在img标签的图片上绘制矩形框、矩形框为1px时线条模糊问题
前端需要在后端返回的图片集合里,根据提供的对角线坐标绘制矩形。矩形可能是多个。效果达到如下:
1、根据后端返回的图片list,生成canvas画布,
2、把图片画到canvas里面,再根据后端返回的坐标,在canvas里画矩形框。
此项目中,后端返回的坐标是基于缩略图的,但是前端渲染在页面上的图片,会按宽为788px来显示,所以坐标应该要按照比例来算。
真实的左上x点的计算方式为:真实宽 / 压缩宽 * 压缩x点
https://blog.csdn.net/qq_29594393/article/details/52849339
https://www.runoob.com/w3cnote/html5-canvas-intro.html
https://www.imooc.com/wenda/detail/551496
https://blog.csdn.net/qq_44907926/article/details/114907056?spm=1001.2014.3001.5501
①画矩形时,如果里面的参数有不是整数的话,容易导致边框粗细不一等问题。
②当矩形的边框lineWidth设置为1px时候,会出现线条模糊的问题。
关于第②个问题的延申:
这是测试提给我的bug:
我的思路存在的问题:
首先,同样是矩形的边框我同样设置的都是1px,不应该有的线条颜色深,有的颜色淡啊,排除了参数没有取整的问题后,我怀疑了颜色red在画布上的渲染问题,换成十六进制的同样有问题。就在我一筹莫展的时候,我叫来了小伙伴,我说你看这线条颜色是不是不一样,我开始怀疑我的眼神有问题。小伙伴说,你给线条整粗点看看这问题明显吗。我把边框线条设置了2px,发现和1px的粗细是一样的,并且颜色一样了线条不模糊了。换成别的宽度,只要不是1px都没有问题了。
思维的问题在于,我网络问题的描述有问题,我之前一直搜canvas绘制矩形线条深浅不一,我应该搜canvas矩形线条模糊。我排查问题的时候,固定思维模式觉得1px写的没错,却没有尝试排查。
关于这个问题的详细解答与解决办法:
canvas1px线条模糊
我的理解
canvas的线条画法不一样,canvas的每条线都有一条无限细的“中线”,线条的宽度是从中线向两侧延伸的,也就是说canvas绘制1px的时候,是中线向左右两边延申各取0.5,并不是向某一边延申(如果只是往右延申就不再是问题了),此时问题出现了,计算机不允许出现小于1px的图形,所以他做了一个折中的事:把这两个像素都绘制了。所以,如此一来,本来1px的线条,就成了看起来2px宽的线条。
延申:
HTML 5 Canvas详细讲解 ———— 第二篇(清除canvas画布上指定区域+橡皮擦功能实现;在画布上平铺指定图片;在画布上绘制文本;总结案例之刮刮乐功能实现)
‘贰’ 如何解决移动端Retina屏1px像素的问题
首先我们先聊下Retina屏的概念。
Retina: 一种新型高分前中辨率的显示标准胡举,又称视网膜显示屏。
在移动端开发中,UI设计稿中设置边框为1px,前端在开发中如果出现border:1px,测试会发裤悔碧现在Retina屏机型中,1px会比较粗,即是经典的移动端1px像素问题。
比如iphone6的屏幕宽度为375px,设计师的视觉稿一般是750px,如果UI的border 1px,而前端实际开发的时候是不能采用1px border的,应该是1px/2。
参考高级前端进阶
‘叁’ 前端自适应布局怎么解决1px的问题
不知道你问的是解决什么1px的问题,如果是解决1px的高度问题, 那就加scaleY。
‘肆’ CSS - 移动端 1像素解决办法
前言:在移动端web开发中,UI设计稿逗败中设置边框为1像素,前端在开发过程中如果出现border:1px,测试会发败睁现在某些机型上,1px会比较粗,即是较经典的 移动端1px像素问题。
要处理这个问题,必须先补充一个知识点,就是设备的 物理像素[设备像素] & 逻辑像素[CSS像素];
1.物理像素:
移动设备出厂时,不同设备自带的不同像素,也称硬件像素;
2.逻辑像素:
即css中记录的像素。
在开发中,为什么移动端CSS里面写了1px,实际上看起来比1px粗;了解设备物理像素和逻辑像素的同学应该很容易理解,其察指岁实这两个px的含义其实是不一样的,UI设计师要求的1px是指设备的物理像素1px,而CSS里记录的像素是逻辑像素,它们之间存在一个比例关系,通常可以用 javascript 中的 window.devicePixelRatio 来获取,也可以用媒体查询的 -webkit-min-device-pixel-ratio 来获取。当然,比例多少与设备相关。
在手机上border无法达到我们想要的效果。这是因为 devicePixelRatio 特性导致,iPhone的 devicePixelRatio==2,而 border-width: 1px; 描述的是设备独立像素,所以,border被放大到物理像素2px显示,在iPhone上就显得较粗。
● 用::after和::befor,设置border-bottom:1px solid #000,然后在缩放-webkit-transform: scaleY(0.5);可以实现两根边线的需求
● 用::after设置border:1px solid #000; width:200%; height:200%,然后再缩放scaleY(0.5); 优点可以实现圆角,京东就是这么实现的,缺点是按钮添加active比较麻烦。
‘伍’ 手机前端,我写的是border:1px;但是在手机上显示不止1像素。
在<head></head>之间设置下<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
兼容性问题,某个元素默认就有1px的border,或者有1px的outline,将各元素的base属性border与outline设为0;
<style>
img{border:0px solid #ddd;outline:none;}
</style>
img{}