CSS Spinner Generator: สร้าง loading spinner ด้วย CSS ล้วนในไม่กี่วินาที
คู่มือใช้งาน CSS Spinner Generator — เลือกพรีเซ็ตสไตล์ spinner ปรับขนาด สี และความเร็วพร้อม live preview แล้วคัดลอกโค้ด HTML กับ CSS สะอาด ๆ ที่ไม่ต้องพึ่ง JavaScript
Table of Contents
CSS Spinner Generator: สร้าง loading spinner ด้วย CSS ล้วนในไม่กี่วินาที
ทุกแอปพลิเคชันต่างมีช่วงเวลาที่ต้องรอ — รอ response จาก API รอการส่งฟอร์ม หรือรอรูปภาพโหลดมาถึง loading state ที่หายไปทำให้แอปที่เร็วดูเหมือนพัง: ผู้ใช้คลิกแล้วไม่มีอะไรเกิดขึ้นให้เห็น ภายในเสี้ยววินาทีเดียวพวกเขาก็สรุปได้ว่าเว็บค้าง ทางแก้นั้นราคาถูกมาก และ CSS Spinner Generator สร้างมันให้เสร็จภายในไม่กี่วินาที
แทนที่จะไล่หา animated GIF หรือติดตั้ง spinner library คุณแค่เลือกพรีเซ็ตสไตล์ ปรับขนาด สี และความเร็ว แล้วดูผลลัพธ์เคลื่อนไหวใน live preview คลิกเดียวคัดลอกได้ทั้ง HTML และ CSS ที่สะอาด ไม่มีรูปภาพ ไม่มีสคริปต์ — มีแค่ CSS มาตรฐานที่หมุน เต้น และเด้งเท่านั้น
ทำไมต้องใช้ CSS Spinner Generator?
- CSS ล้วน ไม่ต้องพึ่งไฟล์รูป — animated GIF เพิ่ม request หนึ่งรายการ ดูเบลอบนจอความละเอียดสูง และเปลี่ยนสีไม่ได้เลย spinner เหล่านี้วาดด้วย border วงกลม และแท่ง จึงคมกริบทุกขนาด
- ไม่ต้องติดตั้ง JavaScript library — ผลลัพธ์ทำงานด้วย CSS เพียงอย่างเดียว ไม่มี dependency ไม่เพิ่มน้ำหนัก bundle และไม่มีอะไรพังแม้สคริปต์โหลดช้าหรือถูกบล็อก
- live preview ขณะปรับแต่ง — ทุกการเปลี่ยนขนาด ความเร็ว หรือสี อัปเดต preview ทันที ให้คุณเปรียบเทียบตัวเลือกได้โดยไม่ต้องเซฟไฟล์แล้วรีเฟรช
- currentColor ทำให้การจัดธีมเป็นเรื่องง่าย — spinner รับสีข้อความจาก container แม่ได้ โค้ดชุดเดียวจึงใช้ได้ทั้งธีมสว่าง ธีมมืด และพาเลตต์แบรนด์
- การเคลื่อนไหวที่ทำให้เข้าถึงได้ — CSS spinner รองรับ prefers-reduced-motion และใช้คู่กับ role="status" สำหรับ screen reader ซึ่ง GIF ไม่มี hook แบบนี้ให้ใช้เลย
- ฟรี เป็นส่วนตัว และได้ผลทันที — ทำงานทั้งหมดในเบราว์เซอร์ ไม่ต้องมีบัญชี การตั้งค่าไม่เคยออกจากเครื่องคุณ และโค้ดเป็นของคุณทันทีที่คัดลอก
ฟีเจอร์หลัก
| ฟีเจอร์ | สิ่งที่ทำ |
|---|---|
| พรีเซ็ตสไตล์ | สลับระหว่างตระกูล ring, dots และ bars พร้อมรูปแบบย่อยอย่าง ring โค้งบางส่วนและแท่ง equalizer |
| ปรับขนาด | กำหนดขนาดเป็นพิกเซลแบบเป๊ะ ๆ ให้ spinner ตัวเดียวกันพอดีทั้งในปุ่ม การ์ด และ overlay เต็มหน้า |
| ปรับสี | เลือกค่า hex ได้ทุกสี หรือเลือก currentColor เพื่อรับสีข้อความของพื้นที่รอบ ๆ |
| ปรับความเร็ว | หมุน duration เข้าสู่ช่วงที่ช้าพอให้รับรู้ แทนที่จะเป็นเงาหมุนวนจนตาลาย |
| live preview | เห็นทุกการปรับเคลื่อนไหวแบบเดียวกับที่จะปรากฏใน production |
| คัดลอก HTML และ CSS | ได้ทั้ง snippet HTML กระชับและบล็อก CSS เรียบร้อยในคลิกเดียว |
สองรายละเอียดที่ทำให้ผลลัพธ์ใช้งานได้จริงเป็นพิเศษ:
- markup เป็น element เดียวหรือกลุ่มเล็ก ๆ จึงวางลงเลย์เอาต์ไหนก็ได้โดยไม่ต้องห่อด้วย wrapper div เพิ่ม
- CSS animate เฉพาะ transform, opacity และ border ซึ่งเบราว์เซอร์รันบน compositor ทำให้การเคลื่อนไหวลื่นไหล
วิธีการใช้งาน
- เลือกพรีเซ็ตสไตล์ เลือกตระกูลที่เข้ากับบริบท — ring สำหรับการโหลดทั่วไป dots สำหรับการรอแบบ inline และ bars สำหรับความรู้สึกสนุกมีพลัง
- ตั้งขนาด ค่าที่นิยมคือ 16 ถึง 20 พิกเซลสำหรับปุ่ม 32 ถึง 48 พิกเซลสำหรับการ์ดและแผง และ 64 พิกเซลขึ้นไปสำหรับหน้าโหลดเต็มจอ
- เลือกสี ใส่ค่า hex ให้ตรงแบรนด์ หรือเลือก currentColor ให้ spinner เดินตามสีข้อความของ container ที่มันอยู่
- จับความเร็ว ปรับ duration ไปพร้อมกับการจ้อง preview เป้าหมายคือการเคลื่อนไหวที่รับรู้ได้ชัด แต่ไม่ต้องรอนาน
- คัดลอก HTML และ CSS เมื่อ preview ดูเข้าที่แล้ว วางสอง snippet ลงในโปรเจกต์ การ integrate จบแค่นั้นเอง
Spinner แบบไม่ใช้ JavaScript
spinner pure-CSS ที่คนรู้จักดีที่สุดคือวงแหวนจากเทคนิค border และกายวิภาคของมันอธิบายสไตล์อื่นส่วนใหญ่ได้ด้วย:
.spinner {
width: 48px;
height: 48px;
border: 5px solid rgba(99, 102, 241, 0.2);
border-top-color: #6366f1;
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
element สี่เหลี่ยมถูกใส่ border หนา ๆ พร้อม border-radius: 50% ซึ่งเปลี่ยน border ให้กลายเป็นวงแหวน: เส้นโค้งสีจางโปร่งแสงสามเส้นก่อนตัวเป็นราง ส่วน border ด้านบนคือสีทึบตัวเด่น เมื่อหมุน element สีเด่นก็จะวิ่งไล่รางไปเรื่อย ๆ ไม่รู้จบ dots และ bars ใช้แนวคิดเดียวกัน — รูปทรงนิ่ง ๆ ที่ animate opacity หรือ transform ด้วย delay ที่ไล่กัน
ความเร็วสมควรได้รับความใส่ใจอย่างตั้งใจ ต่ำกว่าครึ่งวินาทีต่อรอบ spinner จะดูรีบเร้นจนทำให้การรอสองวินาทีรู้สึกยาวขึ้น ส่วนเกินราววินาทีครึ่งมันเริ่มดูเหมือนเว็บพังเสียแล้ว ช่วงที่รับรู้ได้โดยไม่ว้าวุ่นอยู่ระหว่าง 0.6 ถึง 1.2 วินาที คู่กับ timing function แบบ linear เพื่อให้ลูปไม่เร่งความเร็วจนเห็นได้ — เป็นการเคลื่อนไหวที่สื่อความคืบหน้าโดยไม่เรียกร้องความสนใจ
การจัดขนาดและการจัดธีมกลายเป็นเรื่องเล็กด้วย currentColor: spinner ที่ใช้ border-top-color: currentColor จะรับค่า color จาก element แม่ ตั้งสีครั้งเดียวที่ container — เทาในโหมดสว่าง ขาวในปุ่มสีหลัก — แล้ว spinner ทุกตัวข้างในตามทันที โค้ดชุดเดียวจึงรองรับ design system ทั้งระบบได้
การเข้าถึงคือชิ้นสุดท้าย ให้พื้นที่ที่กำลังโหลดมี role="status" (หรือตั้ง aria-busy="true" บน container ที่กำลังรีเฟรช) และใส่ label ที่ซ่อนจากสายตา เช่น <span class="visually-hidden">Loading...</span> จากนั้นชะลอ animation ภายใน media query @media (prefers-reduced-motion: reduce) สำหรับผู้ที่ขอให้ระบบปฏิบัติการลดการเคลื่อนไหว — ลดความเร็วลง แต่อย่าลบ loading state ทิ้ง
กรณีการใช้งานจริง
สถานะการ fetch และ API request
ทุกที่ที่ข้อมูลมาถึงแบบ asynchronous — ผลการค้นหา แดชบอร์ด เธรดคอมเมนต์ — spinner ในพื้นที่ที่กำลังอัปเดตบอกผู้ใช้ว่า request กำลังเดินทางอยู่ ควรค้างไว้จนกว่าเนื้อหาชิ้นแรกจะเรนเดอร์เสร็จ
การส่งฟอร์มและ feedback ของปุ่ม
ตอน submit ให้สลับข้อความบนปุ่มเป็น spinner ขนาด 16 ถึง 20 พิกเซล และ disable ปุ่มไว้ วิธีนี้กันการส่งซ้ำ ยืนยันว่าการคลิกถูกรับแล้ว และตั้งความคาดหวังเรื่องเวลารอให้ผู้ใช้
รูปภาพและเนื้อหาแบบ lazy-load
รูปใหญ่ใช้เวลาโหลดชัดเจนบนเครือข่ายช้า spinner ที่วางทับกรอบรูปช่วยเติมพื้นที่ที่จองไว้ และกันเนื้อหากระโดดขึ้นลงเมื่อไบต์ทั้งหมดมาถึง
ใช้คู่กับ skeleton screen
skeleton กับ spinner แก้ปัญหาคนละเรื่อง และอินเทอร์เฟซที่แข็งแรงใช้ทั้งคู่ skeleton placeholder — สร้างได้ง่าย ๆ ด้วย Skeleton Loader Generator — วางโครงหน้าที่เนื้อหาแน่น ส่วน spinner รับมือการรอแบบกะทัดรัดในจุดเดิม อย่างการกดปุ่มหรือรีเฟรชฟิลเตอร์
แนวปฏิบัติที่ดีที่สุด
- แสดง spinner หลังผ่านไปราว 300 มิลลิวินาที ไม่ใช่ทันที request ส่วนใหญ่เสร็จก่อนผู้ใช้ทันสังเกตดีเลย์ spinner ที่แฟลชเสี้ยววินาทีอ่านเป็นการกระพริบรบกวนสายตา
- จับคู่ spinner กับ skeleton screen ในพื้นที่เนื้อหา skeleton เหมาะเมื่อรู้เลย์เอาต์ที่กำลังจะมาถึง ส่วน spinner เหมาะกับการรอที่บอกไม่ได้ว่าจะนานแค่ไหน
- ทดสอบ spinner บนทั้งสองธีม วงแหวนเทาอ่อนหายไปบนพื้นขาว และวงเข้มหายไปในโหมดมืด ให้ตรวจคอนทราสต์ของสีข้อความใน container เสมอ
- เก็บ loading indicator ให้มีตัวเดียวต่อพื้นที่ spinner ห้าตัวแย่งกันดูรกวุ่นวาย ให้ localize แต่ละตัวและปล่อยส่วนอื่นของหน้านิ่งไว้
- อยู่ในกรอบ 0.6 ถึง 1.2 วินาที กลับมาดูความเร็วใหม่ทุกครั้งที่ปรับขนาด — จังหวะที่ดูสงบที่ 48 พิกเซลอาจดูรีบเร้นเกินไปเมื่อย่อเหลือ 16 พิกเซล
- ให้ทางออกจาก loading state เสมอ ถ้า request พังได้ spinner ต้องให้ที่กับข้อความ error พร้อมปุ่ม retry — spinner ที่หมุนไม่รู้จบก็แค่วิธีบอกว่าแอปพังในแบบที่ดูดีขึ้นเท่านั้น
เริ่มสร้าง spinner ของคุณวันนี้
loading state เป็นรายละเอียดที่ให้ผลตอบแทนสูงที่สุดชุดหนึ่งของงานออกแบบอินเทอร์เฟซ: CSS ไม่กี่บรรทัดแบ่งแยกแอปที่ดูพังออกจากแอปที่ดูตอบสนองไว เปิด CSS Spinner Generator ปรับปุ่มควบคุมไปพร้อมกับ live preview แล้วคัดลอก HTML กับ CSS ที่พร้อมขึ้น production ภายในไม่ถึงนาที — ไม่ต้องสมัครสมาชิก ไม่มี dependency และไม่มี JavaScript ปนอยู่ในผลลัพธ์
เครื่องมือที่เกี่ยวข้อง
- Skeleton Loader Generator — สร้างเลย์เอาต์ placeholder แบบ shimmer สำหรับหน้าที่เนื้อหาแน่น
- CSS Animation Generator — ออกแบบ keyframe animation เองพร้อม live preview แล้วคัดลอก CSS ไปใช้
- CSS Tooltip Generator — สร้าง tooltip ที่มีสไตล์และตำแหน่งพร้อมใช้ด้วย CSS ล้วน
ขอให้สนุกกับการหมุน spinner ครับ
คำถามที่พบบ่อย
ถ: spinner ที่ได้จากเครื่องมือต้องใช้ JavaScript ไหม?
ตอบ: ไม่ต้อง เครื่องมือทำงานในเบราว์เซอร์ของคุณ แต่โค้ดที่ได้เป็น HTML และ CSS ล้วน ๆ — การหมุน เต้น และเด้งขับเคลื่อนด้วย CSS keyframe animation ทั้งหมด จึงทำงานได้แม้ในที่ที่ปิดการใช้สคริปต์
ถ: จะปรับ spinner ให้เข้ากับสีแบรนด์ได้อย่างไร?
ตอบ: ใส่ค่า hex เพื่อได้สีตรงเป๊ะ หรือเลือก currentColor ให้ spinner รับค่า color จาก CSS ของ element แม่ โค้ดชุดเดียวจึงปรับเข้ากับทุกธีมโดยไม่ต้องแก้อะไรเพิ่ม
ถ: ใช้ spinner เหล่านี้กับ React, Vue หรือเฟรมเวิร์กอื่นได้ไหม?
ตอบ: ได้ วาง CSS ลง global stylesheet, CSS module หรือช่องทางจัดสไตล์ที่คุณใช้อยู่ แล้วเติม snippet HTML เข้าไปเป็น JSX หรือ template markup ได้เลย
ถ: ทำไม spinner ของฉันถึงเคลื่อนไหวแบบกระตุก ๆ?
ตอบ: อาการกระตุกมักมาจากการ animate property ด้าน layout หรือ easing curve ที่ไม่ใช่เส้นตรง ให้หมุนด้วย transform คู่กับ timing function แบบ linear และเลี่ยงการ animate width หรือ height