Cubic Bezier Generator: ออกแบบ CSS Easing Curve แบบเห็นภาพ ใช้ได้ทันที
เรียนรู้วิธีใช้ Cubic Bezier Generator ออกแบบ preview และคัดลอก CSS cubic-bezier() สำหรับ transition และ animation โดยไม่ต้องคำนวณเอง
Table of Contents
ถ้าให้สังเกตเว็บที่ดู "มีชีวิต" กับเว็บที่ดูแข็งทื่อ ความต่างมักอยู่ที่ motion เล็ก ๆ น้อย ๆ — dropdown ที่เปิดแล้วลื่น, modal ที่ลอยเข้ามานุ่ม ๆ หรือ badge ที่เด้งข้ามจุดหมายแล้วสะบัดกลับ ทั้งหมดนี้ถูกควบคุมด้วยฟังก์ชันเดียวใน CSS นั่นคือ cubic-bezier() แต่ปัญหาคือ developer ส่วนใหญ่ไม่เคย "ออกแบบ" easing curve ของตัวเองจริง ๆ — เรามักก็อปตัวเลขสี่ตัวปริศนาจากบล็อกของคนอื่น แปะลง stylesheet แล้วภาวนาให้มันรู้สึกดี
Cubic Bezier Generator คือเครื่องมือออนไลน์ฟรีที่เปลี่ยนการเดาตัวเลขให้เป็นการออกแบบแบบเห็นภาพ — ลาก control points บนกราฟ interactive ดู animation preview สด ๆ ตอบสนองทุกการปรับ แล้วกด copy CSS cubic-bezier() ที่พร้อมใช้งานได้ทันทีด้วยคลิกเดียว ทำงาน 100% client-side ในเบราว์เซอร์ของคุณ ไม่ต้องสมัครสมาชิก ไม่มีการส่งข้อมูลออกไปไหน
ในคู่มือนี้เราจะพาไปดูว่าทำไมการออกแบบ easing แบบเห็นภาพถึงดีกว่าการเดาตัวเลข, แนะนำฟีเจอร์ทุกตัวของเครื่องมือ และเจาะลึก math ที่จำเป็นพอที่จะทำให้ตัวเลขสี่ตัวนั้นเลิกเป็นปริศนาไปตลอดกาล
ทำไมต้องใช้ Cubic Bezier Generator?
- มองเห็น curve แบบ real-time — การลาก control points แล้วเห็นรูปโค้งเปลี่ยนทันที ทำให้เข้าใจความสัมพันธ์ระหว่างตัวเลขกับ "ความรู้สึก" ของ animation ได้เร็วกว่าการแก้ตัวเลขแล้วรีเฟรชหน้าเว็บซ้ำ ๆ
- Preview animation สด ๆ — ลูกบอลเลื่อนไปตาม track พร้อมปุ่ม Replay และ Reset คุณเห็นว่า element จริงจะเคลื่อนที่อย่างไรกับ curve นี้ ไม่ต้องเขียนโค้ดทดสอบเอง
- เทียบกับ linear ได้ทันที — เส้นประทแยงมุมบนกราฟคือ linear (ความเร็วคงที่) ทำให้เห็นชัดว่า curve ของคุณต่างจาก "ไม่มี easing" อย่างไร
- Copy CSS ได้เลย — ได้ทั้ง cubic-bezier() สำหรับ transition-timing-function และ snippet เต็มอย่าง transition: transform 1s cubic-bezier(...) ไม่ต้องพิมพ์ตาม
- Presets ครบ 8 แบบ — linear, ease, ease-in, ease-out, ease-in-out, back-in, back-out และ snappy เป็นจุดเริ่มต้นที่ดีก่อนปรับแต่งเอง
- ฟรีและเป็นส่วนตัว 100% — ทุกอย่างประมวลผลในเบราว์เซอร์ (client-side) ไม่ต้องสมัคร ไม่ต้องติดตั้งอะไร
ฟีเจอร์เด่น
| ฟีเจอร์ | รายละเอียด |
|---|---|
| Interactive graph | ลาก control points P1, P2 บนกราฟเพื่อปรับรูปร่าง curve ได้ทันที |
| Presets 8 แบบ | linear, ease, ease-in, ease-out, ease-in-out, back-in, back-out, snappy |
| Numeric inputs | กรอกค่า x1, y1, x2, y2 แบบละเอียด step 0.01 สำหรับความแม่นยำ |
| Live preview | animation ตัวอย่างพร้อมปุ่ม Replay / Reset |
| Linear reference | เส้นประเทียบ linear บนกราฟ |
| CSS output | copy ค่า cubic-bezier() และ transition snippet พร้อมใช้ |
| SVG path export | ได้ path พิกัด normalized 0–1 เอาไปใช้กับ design tools ต่อได้ |
- ตัว solver ของกราฟใช้ Newton-Raphson พร้อม bisection fallback ในการหาค่าจาก parametric form ของ cubic bezier — แม่นยำและไม่พึ่ง library ภายนอกเลย
- ค่า x ของ control points ถูก clamp ไว้ระหว่าง 0–1 (ตาม spec ของ CSS) ส่วนค่า y ปล่อยให้เกิน 1 หรือติดลบได้ เพื่อสร้างเอฟเฟกต์ overshoot และ bounce
- ทุกอย่างทำงานบนเครื่องคุณล้วน ๆ ประหยัดเวลาและเป็นส่วนตัว
วิธีใช้งาน
- เปิด Cubic Bezier Generator แล้วเลือก preset ที่ใกล้เคียงความรู้สึกที่ต้องการ เช่น ease-out สำหรับการปรากฏตัวของ element
- ลาก control points บนกราฟ — P1 ควบคุมช่วงต้น (acceleration) และ P2 ควบคุมช่วงท้าย (deceleration) สังเกตรูปโค้งเปลี่ยนตามมือคุณ
- ดู live preview แล้วกด Replay ซ้ำ ๆ จนพอใจ — ถ้า curve ยังไม่ตรงใจ กลับไปปรับจุดลากต่อ หรือใช้ช่อง numeric input สำหรับค่าที่ละเอียดมาก ๆ
- เทียบกับเส้นประ linear เพื่อเช็คว่า easing ของคุณเพิ่มความนุ่มนวลจริงหรือแทบไม่ต่างจากไม่มี easing
- กด Copy เอาค่า cubic-bezier() ไปแปะใน CSS ของโปรเจกต์ได้เลย — หรือ copy SVG path ไปใช้ต่อใน design tools
เข้าใจ Cubic Bezier Easing
cubic-bezier(x1, y1, x2, y2) รับตัวเลขสี่ตัวที่กำหนดพฤติกรรมของ transition ระหว่างสถานะเริ่มต้นและสถานะสุดท้าย วิธีคิดที่ง่ายที่สุดคือ: x คือเวลา, y คือความคืบหน้า — กราฟทั้งใบเริ่มที่มุมซ้ายล่าง (เวลา 0, ความคืบหน้า 0) และจบที่มุมขวาบน (เวลา 1, ความคืบหน้า 1)
สอง control points ทำหน้าที่เหมือนแม่เหล็กดึงเส้นโค้ง:
- P1 (x1, y1) — กำหนดว่า animation เริ่มต้น อย่างไร ถ้า y1 ต่ำกว่าแนวทแยง แปลว่าช้าตอนต้น (ease-in สไตล์นั้น)
- P2 (x2, y2) — กำหนดว่า animation จบ อย่างไร ถ้า curve เอียงขึ้นแรงตอนท้ายแล้วคลี่ออก คือเร็วตอนกลางและเบรกตอนจบ (ease-out)
ข้อจำกัดตาม spec ของ CSS คือ x1 และ x2 ต้องอยู่ระหว่าง 0 ถึง 1 ตัวเครื่องมือจึง clamp ให้อัตโนมัติ แต่ y1 และ y2 เกิน 1 หรือติดลขได้ และนี่คือหัวใจของเอฟเฟกต์ขึ้นชื่อ:
- y > 1 ทำให้ความคืบหน้าเกินเป้าหมายแล้วย้อนกลับมา — นั่นคือ overshoot ที่ preset back-out ใช้ (cubic-bezier(0.34, 1.56, 0.64, 1))
- y < 0 ทำให้ animation เริ่มด้วยการถอยหลังก่อนเดินหน้า — ลักษณะ anticipation แบบ back-in
ส่วน keyword ที่คุ้นเคยก็แค่ cubic-bezier ที่ถูกตั้งค่ามาให้แล้ว: ease คือ cubic-bezier(0.25, 0.1, 0.25, 1), ease-in คือ cubic-bezier(0.42, 0, 1, 1), ease-out คือ cubic-bezier(0, 0, 0.58, 1) และ ease-in-out คือ cubic-bezier(0.42, 0, 0.58, 1) ส่วน linear ก็คือเส้นทแยงมุมบนกราฟนั่นเอง
เบื้องหลังการ render กราฟ เครื่องมือแก้สมการ parametric ของ cubic bezier x(t) = 3(1-t)²t·x1 + 3(1-t)t²·x2 + t³ ด้วย Newton-Raphson (มี bisection เป็นตัวเผื่อ) เพื่อ map ค่า x ทุกจุดกลับเป็น t แล้วหา y ที่ตรงกัน — นี่คือเหตุผลที่ preview ลื่นและแม่นแม้จะไม่ใช้ library ภายนอก
Use Cases ในงานจริง
Micro-interactions ของปุ่มและเมนูแบบ snappy
UI ที่ตอบสนองไวไม่ได้แปลว่าไม่มี easing แต่แปลว่า easing สั้นและฉับไว ลอง preset snappy (cubic-bezier(0.2, 0.8, 0.2, 1)) กับ hover ของปุ่มหรือการเปิด dropdown:
.menu-dropdown {
transition:
transform 0.2s cubic-bezier(0.2, 0.8, 0.2, 1),
opacity 0.2s cubic-bezier(0.2, 0.8, 0.2, 1);
}
ช่วงต้นที่วิ่งเร็วทำให้เมนู "กระโดด" ไปหาผู้ใช้ แล้วค่อยเบรกนุ่ม ๆ ตอนสุดท้าย รู้สึกทันทีแต่ไม่กระตุก
Page transitions และ content reveals
Content ที่ปรากฏขึ้นมาควรใช้ ease-out เพื่อให้เข้ามาเร็วแล้วสงบลง เช่น card ที่ fade + slide เข้ามาตอน scroll ถึง:
.reveal-card {
opacity: 0;
transform: translateY(24px);
transition:
opacity 0.5s cubic-bezier(0, 0, 0.58, 1),
transform 0.5s cubic-bezier(0, 0, 0.58, 1);
}
.reveal-card.visible {
opacity: 1;
transform: translateY(0);
}
เอฟเฟกต์ overshoot สำหรับ element ที่เล่นสนุก
ปุ่ม confirm ที่ scale ขึ้นเล็กน้อย, notification badge ที่เด้งเข้ามา หรือ FAB ที่โผล่จากมุมจอ — พวกมันล้วนอยากได้ back-out เพื่อให้รู้สึกมีพลัง:
.fab {
transition: transform 0.35s cubic-bezier(0.34, 1.56, 0.64, 1);
}
.fab:hover {
transform: scale(1.08);
}
ค่า y1 = 1.56 ทำให้ scale วิ่งเกิน 1.08 ไปนิดหน่อยแล้วเด้งกลับมาอยู่ที่เป้าหมายพอดี
จับคู่ motion curve จาก design tools
ทีม design มักกำหนด motion spec ใน Figma หรือ After Effects ซึ่งเป็น curve แบบเดียวกัน ใช้ SVG path export (พิกัด normalized 0–1) จากเครื่องมือเพื่อเทียบรูปโค้งกับ spec ฝั่ง design ได้โดยตรง แล้วส่งตัวเลขสี่ตัวกลับไปให้ทีม dev ใช้ร่วมกัน — design กับ code พูดภาษาเดียวกัน
Best Practices
- Duration สั้น ๆ อยู่กับคุณ — UI feedback ที่ดีมักอยู่ระหว่าง 150–400ms นานกว่านั้นเริ่มรู้สึกลาก สั้นกว่านั้น easing แทบไม่มีโอกาสโชว์ตัว
- อย่าดันค่า y เกิน ~1.5 — overshoot มาก ๆ ดูดีใน demo แต่ใน production มันทำให้ UI รู้สึกโยกเยกและวอกแวก
- จำสูตรง่าย ๆ — ease-out สำหรับสิ่งที่ เข้ามา (entrance), ease-in สำหรับสิ่งที่ ออกไป (exit), ease-in-out สำหรับการ เคลื่อนที่ระหว่าง state
- ทดสอบบนอุปกรณ์ราคาถูก — animation ที่ลื่นบนเครื่อง dev อาจกระตุกบนโทรศัพท์กลางคน ถ้าเป็น transform/opacity โดยไม่มี layout-heavy properties ก็มักปลอดภัย
- คุม curve ให้ consistent ต่อ product — เลือกชุด easing 2–3 ตัว (เช่น snappy สำหรับ UI เล็ก, back-out สำหรับจุดเด่น) แล้วใช้ทั่วทั้งแอป ความสม่ำเสมอคือสิ่งที่ทำให้ motion ดู "ถูกออกแบบ" ไม่ใช่ "ติดตั้งมา"
- อย่า ease ทุกอย่าง — บางการเปลี่ยนแปลง (เช่น สถานะ error หรือ spinner) ต้องการ linear หรือไม่มี transition เลย เพื่อความรู้สึกที่ตรงไปตรงมา
เริ่มออกแบบ Easing ของคุณวันนี้
ตัวเลขสี่ตัวใน cubic-bezier() ไม่ควรเป็นคาถาที่ต้องท่องจากเว็บอื่น ด้วย Cubic Bezier Generator คุณลาก ดู เทียบ แล้ว copy ได้ในไม่กี่วินาที — และเพราะทุกอย่างทำงาน client-side 100% ไม่มีค่าใช้จ่ายและไม่มีขั้นตอนสมัครสมาชิก ลองเล่นกับ preset snappy หรือดันค่า y เกิน 1 ดูสักตัว แล้วคุณจะเข้าใจทันทีว่าทำไม easing ที่ดีถึงเป็นความต่างระหว่างเว็บธรรมดากับเว็บที่รู้สึกมีชีวิต
Related Tools ที่คุณอาจชอบ
ขอให้สนุกกับการออกแบบ easing!