ฉากนี้ทำยังไง?

ทั้งฉากตลาดสดนี้ ไม่มีรูปภาพหรือ asset ภายนอกแม้แต่ไฟล์เดียว ทุกอย่าง — ทุเรียน มังคุด กล้วย หมู ปลา พวงมาลัย หม้อแกง แมว — เป็น <div> ธรรมดาที่วาดรูปทรงด้วย CSS ล้วนๆ (มีข้อยกเว้นเดียวคือหนามทุเรียน ที่ยากเกินจะทำด้วย clip-path ล้วนๆ เลยใช้ SVG สร้าง polygon 22 แฉกรอบวงด้วยสูตรตรีโกณมิติแทน)

เทคนิคหลักที่ใช้

โหมด "ดูโค้ด"

กดปุ่ม "ดูโค้ด" แล้วคลิกของชิ้นไหนก็ได้ในฉาก — popup จะโชว์ CSS จริงของชิ้นนั้น ดึงมาจาก registry เดียวใน lib/sceneData.ts ที่ผูก id ของแต่ละชิ้นเข้ากับชื่อไทยและ snippet CSS ที่ก็อปมาจาก scene.css ตรงๆ — ไม่ได้อ่าน computed style runtime เพราะฉากนี้ไม่มี JS framework หนักๆ มาช่วยคำนวณ

ส่วนที่วาดยากที่สุด

หนามทุเรียน คือจุดที่ยอมเปิดให้ SVG เข้ามาช่วย — พยายามทำด้วย box-shadow ซ้อนเป็นแฉกรอบวงด้วย CSS ล้วนๆ ก่อน แต่ควบคุมทิศทางปลายแหลมแต่ละอันให้ชี้ออกจากจุดศูนย์กลางไม่ได้ สุดท้ายจึงคำนวณพิกัดแฉกด้วยตรีโกณมิติ (lib/durianSpikes.ts) แล้ว render เป็น <polygon> 22 แฉกใน SVG แทน. รองลงมาคือ พื้นเปียกสะท้อนแสง — การสะท้อนภาพจริงต้อง duplicate DOM ทั้งฉากกลับหัวแล้วเบลอ ซึ่งหนักเกินไป จึงจำลองด้วย gradient มืดๆ ผสม highlight เฉียงที่ขยับ (shimmer) แทนการสะท้อนจริง

สถิติสนุกๆ

31ชิ้นส่วนที่ hover/tap ได้
6แผงตลาด
~1,200บรรทัด CSS (scene.css)
13@keyframes แอนิเมชัน
12CSS custom properties
42gradient ที่ใช้วาดของ
6clip-path รูปทรง
1รูป <img> ในทั้งฉาก

แรงบันดาลใจ

ได้แรงบันดาลใจจากชุมชน CSS art ที่พิสูจน์มานานว่า <div> เปล่าๆ กับ gradient/clip-path วาดอะไรก็ได้ — อย่างงานสาย #CSSArt/single-div art บน CodePen ของศิลปิน อย่าง Lynn Fisher, Ben Evans และ Diana Smith ที่ผลักดันว่า CSS ล้วนๆ ไปได้ไกลกว่าที่คนทั่วไปคิดไว้มาก