ํ์ฌ ํ์ ์ฅ์น์ ๋ฌผ๋ฆฌ์ ํฝ์
๊ณผ CSS ํฝ์
์ ๋น์จ(๋ฌผ๋ฆฌ์ ํฝ์
/ CSS ํฝ์
)์ด๋ค.
์ฆ, ํ๋์ CSS ํฝ์
์ ๋ช ๊ฐ์ ๋ฌผ๋ฆฌ์ ํฝ์
์ด ํ์ํ์ง๋ฅผ ๋ํ๋ธ๋ค.
๋ฌผ๋ฆฌ์ ํฝ์
(physical Pixel)๊ณผ CSS ํฝ์
(ํน์ logical pixel) ๋ ๊ฐ์ง ํฝ์
์ด ๋ฑ์ฅํ๋ค.
๋ฌผ๋ฆฌ์ ํฝ์
์ ๋จ๋ง๊ธฐ๊ฐ ์ค์ ๋ก ํํํ ์ ์๋ ํ์(=ํฝ์
)์ด๋ค.
๋
ผ๋ฆฌ์ ํฝ์
์ CSS์์ ํํํ ์ ์๋ ํ์์ด๋ค.
์ด๋ฏธ์ง ์ถ์ฒ: https://abcdqbbq.tistory.com/47
์์ดํฐ 4์ ๊ฒฝ์ฐ window.devicePixelRatio
๋ 2
๊ฐ ๋๋ค.
์ด๋ฏธ์ง ์ถ์ฒ : https://tomroth.com.au/dpr/
๋์ ํด์๋์ ๊ธฐ๊ธฐ์ผ์๋ก, ๋์ DPR์ ๊ฐ์ง๊ณ ์๋ค.
์ฆ, ํ๋์ CSS ํฝ์
์์ ๋ง์ ๋ฌผ๋ฆฌ์ ํฝ์
์ด ๋ค์ด๊ฐ ์์ด์ ๋ ๊น๋ํ๊ณ ์ ๋ช
ํ ์ด๋ฏธ์ง๋ฅผ ํํํ ์ ์๋ค.
HTML์ canvas
๋ฅผ ์ด์ฉํ ๋ ํ
์คํธ๊ฐ ํ๋ฆฟํ๊ฒ(blurry) ๋ณด์ด๋ ํ์์ ์ข
์ข
๋ชฉ๊ฒฉํ ์ ์๋ค.
๋งฅ๋ถ๊ณผ ๊ฐ์ Retina ๋์คํ๋ ์ด๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฆด ๋ ๋ ๋ง์ ํฝ์
์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํ์ค ๋์คํ๋ ์ด์ Retina ๋์คํ๋ ์ด์์ ๋ ๋๋ง ์ฐจ์ด๊ฐ ์๊ธด๋ค.
์ด๋ฅผ ํด๊ฒฐํ ๋ DPR์ด ์ ์ฉํ๋ค.
๋จผ์ canvas
๋ฅผ ๋ง๋ค์ด๋ณด์.
<canvas width="40" height="30" />
40x30 ํฝ์
์ ์บ๋ฒ์ค๊ฐ ์์ฑ๋์๋ค.
ํ์ง๋ง ํ๋ฉด์ ๋ณด์ฌ์ง ์บ๋ฒ์ค์ ๊ฐ๋ก, ์ธ๋ก ๊ธธ์ด๋ CSS๋ก๋ ์กฐ์ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ 40x30 ํฝ์
๋ก ํ๋ฉด์ ๊ทธ๋ ค์ง์ง ์์ ์๋ ์๋ค.
๊ทธ๋ฆฌ๊ณ canvas
์ ์์ฑ์ผ๋ก ์ง์ ํ ๊ฐ๋ก, ์ธ๋ก ๊ธธ์ด๋ CSS ํฝ์
ํน์ ๋ฌผ๋ฆฌ์ ํฝ์
๊ณผ ๋
๋ฆฝ์ ์ผ๋ก ๋์ํ๋ค.
์ฆ, canvas
์์ ํ๋์ ํฝ์
(์ดํ ์บ๋ฒ์ค ํฝ์
)์ด ์ฌ๋ฌ ๊ฐ์ ๋ฌผ๋ฆฌ์ ํฝ์
์ ๋ฎ์ ์ ์์ผ๋ฉฐ ๋ฌผ๋ฆฌ์ ์ธ ํฝ์
์ ์ผ๋ถ๋ง ๋ฎ์ ์ ์๋ค.
์ด๋ ์๊ฐ์ ์ผ๋ก ๋ถ๋๋ฝ์ง ์์ ๊ฒฐ๊ณผ๋ฌผ์ด ๋ณด์ฌ์ง ์ ์๋ค.
DPR์ ์ด์ฉํ๋ฉด ์๊ฐ์ ์ผ๋ก ์ ๋ช ํ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋ค ์ ์๋ค.
<!-- html -->
<canvas id="canvas" />
// javascript
const canvas = document.getElementById('canvas');
const context = canvas.getContext('2d');
const WIDTH = 40;
const HEIGHT = 30;
// css ํฝ์
์ ๋ง์ถ๊ธฐ
canvas.style.width = `${WIDTH}px`;
canvas.style.height = `${HEIGHT}px`;
// ๋ฌผ๋ฆฌ์ ํฝ์
์ ๋ง์ถ๊ธฐ
const dpr = window.devicePixelRatio;
canvas.width = WIDTH * scale;
canvas.height = HEIGHT * scale;
// ์บ๋ฒ์ค์ ์ขํ๊ณ๋ฅผ DPR์ ๋ง์ถฐ ํ๋/์ถ์ํ๊ธฐ
context.scale(dpr, dpr);
canvas
์ width
, height
์์ฑ์ DPR์ ๊ณฑํด์ค์ ์บ๋ฒ์ค ํฝ์
์ด ๋ฌผ๋ฆฌ์ ํฝ์
๊ณผ ๋์ผํ๊ฒ ๋์ํ๋๋ก ํ์๋ค.
์บ๋ฒ์ค ํฝ์
์ด dpr์ ๋ง์ถฐ ํ๋/์ถ์๋์๊ธฐ ๋๋ฌธ์ scale
๋ฉ์๋๋ฅผ ํตํด ์ขํ๊ณ๋ ํ๋/์ถ์ํด์ฃผ์ด์ผ ํ๋ค.
[MDN]Window.devicePixelRatio
[CSS] DPR(Device-pixel-ratio)์ ์ดํด
์นํด์๋ (๋ฌผ๋ฆฌํฝ์
, ๋
ผ๋ฆฌํฝ์
, ๊ณ ๋ฐ๋ ํด์๋, PPI)
devicePixelContentBox๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒฝํ๊ฒ ํฝ์
(pixel-perfect) ๋ ๋๋งํ๊ธฐ