1. ความเข้าใจเกี่ยวกับ Modal ใน Alpine.js
Modal เป็นหน้าต่างป็อปอัพที่ปรากฏบนหน้าเว็บเพื่อแสดงข้อมูลเพิ่มเติม, การแจ้งเตือน, หรือฟอร์ม
- ใน Alpine.js สามารถสร้าง Modal ได้ง่ายด้วย
x-show
และ Transition - ใช้ร่วมกับ State เพื่อควบคุมการเปิด/ปิด Modal
2. การสร้าง Modal เบื้องต้น
ตัวอย่าง 1: Modal เปิด/ปิดด้วยปุ่ม
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | < div x-data = "{ isOpen: false }" > <!-- ปุ่มเปิด Modal --> < button @ click = "isOpen = true" class = "px-4 py-2 bg-blue-500 text-white rounded" >Open Modal</ button > <!-- Modal --> < div x-show = "isOpen" class = "fixed inset-0 flex items-center justify-center bg-black bg-opacity-50" @ click.away = "isOpen = false" x-transition> < div class = "bg-white p-6 rounded shadow-lg" > < h2 class = "text-lg font-bold mb-4" >Modal Title</ h2 > < p class = "text-gray-700" >This is a simple modal.</ p > < button @ click = "isOpen = false" class = "mt-4 px-4 py-2 bg-red-500 text-white rounded" >Close</ button > </ div > </ div > </ div > |
คำอธิบาย:
x-show="isOpen"
ควบคุมการแสดง/ซ่อน Modal@click.away="isOpen = false"
ปิด Modal เมื่อคลิกนอกพื้นที่ Modalx-transition
เพิ่มเอฟเฟกต์การแสดงผล
3. การเพิ่ม Transition ใน Modal
ตัวอย่าง 2: Modal พร้อม Animation
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | < div x-data = "{ isOpen: false }" > < button @ click = "isOpen = true" class = "px-4 py-2 bg-blue-500 text-white rounded" >Open Modal</ button > < div x-show = "isOpen" class = "fixed inset-0 flex items-center justify-center bg-black bg-opacity-50" @ click.away = "isOpen = false" x-transition:enter = "transition ease-out duration-300" x-transition:enter-start = "opacity-0 scale-90" x-transition:enter-end = "opacity-100 scale-100" x-transition:leave = "transition ease-in duration-200" x-transition:leave-start = "opacity-100 scale-100" x-transition:leave-end = "opacity-0 scale-90" > < div class = "bg-white p-6 rounded shadow-lg" > < h2 class = "text-lg font-bold mb-4" >Animated Modal</ h2 > < p class = "text-gray-700" >This modal has transitions!</ p > < button @ click = "isOpen = false" class = "mt-4 px-4 py-2 bg-red-500 text-white rounded" >Close</ button > </ div > </ div > </ div > |
คำอธิบาย:
x-transition:enter
และx-transition:leave
ใช้เพิ่ม Animation เมื่อ Modal แสดงและซ่อน- การเปลี่ยนแปลงขนาดและความโปร่งใส (
scale
,opacity
) ช่วยเพิ่มความน่าสนใจ
4. การใช้ Slot ใน Modal
ตัวอย่าง 3: Modal พร้อม Slot
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | < template id = "modal-template" > < div x-show = "isOpen" class = "fixed inset-0 flex items-center justify-center bg-black bg-opacity-50" @ click.away = "isOpen = false" x-transition> < div class = "bg-white p-6 rounded shadow-lg" > < slot ></ slot > < button @ click = "isOpen = false" class = "mt-4 px-4 py-2 bg-red-500 text-white rounded" >Close</ button > </ div > </ div > </ template > < div x-data = "{ isOpen: false }" > < button @ click = "isOpen = true" class = "px-4 py-2 bg-blue-500 text-white rounded" >Open Modal</ button > < div x-init = "$el.innerHTML = document.getElementById('modal-template').innerHTML" > < h2 class = "text-lg font-bold mb-4" >Custom Content</ h2 > < p class = "text-gray-700" >This content is passed to the slot.</ p > </ div > </ div > |
คำอธิบาย:
- ใช้
<slot>
เพื่อเพิ่มความยืดหยุ่นในเนื้อหา Modal - Component นี้สามารถใช้ซ้ำและปรับเนื้อหาได้ง่าย
5. การสร้าง Modal แบบ Dynamic
ตัวอย่าง 4: Dynamic Modal พร้อมข้อมูล
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | < div x-data = "{ isOpen: false, modalContent: '' }" > < button @ click = "isOpen = true; modalContent = 'Dynamic Modal Content';" class = "px-4 py-2 bg-blue-500 text-white rounded" > Open Modal </ button > < div x-show = "isOpen" class = "fixed inset-0 flex items-center justify-center bg-black bg-opacity-50" @ click.away = "isOpen = false" x-transition> < div class = "bg-white p-6 rounded shadow-lg" > < h2 class = "text-lg font-bold mb-4" >Dynamic Modal</ h2 > < p class = "text-gray-700" x-text = "modalContent" ></ p > < button @ click = "isOpen = false" class = "mt-4 px-4 py-2 bg-red-500 text-white rounded" >Close</ button > </ div > </ div > </ div > |
คำอธิบาย:
- ใช้ State
modalContent
เพื่อแสดงข้อความที่เปลี่ยนแปลงได้ใน Modal - ปรับเนื้อหา Modal ได้แบบ Dynamic โดยใช้ Event
6. การสร้าง Modal ที่ซับซ้อน
ตัวอย่าง 5: Modal พร้อมฟอร์ม
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | < div x-data = "{ isOpen: false, formData: { name: '', email: '' } }" > < button @ click = "isOpen = true" class = "px-4 py-2 bg-blue-500 text-white rounded" >Open Form Modal</ button > < div x-show = "isOpen" class = "fixed inset-0 flex items-center justify-center bg-black bg-opacity-50" @ click.away = "isOpen = false" x-transition> < div class = "bg-white p-6 rounded shadow-lg" > < h2 class = "text-lg font-bold mb-4" >Form Modal</ h2 > < form @ submit.prevent = "alert(`Name: ${formData.name}, Email: ${formData.email}`)" > < label class = "block mb-2" > Name: < input type = "text" x-model = "formData.name" class = "w-full p-2 border rounded" > </ label > < label class = "block mb-2" > Email: < input type = "email" x-model = "formData.email" class = "w-full p-2 border rounded" > </ label > < button type = "submit" class = "mt-4 px-4 py-2 bg-green-500 text-white rounded" >Submit</ button > </ form > < button @ click = "isOpen = false" class = "mt-4 px-4 py-2 bg-red-500 text-white rounded" >Close</ button > </ div > </ div > </ div > |
คำอธิบาย:
- Modal นี้รองรับการใช้งานฟอร์มพร้อมฟังก์ชันส่งข้อมูล
- ใช้
x-model
เพื่อจัดการ State ของข้อมูลในฟอร์ม
สรุป
ในบทนี้ คุณได้เรียนรู้การสร้าง Modal ด้วย Alpine.js โดยใช้ x-show
, Transition, และ Slot ตัวอย่างครอบคลุม Modal แบบพื้นฐาน, Dynamic Modal, และ Modal พร้อมฟอร์ม การสร้าง Modal ด้วย Alpine.js ช่วยเพิ่มความสามารถในการโต้ตอบของเว็บได้อย่างง่ายดายและยืดหยุ่น!