ดูเหมือนว่าจะใช้งานได้สำหรับฉัน
หากสไปรท์อยู่ในกริดให้ตั้งbackground-size
จำนวนสไปรต์เป็น 100% และจำนวนสไปรต์ลดลง 100% จากนั้นใช้background-position -<x*100>% -<y*100>%
ตำแหน่งที่ x และ y เป็นศูนย์สไปรต์
กล่าวอีกนัยหนึ่งถ้าคุณต้องการเทพดาที่ 3 จากซ้ายและแถวที่ 2 นั่นคือ 2 ส่วนและ 1 ลงไป
background-position: -200% -100%;
ตัวอย่างเช่นนี่คือสไปรต์แผ่น 4x2 สไปรต์
และนี่คือตัวอย่าง
div {
margin: 3px;
display: inline-block;
}
.sprite {
background-image: url('https://i.stack.imgur.com/AEYNC.png');
background-size: 400% 200%; /* 4x2 sprites so 400% 200% */
}
.s0x0 { background-position: -0% -0%; }
.s1x0 { background-position: -100% -0%; }
.s2x0 { background-position: -200% -0%; }
.s3x0 { background-position: -300% -0%; }
.s0x1 { background-position: -0% -100%; }
.s1x1 { background-position: -100% -100%; }
.s2x1 { background-position: -200% -100%; }
.s3x1 { background-position: -300% -100%; }
<div class="sprite s3x1" style="width: 45px; height:20px"></div>
<div class="sprite s3x1" style="width: 128px; height:30px"></div>
<div class="sprite s3x1" style="width: 64px; height:56px"></div>
<div class="sprite s2x1" style="width: 57px; height:60px"></div>
<div class="sprite s3x0" style="width: 45px; height:45px"></div>
<div class="sprite s0x1" style="width: 12px; height:100px"></div>
<br/>
<div class="sprite s0x0" style="width: 45px; height:20px"></div>
<div class="sprite s1x0" style="width: 128px; height:45px"></div>
<div class="sprite s2x0" style="width: 64px; height:56px"></div>
<div class="sprite s3x0" style="width: 57px; height:60px"></div>
<br/>
<div class="sprite s0x1" style="width: 45px; height:45px"></div>
<div class="sprite s1x1" style="width: 12px; height:50px"></div>
<div class="sprite s2x1" style="width: 12px; height:50px"></div>
<div class="sprite s3x1" style="width: 12px; height:50px"></div>
หากสไปรต์มีขนาดแตกต่างกันคุณจะต้องตั้งค่าbackground-size
สไปรต์แต่ละอันให้เป็นเปอร์เซ็นต์โดยที่ความกว้างของสไปรต์จะกลายเป็น 100%
กล่าวอีกนัยหนึ่งถ้าภาพมีความกว้าง 640px และภาพด้านในมีความกว้าง 45px และจากนั้นจะได้รับ 45px เป็น 640px
xScale = imageWidth / spriteWidth
xScale = 640 / 45
xScale = 14.2222222222
xPercent = xScale * 100
xPercent = 1422.22222222%
จากนั้นคุณต้องตั้งค่าออฟเซ็ต ภาวะแทรกซ้อนของการชดเชยคือ 0% จัดชิดซ้ายและ 100% จัดชิดขวา
เป็นโปรแกรมเมอร์กราฟิกฉันคาดหวังชดเชย 100% ที่จะย้ายพื้นหลัง 100% ทั่วองค์ประกอบในคำอื่น ๆ ทั้งหมดออกทางด้านขวา แต่นั่นไม่ใช่สิ่งที่หมายถึง 100% backgrouhnd-position
เมื่อใช้กับ background-position: 100%;
หมายถึงการจัดชิดขวา ดังนั้นฟอรัมจะพิจารณาสิ่งนั้นหลังจากการปรับสเกล
xOffsetScale = 1 + 1 / (xScale - 1)
xOffset = offsetX * offsetScale / imageWidth
สมมติว่าชดเชยเป็น 31px
xOffsetScale = 1 + 1 / (14.222222222 - 1)
xOffsetScale = 1.0756302521021115
xOffset = offsetX * xOffsetScale / imageWidth
xOffset = 31 * 1.0756302521021115 / 640
xOffset = 0.05210084033619603
xOffsetPercent = 5.210084033619603
นี่คือภาพขนาด 640x480 ที่มี 2 สไปรต์
- ที่ 31x27y ขนาด 45w 32h
- ที่ 500x 370y ขนาด 105w 65h
การติดตามคณิตศาสตร์ด้านบนสำหรับสไปรต์ 1
xScale = imageWidth / spriteWidth
xScale = 640 / 45
xScale = 14.2222222222
xPercent = xScale * 100
xPercent = 1422.22222222%
xOffsetScale = 1 + 1 / (14.222222222 - 1)
xOffsetScale = 1.0756302521021115
xOffset = offsetX * xOffsetScale / imageWidth
xOffset = 31 * 1.0756302521021115 / 640
xOffset = 0.05210084033619603
xOffsetPercent = 5.210084033619603
yScale = imageHeight / spriteHEight
yScale = 480 / 32
yScale = 15
yPercent = yScale * 100
yPercent = 1500%
yOffsetScale = 1 + 1 / (15 - 1)
yOffsetScale = 1.0714285714285714
yOffset = offsetY * yOffsetScale / imageHeight
yOffset = 27 * 1.0714285714285714 / 480
yOffset = 0.06026785714285714
yOffsetPercent = 6.026785714285714
div {
margin: 3px;
display: inline-block;
}
.sprite {
background-image: url('https://i.stack.imgur.com/mv9lJ.png');
}
.s1 {
background-size: 1422.2222% 1500%;
background-position: 5.210084033619603% 6.026785714285714%;
}
.s2 {
background-size: 609.5238095238095% 738.4615384615385%;
background-position: 93.45794392523367% 89.1566265060241%;
}
<div class="sprite s1" style="width: 45px; height:20px"></div>
<div class="sprite s1" style="width: 128px; height:30px"></div>
<div class="sprite s1" style="width: 64px; height:56px"></div>
<div class="sprite s1" style="width: 57px; height:60px"></div>
<div class="sprite s1" style="width: 45px; height:45px"></div>
<div class="sprite s1" style="width: 12px; height:50px"></div>
<div class="sprite s1" style="width: 50px; height:40px"></div>
<hr/>
<div class="sprite s2" style="width: 45px; height:20px"></div>
<div class="sprite s2" style="width: 128px; height:30px"></div>
<div class="sprite s2" style="width: 64px; height:56px"></div>
<div class="sprite s2" style="width: 57px; height:60px"></div>
<div class="sprite s2" style="width: 45px; height:45px"></div>
<div class="sprite s2" style="width: 12px; height:50px"></div>
<div class="sprite s2" style="width: 50px; height:40px"></div>