CSS Image Sprite: รวมหลายรูปในไฟล์เดียว ลด HTTP Requests
Image Sprite = รวมไอคอน/รูปเล็กหลายตัวในรูปภาพใหญ่ 1 ไฟล์ ใช้ background-position แสดงเฉพาะส่วนที่ต้องการ ลด request เร็วขึ้น
โค้ดตัวอย่าง
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; margin: 0px; }
span { width: 200px; height: 300px; background-color: black; }
nav { background-color: black; height: 50px; padding-top: 15px; padding-left: 10px; }
nav a { font-size: 20px; color: white; text-decoration: none; margin-right: 10px; }
.home { width: 32px; height: 32px; background: url("css_sprites.png") -62px -62px; }
.search { width: 32px; height: 32px; background: url("css_sprites.png") -10px -62px; }
.phone { width: 32px; height: 32px; background: url("css_sprites.png") -62px -10px; }
.user { width: 32px; height: 32px; background: url("css_sprites.png") -10px -10px; }
</style>
</head>
<body>
<nav>
<img class="home" /> <a href="">HOME</a>
<img class="phone" /> <a href="">Call Us</a>
<img class="user" /> <a href="">Our Team</a>
<img class="search" /> <a href="">Search</a>
</nav>
<h1> Main content here </h1>
<p>Lorem ipsum...</p>
</body>
</html>
จุดสังเกตจากโค้ด
- ใช้
<img>tag ว่าง พร้อม class สำหรับ background sprite – ควรใช้<span>หรือ<i>แทน (semantic) background-position: -62px -62px– ลบตำแหน่ง X, Y ใน sprite sheet- Sprite sheet ต้องวัดพิกเซลละเอียด – ใช้เครื่องมือช่วย
วิธีทันสมัยแทน Sprite
- SVG Sprites / Symbols –
<svg><symbol id="icon">...</symbol></svg>ใช้<use xlink:href="#icon">– scalable, styleable, accessible - Icon Fonts (Font Awesome, Material Icons) – ใช้เหมือนฟอนต์
- HTTP/2 + HTTP/3 – Multiplexing ทำให้ multiple requests ไม่ช้าอีกต่อไป Sprite ไม่ได้สำคัญเท่าเดิม
- CSS Mask / Mask-image – ใช้รูปเดียว mask สีต่างๆ
เครื่องมือสร้าง Sprite
- Toptal CSS Sprite Generator
- Sprite Generator
- Build tools: webpack-sprite-loader, gulp-spritesmith