1 解决方案 浏览器的对象 window 只有一个 属性是devicePixeRatio 的属性 。该属性表示了屏幕的设备像素比,即用几个像素宽度渲染一个像素的问题 举例子来讲。 假设devicePixelRatio 的值为2 一张100/100 大小的图片 在Retina设备上 会用2个像素的空间。至关于图片放大了一倍,图片就会模糊 相似的,在 canvas context 中也存在一个 backingStorePixelRatio 的属性,该属性的值决定了浏览器在渲染canvas以前会用几个像素来来存储画布信息。 backingStorePixelRatio 属性在各浏览器厂商的获取方式不同,因此须要加上浏览器前缀来实现兼容。 2 解决问题 【直接上代码】web
<style> canvas { border: 1px solid red; width: 100%; } </style> <body> <canvas id="canvas" height="180"></canvas> </body> 1> 模糊的状况 // 原始作法 var canvas = document.getElementById("canvas"); var ctx = canvas.getContext('2d'); ctx.font = '18px Geprgia'; ctx.fillStyle = '#999'; ctx.fillText('我是模糊的文字',50,50); 2> 清晰的状况 // 获取像素比 var getPixelRatio = function (context) { var backingStore = context.backingStorePixelRatio || context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || context.backingStorePixelRatio || 1; return (window.devicePixelRatio || 1) / backingStore; }; //画文字 var myCanvas = document.getElementById("my_canvas"); var context = myCanvas.getContext("2d"); var ratio = getPixelRatio(context); myCanvas.style.width = myCanvas.width + 'px'; myCanvas.style.height = myCanvas.height + 'px'; myCanvas.width = myCanvas.width * ratio; myCanvas.height = myCanvas.height * ratio; // 放大倍数 context.scale(ratio, ratio); context.font = "18px Georgia"; context.fillStyle = "#999"; context.fillText("我是清晰的文字", 50, 50);