์ด๋ฏธ์ง ์ ๋ช ๋ ์ต์ ํ: image-rendering ์์ฑ ์๋ฒฝ ๊ฐ์ด๋
์น์ฌ์ดํธ๋ฅผ ์ด์ํ๊ฑฐ๋ ๋ธ๋ก๊ทธ๋ฅผ ๋์์ธํ ๋, ์ด๋ฏธ์ง๊ฐ ์๋์ ๋ฌ๋ฆฌ ํ๋ฆฟํ๊ฒ ๋ณด์ด๋ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์์ต๋๋ค. ํนํ ๋ฐ์ํ ์น ๋์์ธ์์๋ ์ด๋ฏธ์ง ํฌ๊ธฐ๊ฐ ๋์ ์ผ๋ก ๋ณํ๋ฉด์ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋์ผ๋ก ๋ฆฌ์ฌ์ด์ง ์ฒ๋ฆฌํ๊ณ , ์ด ๊ณผ์ ์์ ๋ถ๋๋ฌ์ด ๊ณ๋จ ํ์(anti-aliasing)์ด ์ ์ฉ๋์ด ์ด๋ฏธ์ง๊ฐ ๋ฟ์๊ฒ ๋ณด์ผ ์ ์์ต๋๋ค.
ํฐ์คํ ๋ฆฌ ์ธ๋ค์ผ ํ๋ฆผ ํ์, ์ด๋ ๊ฒ ๊ฐ์ ํ์ธ์
์ด๋ฌํ ๋ฌธ์ ๋ image-rendering ์์ฑ์ ํตํด ์ผ์ ๋ถ๋ถ ์ ์ดํ ์ ์์ผ๋ฉฐ, ํนํ ์ธ๋ค์ผ, ์์ด์ฝ, ํฝ์ ์ํธ ๋ฑ์์ ์๊ฐ์ ์ ๋ช ๋๋ฅผ ๋์ด๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
1. image-rendering ์์ฑ์ ๊ธฐ๋ณธ ์ดํด
image-rendering
์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฏธ์ง๋ฅผ ์ด๋ป๊ฒ ๋ ๋๋ง(ํฝ์
์ ์กฐ์ ํด์ ๋ณด์ฌ์ค์ง) ๊ฒฐ์ ํ๋ CSS ์์ฑ์
๋๋ค. ํนํ ์ด๋ฏธ์ง ํ๋ ์ ์ ๋ช
๋ ์ ์ง์ ๋ถ๋๋ฌ์ด ๋ณด๊ฐ์ ์ ํํ ์ ์๊ฒ ํด์ค๋๋ค.
1.1 ์ฃผ์ ์์ฑ๊ฐ ์ค๋ช
์์ฑ๊ฐ | ์ค๋ช |
---|---|
auto | ๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ (๊ธฐ๋ณธ๊ฐ) |
crisp-edges | ๊ณ๋จ ํ์์ ์ ์งํ์ฌ ์ ๋ช ํ ๊ฒฝ๊ณ ์ ๊ณต |
pixelated | ํฝ์ ์ํธ ์คํ์ผ ์ ์ง |
-webkit-optimize-contrast | ์นํท ๊ณ์ด ๋ธ๋ผ์ฐ์ (์ฌํ๋ฆฌ, ํฌ๋กฌ ๋ฑ)์์ ์ ๋ช ๋ ํฅ์ |
.example-img {
image-rendering: crisp-edges; /* ํ์ค */
image-rendering: -webkit-optimize-contrast; /* ํฌ๋กฌ, ์ฌํ๋ฆฌ (๋นํ์ค) */
image-rendering: -moz-crisp-edges; /* ํ์ด์ดํญ์ค */
-ms-interpolation-mode: nearest-neighbor; /* IE ์ ์ฉ */
}
1.2 ์ด๋ค ์ํฉ์ ํ์ํ๊ฐ?
- ๋ํธ ๊ธฐ๋ฐ ๊ฒ์ ๊ทธ๋ํฝ
- ์ ๊ตํ ์์ด์ฝ, ๋ก๊ณ
- ์๋ฃ·์ฐ์ ์ฉ ๊ณ ํด์๋ ์ด๋ฏธ์ง ๋ทฐ์ด
- ์ง๋, ๋ํ ๋ฑ ์ ๋ช ํ ๋ผ์ธ์ด ์ค์ํ ์ฝํ ์ธ
2. ์ค์ ์ ์ฉ ์ฌ๋ก
์ด ์์ฑ์ ๋ค์ ๊ธฐ์ ์ ์ธ ์ฑ๊ฒฉ์ ์ง๋๊ณ ์์ด, ์ผ๋ฐ ๋ธ๋ก๊ทธ ์ด์์ ์ ์ฅ์์ ๋ชจ๋ ์ธ๋ถ ๋ด์ฉ์ ์์งํ ํ์๋ ์์ต๋๋ค. ๋ค๋ง, ๋ธ๋ก๊ทธ ๋ฐฉ๋ฌธ์๊ฐ ์ด๋ฏธ์ง๋ฅผ ๋๋ ทํ๊ฒ ์ธ์ํ ์ ์๊ฒ ๋ง๋๋ ๊ฒ
ํนํ ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ๋ฅผ ํฌํจํ CMS ํ๊ฒฝ์์๋, ์ด๋ฏธ์ง ์ ๋ช ๋ ์ต์ ํ๊ฐ ๋จ์ํ ์๊ฐ์ ๋ง์กฑ๋๋ฅผ ๋์ด SEO(๊ฒ์์์ง ์ต์ ํ)์๋ ์ํฅ์ ์ค ์ ์๊ธฐ ๋๋ฌธ์, ๊ธฐ๋ณธ์ ์ธ ์๋ฆฌ์ ๋์ ๋ฐฉ์์ ์ดํดํ๊ณ ์์ผ๋ฉด ํฐ ๋์์ด ๋ฉ๋๋ค.
2.1 ์ธ๋ค์ผ ์ด๋ฏธ์ง ์ต์ ํ
๋ธ๋ก๊ทธ ๋ณธ๋ฌธ์ ์ฝ์ ๋ ์ด๋ฏธ์ง๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํฐ์คํ ๋ฆฌ์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ์์คํ ์ ์ํด ์๋ ์กฐ์ ๋๋ฉฐ, ์ผ๋ฐ ์ฝํ ์ธ ์๋ ํฌ๊ฒ ๋ถํธํจ์ด ์์ต๋๋ค. ํ์ง๋ง ์ธ๋ค์ผ ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ, ํด์๋์ ๋น์จ, ์ ๋ช ๋ ์ธก๋ฉด์์ ๋ถ์กฑํจ์ ๋๋ผ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
์ธ๋ค์ผ์ ์ฝํ ์ธ ์ ์ฒซ์ธ์์ ๊ฒฐ์ ํ๋ ์์์ด์ ํด๋ฆญ ์ ๋์จ(CTR)์ ์ง์ ์ ์ธ ์ํฅ์ ์ฃผ๊ธฐ ๋๋ฌธ์, ๋ณ๋์ ์ต์ ํ๊ฐ ํ์ํฉ๋๋ค.
2.2 ์ธ๋ค์ผ ๊ตฌ์กฐ ์์
<div class="gallery">
<img src="product.webp"
class="optimized-thumb"
width="400"
height="300"
alt="์ ํ ์ธ๋ค์ผ">
</div>
<style>
.optimized-thumb {
width: 100%;
height: auto;
image-rendering: crisp-edges;
object-fit: contain;
border: 1px solid #f0f0f0;
transition: transform 0.3s ease;
}
.optimized-thumb:hover {
transform: scale(1.03);
filter: contrast(1.1);
}
</style>
- ๋ค์ํ ํ๋ฉด ํด์๋ ์ง์
์ค๋งํธํฐ, ํ๋ธ๋ฆฟ, ๊ณ ํด์๋ ๋ ธํธ๋ถ ๋ฑ ๋ค์ํ ๊ธฐ๊ธฐ๊ฐ ์๋๋ฐ, ํด์๋๊ฐ ๋์์๋ก ๋ ์ ๋ช ํ ์ด๋ฏธ์ง๊ฐ ํ์ํฉ๋๋ค. - ์๋์ ํ์ง์ ๊ท ํ
์ผ๋ฐ ํด์๋ ์ด๋ฏธ์ง๋ง ์ฐ๋ฉด ๊ณ ํด์๋ ๊ธฐ๊ธฐ์์ ํ๋ฆฟํ๊ฒ ๋ณด์ด๊ณ , ๋ฌด์กฐ๊ฑด ํฐ ์ด๋ฏธ์ง๋ง ์ฐ๋ฉด ๋๋ฆฐ ๋คํธ์ํฌ์์ ๋ก๋ฉ์ด ๋๋ ค์ง๋๋ค. ๊ทธ๋์ src์ srcset์ ๊ฐ์ด ์จ์ ์ผ๋ฐ ๊ธฐ๊ธฐ์๋ ๊ฐ๋ฒผ์ด ์ธ๋ค์ผ ๋ถ๋ฌ์ฃผ๊ณ ๊ณ ํด์๋ ๊ธฐ๊ธฐ์๋ ์ ๋ช ํ ํฐ ์ด๋ฏธ์ง ๋ถ๋ฌ์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
2.3 ํฐ์คํ ๋ฆฌ ์ธ๋ค์ผ ์ฒ๋ฆฌ ๋ฐฉ์
ํฐ์คํ ๋ฆฌ๋ ์ด๋ฏธ์ง ์นํ์({์ด๋ฏธ์ง}) ๊ธฐ๋ฐ์ผ๋ก ์ธ๋ค์ผ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๋ฉฐ, ์ผ๋ถ ์คํจ์์๋ ๊ณ ์ ๋ ํด์๋(์: 300x200, 400x300)๋ก ๋ฆฌ์ฌ์ด์ง๋ฉ๋๋ค. ์ด ๊ณผ์ ์์ ์๋ณธ ์ด๋ฏธ์ง ํ์ง์ด ์์ค๋๋ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฏ๋ก, CSS๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ ๋๋ง ์ ์ด๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ํ์ํฉ๋๋ค.
์์:
์๋ณธ ์ฝ๋
src="//i1.daumcdn.net/thumb/C58x58.fwebp.q85/?fname=" alt=""
์์ ํ ์ฝ๋
src="//i1.daumcdn.net/thumb/C600x336.fwebp.q85/?fname=" alt=""
2.4 ๊ณ ํด์๋(๋ ํฐ๋) ๋์คํ๋ ์ด ๋์
๊ณ ํด์๋ ๋์คํ๋ ์ด์์๋ ์ผ๋ฐ ํด์๋์ ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฟ์๊ฒ ๋ณด์ผ ์ ์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ํ์ ์ธ ๋ฐฉ์์ 2๋ฐฐ ํด์๋ ์ด๋ฏธ์ง๋ฅผ ์กฐ๊ฑด๋ถ๋ก ๋ก๋ฉํ๋ ๊ฒ์ ๋๋ค.
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi)
- ์ด ๋ถ๋ถ์ ๋ฏธ๋์ด ์ฟผ๋ฆฌ ์กฐ๊ฑด์ ๋๋ค.
- -webkit-min-device-pixel-ratio: 2๋ ํฌ๋กฌ, ์ฌํ๋ฆฌ ๊ฐ์ ์นํท ๋ธ๋ผ์ฐ์ ์์ ํ๋ฉด ํฝ์ ๋ฐฐ์จ์ด 2๋ฐฐ ์ด์์ธ ๊ณ ํด์๋ ๊ธฐ๊ธฐ๋ฅผ ์๋ฏธํฉ๋๋ค.
- min-resolution: 192dpi๋ ํ์ค ๋ธ๋ผ์ฐ์ ์์ ํด์๋๊ฐ 192dpi ์ด์์ธ ๊ณ ํด์๋ ๋์คํ๋ ์ด๋ฅผ ๋ปํฉ๋๋ค.
- ์ด ์กฐ๊ฑด์ ๋ถํฉํ ๋๋ง {} ์์ ์คํ์ผ์ด ์ ์ฉ๋ฉ๋๋ค.
2. .high-dpi-img
- ํด๋์ค ์ด๋ฆ์ผ๋ก, ๊ณ ํด์๋ ํ๋ฉด์์ ์คํ์ผ์ด ์ ์ฉ๋ ์์๋ฅผ ์ ํํฉ๋๋ค.
3. background-image: url('image@2x.jpg');
- ๊ณ ํด์๋ ์ ์ฉ 2๋ฐฐ ํฌ๊ธฐ ์ด๋ฏธ์ง๋ฅผ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง๋ก ์ฌ์ฉํ๋๋ก ์ง์ ํฉ๋๋ค.
- ๋ณดํต ๊ธฐ๋ณธ ์ด๋ฏธ์ง๋ณด๋ค ํฌ๊ธฐ๊ฐ 2๋ฐฐ์ฌ์, ๊ณ ํด์๋ ๋์คํ๋ ์ด์์ ๋ ์ ๋ช ํ๊ฒ ๋ณด์ ๋๋ค.
4. image-rendering: crisp-edges;
- ์ด๋ฏธ์ง์ ํฝ์ ์ ๋ ์นด๋กญ๊ณ ์ ๋ช ํ๊ฒ ๋ ๋๋งํ๋๋ก ํ๋ CSS ์์ฑ์ ๋๋ค.
- ํฝ์ ์ํธ, ์์ด์ฝ ๋ฑ ์ ๋ช ํจ์ด ์ค์ํ ์ด๋ฏธ์ง์ ํจ๊ณผ์ ์ ๋๋ค.
@media (-webkit-min-device-pixel-ratio: 2),
(min-resolution: 192dpi) {
.high-dpi-img {
background-image: url('image@2x.jpg');
image-rendering: crisp-edges;
}
}
- ๋ค์ํ ํ๋ฉด ํด์๋ ์ง์
์ค๋งํธํฐ, ํ๋ธ๋ฆฟ, ๊ณ ํด์๋ ๋ ธํธ๋ถ ๋ฑ ๋ค์ํ ๊ธฐ๊ธฐ๊ฐ ์๋๋ฐ, ํด์๋๊ฐ ๋์์๋ก ๋ ์ ๋ช ํ ์ด๋ฏธ์ง๊ฐ ํ์ํฉ๋๋ค. - ์๋์ ํ์ง์ ๊ท ํ
์ผ๋ฐ ํด์๋ ์ด๋ฏธ์ง๋ง ์ฐ๋ฉด ๊ณ ํด์๋ ๊ธฐ๊ธฐ์์ ํ๋ฆฟํ๊ฒ ๋ณด์ด๊ณ , ๋ฌด์กฐ๊ฑด ํฐ ์ด๋ฏธ์ง๋ง ์ฐ๋ฉด ๋๋ฆฐ ๋คํธ์ํฌ์์ ๋ก๋ฉ์ด ๋๋ ค์ง๋๋ค. ๊ทธ๋์ src์ srcset์ ๊ฐ์ด ์จ์ ์ผ๋ฐ ๊ธฐ๊ธฐ์๋ ๊ฐ๋ฒผ์ด ์ธ๋ค์ผ ๋ถ๋ฌ์ฃผ๊ณ ๊ณ ํด์๋ ๊ธฐ๊ธฐ์๋ ์ ๋ช ํ ํฐ ์ด๋ฏธ์ง ๋ถ๋ฌ์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
3. ์ฑ๋ฅ ๋น๊ต ๋ฐ ์ต์ ํ ํ
3.1 ๋ ๋๋ง ๋ฐฉ์ ๋น๊ตํ
์๋๋ CSS image-rendering ์์ฑ์ ๋ํ์ ์ธ ๋ ๋๋ง ๋ฐฉ์ 3๊ฐ์ง์ ๋ํ ์ ๋ช ๋, ์ฑ๋ฅ, ํ์ฉ ์ฌ๋ก ๋น๊ตํ์ ๋๋ค.
๋ ๋๋ง ๋ฐฉ์ | ์ ๋ช ๋ | ์ฑ๋ฅ | ์ฌ๋ก |
---|---|---|---|
๊ธฐ๋ณธ ๋ฆฌ์ฌ์ด์ง | โณ | โ โ โ | ์ผ๋ฐ ์ฌ์ง |
crisp-edges | โ โ โ | โ โ | ์์ด์ฝ, ๋ก๊ณ |
pixelated | โ โ | โ โ โ | ๋ํธ ๊ทธ๋ํฝ |
- ๊ธฐ๋ณธ ๋ฆฌ์ฌ์ด์ง(auto): ๋ถ๋๋ฌ์ด ํ๋ ์ถ์์ ์ ํฉ. ์ผ๋ฐ์ ์ธ ์ด๋ฏธ์ง์ ์ฌ์ฉ.
- crisp-edges: ๊ฐ์ฅ์๋ฆฌ๋ฅผ ๋ ์นด๋กญ๊ฒ ๋ ๋๋ง. ํฝ์ ์์ค์ ์ต์ํํ๊ณ ๊ณ ์ ๋ ํฝ์ ๊ธฐ๋ฐ ์ด๋ฏธ์ง์ ์ ํฉ.
- pixelated: ํฝ์ ์ ์๋์ ์ผ๋ก ํฌ๊ฒ ํ๋ํด ๋ ํธ๋กํ ๋๋. ๋ํธ ์คํ์ผ ๊ฒ์ ๊ทธ๋ํฝ์ ์ด์์ .
3.2 ์ด๋ฏธ์ง ์ต์ ํ ๋จ๊ณ๋ณ ํ
- ์๋ณธ ํด์๋ ํ๋ณด:
ํ์ ํฌ๊ธฐ์ 2๋ฐฐ ์ด์ ํด์๋๋ก ์ ์ - ํฌ๋งท ์ ํ:
WebP > PNG > JPEG ์์ผ๋ก ๊ณ ๋ ค - CSS ์ค์ :
image-rendering, object-fit ๋ฑ ์์ฑ ์กฐํฉ - ์ฑ๋ฅ ์ ๊ฒ:
Chrome DevTools, Lighthouse ๋ฑ์ผ๋ก ํ ์คํธ
4. ๊ณ ๊ธ ํ์ฉ ํ ํฌ๋
4.1 Canvas ์ด๋ฏธ์ง ํ์ง ์ค์
HTML5์ <canvas> ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํด ๊ทธ๋ํฝ์ ๊ทธ๋ฆด ์ ์๋ ๋งค์ฐ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ํนํ ์ด๋ฏธ์ง๋ฅผ ํ๋ํ๊ฑฐ๋ ์ถ์ํ ๋ ํ์ง ์ค์ ์ด ์ค์ํ๋ฐ, ์ด๋ ์ฌ์ฉํ๋ ๊ฒ์ด imageSmoothingEnabled ์์ฑ์ ๋๋ค.
- imageSmoothingEnabled ์์ฑ์ ์บ๋ฒ์ค์์ ์ด๋ฏธ์ง ํ๋/์ถ์ ์ ํฝ์ ๋ณด๊ฐ(๋ธ๋ฌ) ํจ๊ณผ๋ฅผ ์ผ๊ฑฐ๋ ๋๋ ์ต์ ์ ๋๋ค.
- false๋ก ์ค์ ํ๋ฉด ํฝ์ ๋จ์๊ฐ ๊นจ๋ํ๊ฒ ์ ์ง๋์ด, ๋ํธ ๊ทธ๋ํฝ์ด๋ ํฝ์ ์ํธ๋ฅผ ํํํ ๋ ์ ์ฉํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ํธํ์ ์ํด WebKit(ํฌ๋กฌ, ์ฌํ๋ฆฌ), Mozilla(ํ์ด์ดํญ์ค) ์ ์ฉ ์ ๋์ฌ ์์ฑ๋ ๊ฐ์ด ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
ctx.imageSmoothingEnabled = false;
ctx.webkitImageSmoothingEnabled = false; // ํฌ๋กฌ, ์ฌํ๋ฆฌ์ฉ
ctx.mozImageSmoothingEnabled = false; // ํ์ด์ดํญ์ค์ฉ
4.2 ์ธ์ false๋ก ์ค์ ํ๋์?
- ๋ํธ ๊ทธ๋ํฝ, ํฝ์ ์ํธ, ๋ ํธ๋ก ๊ฒ์ ์คํ์ผ ์ด๋ฏธ์ง์ฒ๋ผ ๊ฐ ํฝ์ ์ ์ ๋ช ํ ๊ฒฝ๊ณ๊ฐ ์ค์ํ ๊ฒฝ์ฐ
- ํ๋ํด๋ ํฝ์ ์ด ๊นจ๋ํ๊ณ ์ ๋ช ํ๊ฒ ๋ณด์ฌ์ผ ํ ๋
- ๊ทธ๋ํฝ์ด ๋ญ๊ฐ์ ธ ๋ณด์ด์ง ์๋๋ก ํ๊ณ ์ถ์ ๋
4.3 SVG ํํฐ ๊ฒฐํฉ ์์
- <feGaussianBlur>: ์๋ณธ ๊ทธ๋ํฝ์ ํ๋ฆฌ๊ฒ ๋ง๋ญ๋๋ค.
- <feComponentTransfer>: ํ๋ ค์ง ์ด๋ฏธ์ง ๋ฐ๊ธฐ๋ฅผ ์กฐ์ ํฉ๋๋ค.
- <feDropShadow>: ๊ทธ๋ฆผ์ ํจ๊ณผ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- result ์์ฑ์ ์ด์ฉํด ์ค๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ฆ ๋ถ์ฌ ๋ค์ ํํฐ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
- ๋ง์ง๋ง <feDropShadow>๋ ๋ฐ๋ก ์๋ณธ ๊ทธ๋ํฝ์ ์ ์ฉ๋๋ฉฐ, ํ์ํ๋ฉด in ์์ฑ์ผ๋ก ์ด์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์๋ ์์ต๋๋ค.
<svg width="0" height="0" style="position:absolute; visibility:hidden;">
<defs>
<filter id="combinedFilter" x="-20%" y="-20%" width="140%" height="140%">
<!-- 1. ํ๋ฆผ ํจ๊ณผ -->
<feGaussianBlur in="SourceGraphic" stdDeviation="3" result="blurred"/>
<!-- 2. ๋ฐ๊ธฐ ์กฐ์ -->
<feComponentTransfer in="blurred" result="brightened">
<feFuncR type="linear" slope="1.2" intercept="0"/>
<feFuncG type="linear" slope="1.2" intercept="0"/>
<feFuncB type="linear" slope="1.2" intercept="0"/>
</feComponentTransfer>
<!-- 3. ๊ทธ๋ฆผ์ ํจ๊ณผ -->
<feDropShadow dx="4" dy="4" stdDeviation="2" flood-color="rgba(0,0,0,0.5)" />
</filter>
</defs>
</svg>
5. ์ฃผ์์ฌํญ ๋ฐ ๋ฌธ์ ํด๊ฒฐ
5.1 ํํ ์ค์
- ๋ฎ์ ์๋ณธ ํด์๋: CSS๋ง์ผ๋ก ํด๊ฒฐ ๋ถ๊ฐ
- ์์ฑ ์ถฉ๋: transform๊ณผ filter ์ค๋ณต ์ ์์ธ ๋ฐ์
- ํํฐ ๊ณผ๋ค ์ฌ์ฉ: ๋ ๋๋ง ์๋ ์ ํ ๊ฐ๋ฅ์ฑ ์์
5.2 ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ๋์
.img-optimized {
image-rendering: crisp-edges;
image-rendering: -webkit-optimize-contrast;
image-rendering: -moz-crisp-edges;
-ms-interpolation-mode: nearest-neighbor;
}
์์ฑ | ์ค๋ช | ๋์ ๋ธ๋ผ์ฐ์ |
image-rendering: crisp-edges; | ์ด๋ฏธ์ง ํ๋ ์, ํ๋ฆฌ์ง ์๊ณ ์ ๋ช ํ๊ฒ(ํฝ์ ์ ์ง) ํ์ | ํ์ค ๋ธ๋ผ์ฐ์ |
image-rendering: -webkit-optimize-contrast; | ํฌ๋กฌ, ์ฌํ๋ฆฌ์์ ๋๋น๋ฅผ ์ ์งํ ๊ณ ํ์ง ๋ ๋๋ง (๋นํ์ค) | WebKit ๊ณ์ด (Chrome, Safari) |
image-rendering: -moz-crisp-edges; | ํ์ด์ดํญ์ค ์ ์ฉ ํฝ์ ์ ๋ช ๋ ์ ์ง ์ต์ | Firefox |
-ms-interpolation-mode: nearest-neighbor; | IE ์ ์ฉ ์ด๋ฏธ์ง ํ๋ ์ ๊ฐ์ฅ ๊ฐ๊น์ด ํฝ์ ๊ฐ์ ๊ทธ๋๋ก ์ ์ง | Internet Explorer |
์์:
<img src="low-res-image.png" class="img-optimized" width="400" height="400" />
์ด๋ฏธ์ง ์ต์ ํ ์ถ์ฒ๋ฐฉ์
/* ๊ธฐ๋ณธ ์คํ์ผ (์ ์ด๋ฏธ์ง์ ๋ฌดํดํ ํจ๊ณผ) */
img {
width: 100%;
border-radius: 8px;
border: 1px solid rgba(0, 0, 0, 0.05);
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
}
/* ๊ณ ๊ธ ์ด๋ฏธ์ง ํจ๊ณผ (ํ์ํ ๊ณณ์์๋ง) */
.img-enhanced {
filter: contrast(1.08) brightness(1.02) saturate(1.05);
-webkit-filter: contrast(1.08) brightness(1.02) saturate(1.05);
will-change: transform, opacity;
transform: translateZ(0);
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
}
/* ๋ํธ ์ด๋ฏธ์ง์ฉ ๋ ๋๋ง ์ต์ ํ */
.img-crisp {
image-rendering: crisp-edges;
image-rendering: -webkit-optimize-contrast;
image-rendering: -moz-crisp-edges;
-ms-interpolation-mode: nearest-neighbor;
}
์ด๋ฏธ์ง ์ ๋ช ๋๋ฅผ ๋์ด๊ธฐ ์ํ ์ ๋ต์?
์ด๋ฏธ์ง ์ต์ ํ๋ ๋จ์ํ CSS ์์ฑ ํ๋๋ง์ผ๋ก ํด๊ฒฐ๋๋ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ข ํฉ์ ์ ๊ทผ์ด ํ์ํฉ๋๋ค:
- ๊ณ ํ์ง ์๋ณธ ํ๋ณด
- ์ ์ ํ ์ด๋ฏธ์ง ํฌ๋งท ์ ํ
- ์ํฉ์ ๋ง๋ image-rendering ์์ฑ ์ ์ฉ
- ๊ณ ํด์๋ ๋์ ๋ฐ ์ฑ๋ฅ ํ ์คํธ ๋ณํ
์ด๋ฏธ์ง๊ฐ ๋๋ ทํ๊ฒ ๋ณด์ด๋ ๊ฒ๋ง์ผ๋ก๋ ๋ธ๋ก๊ทธ์ ์ ๋ฌธ์ฑ๊ณผ ์ ๋ขฐ๋๊ฐ ์์นํ๋ฉฐ, ์ฌ์ฉ์ ๊ฒฝํ์ ๊ธ์ ์ ์ธ ์ํฅ์ ์ค ์ ์์ต๋๋ค.