content #3

#พื้นฐานการเขียนเว็ปไซต์

#appscript

#google

1. โครงสร้าง HTML (The HTML Structure)

ขั้นแรกสร้างโครงสร้างพื้นฐานในไฟล์ HTML ของคุณ โดยประกอบด้วย 2 ส่วนหลักๆ คือ ปุ่มสำหรับเปิด/ปิด และ ตัวกล่อง Modal เอง

HTML

<div class="toggle-container">

<input type="checkbox" id="modal-toggle" class="modal-toggle">

<label for="modal-toggle" class="toggle-button">

เปิด Modal

</label>

<div class="modal">

<div class="modal-content">

<label for="modal-toggle" class="close-button">

&times;

</label>

<h2>นี่คือ Modal ของคุณ</h2>

<p>คุณสามารถใส่เนื้อหาอะไรก็ได้ที่นี่...</p>

</div>

</div>

</div>

• <input type="checkbox"> : นี่คือ กุญแจสำคัญ ของเทคนิคนี้ เราจะใช้สถานะ checked หรือ unchecked ของ Checkbox เป็นตัวควบคุมการแสดงผลของ Modal

• <label> : ใช้สำหรับเชื่อมต่อกับ input โดยใช้แอตทริบิวต์ for ที่มีค่าตรงกับ id ของ input เมื่อคลิกที่ <label> จะทำให้ Checkbox ถูก checked หรือ unchecked

• <div class="modal"> : คือตัวกล่อง Modal ที่เราจะซ่อนไว้ตอนแรก

2. การจัดการ CSS (The CSS Magic)

ในส่วนของ CSS เราจะใช้ตัวเลือกแบบพิเศษ (pseudo-classes) และตัวเลือกแบบ sibling combinator เพื่อควบคุมการแสดงผลของ Modal

CSS

/* ซ่อน Checkbox จริงๆ ไว้ */

.modal-toggle {

display: none;

}

/* ตั้งค่าเริ่มต้นของ Modal ให้ซ่อนอยู่ */

.modal {

visibility: hidden;

opacity: 0;

transition: visibility 0s, opacity 0.5s; /* ทำให้เกิดเอฟเฟกต์ Fade-in/out */

position: fixed;

top: 0;

left: 0;

width: 100%;

height: 100%;

background-color: rgba(0, 0, 0, 0.5); /* พื้นหลังทึบแสง */

display: flex;

justify-content: center;

align-items: center;

}

/* เมื่อ Checkbox ถูกเลือก (checked) ให้แสดง Modal */

.modal-toggle:checked ~ .modal {

visibility: visible;

opacity: 1;

}

/* ตกแต่งส่วนอื่นๆ ตามต้องการ */

.modal-content {

background-color: #fff ;

padding: 20px;

border-radius: 8px;

width: 80%;

max-width: 500px;

position: relative;

transform: translateY(-20px);

transition: transform 0.5s ease-out;

}

.modal-toggle:checked ~ .modal .modal-content {

transform: translateY(0);

}

.close-button {

position: absolute;

top: 10px;

right: 15px;

font-size: 24px;

cursor: pointer;

color: #aaa ;

}

.toggle-button {

cursor: pointer;

padding: 10px 20px;

background-color: #007bff ;

color: white;

border-radius: 5px;

text-decoration: none;

display: inline-block;

}

• .modal-toggle:checked : นี่คือ หัวใจ ของกลไกทั้งหมด เมื่อ Checkbox ถูกคลิกจนมีสถานะ checked

• ~ (General Sibling Combinator) : ตัวเลือกนี้จะเลือกองค์ประกอบ .modal ที่อยู่ ถัดจาก องค์ประกอบ .modal-toggle:checked ในระดับเดียวกัน

• visibility: visible; และ opacity: 1; : เมื่อเงื่อนไขด้านบนเป็นจริง เราจะเปลี่ยนคุณสมบัติเหล่านี้เพื่อทำให้ Modal ที่ซ่อนอยู่แสดงขึ้นมา

สรุปการทำงาน

เมื่อผู้ใช้คลิกที่ปุ่ม "เปิด Modal" ซึ่งจริงๆ แล้วคือ <label> จะทำให้ <input type="checkbox" id="modal-toggle"> เปลี่ยนสถานะเป็น checked เมื่อ <input> มีสถานะ checked จะเกิดการทำงานของ CSS Selector .modal-toggle:checked ~ .modal ทำให้ Modal ที่เคยถูกซ่อนไว้ปรากฏขึ้น เมื่อคลิกที่ปุ่ม "×" (ปุ่มปิด) ซึ่งเป็น <label> ที่ชี้กลับไปที่ <input> อีกครั้ง ก็จะทำให้ <input> เปลี่ยนสถานะกลับเป็น unchecked ทำให้ Modal ซ่อนลงไปอีกครั้ง

2025/9/23 แก้ไขแล้ว

... อ่านเพิ่มเติมถ้าคุณกำลังหา “modal web” ที่ทำงานได้แบบเบาๆ ไม่ต้องเขียน JavaScript วิธี checkbox + label เป็นทริคที่ใช้ได้จริง โดยหลักคือให้ <input type="checkbox"> เป็นตัวเก็บสถานะเปิด/ปิด แล้วใช้ CSS selector :checked ไปสั่งให้กล่อง modal โผล่ขึ้นมา ทริคที่ผมเจอบ่อยว่าคนพลาดคือ “ตำแหน่งของโครงสร้าง HTML” เพราะ selector แบบ .modal-toggle:checked ~ .modal จะทำงานก็ต่อเมื่อ .modal อยู่ “ถัดจาก” input และอยู่ระดับเดียวกัน (เป็น sibling กัน) ถ้าเผลอเอา .modal ไปอยู่คนละชั้น เช่นถูกครอบด้วย div อีกชั้น selector จะไม่ติด วิธีเช็กง่ายๆ คือเปิด DevTools แล้วดูว่ากล่อง .modal อยู่หลัง input จริงไหม อีกจุดที่ควรปรับเพื่อให้ใช้งานดีขึ้นคือเรื่องการคลิกพื้นที่มืดเพื่อปิด modal (overlay close) ผมมักทำให้พื้นหลังทึบแสงเป็น label ที่ชี้กลับไปที่ checkbox เหมือนปุ่มปิด เช่นทำโครงสร้างเป็น <label for="modal-toggle" class="modal"> แล้วค่อยมี <div class="modal-content"> อยู่ข้างใน จากนั้นต้องกันไม่ให้คลิกในกล่องแล้วปิดโดยไม่ตั้งใจ ด้วยการใส่ pointer-events หรือหยุดการคลิกที่ content (ถ้าไม่ใช้ JS วิธีง่ายคือทำให้ modal-content ไม่ใช่ label) เรื่องเอฟเฟกต์แนะนำให้ใช้คู่กัน 2 อย่าง: opacity + transform จะให้ความรู้สึกลื่นกว่าใช้ opacity อย่างเดียว เช่นตอนเปิดให้ .modal-content เลื่อนขึ้นนิดๆ (translateY) แล้วค่อยกลับเป็น 0 พร้อม transition ส่วน visibility ช่วยกันการกดคลิกโดนของด้านหลังตอน modal ซ่อนอยู่ ตัวอย่างสั้นๆ ที่ผมใช้บ่อย: - ซ่อน checkbox: display:none; - modal overlay: position:fixed; inset:0; background:rgba(0,0,0,.5); display:flex; align-items:center; justify-content:center; - สถานะปิด: opacity:0; visibility:hidden; - สถานะเปิด: .modal-toggle:checked ~ .modal {opacity:1; visibility:visible;} สุดท้ายถ้าตั้งใจทำให้รองรับการใช้งานจริงมากขึ้น (UX) ผมแนะนำเพิ่มรายละเอียดเล็กๆ เช่น 1) ตั้ง max-width ให้กล่อง เช่น 500px และใส่ padding ให้พอดี 2) ถ้าเนื้อหายาวให้กล่องเลื่อนเอง: max-height: 80vh; overflow:auto; 3) ใส่ focus style ให้ปุ่มเปิด/ปิดเพื่อคนใช้คีย์บอร์ด (ถึงจะไม่ใช้ JS ก็ทำได้บางส่วน) โดยรวมวิธีนี้เหมาะกับ modal ง่ายๆ เช่น กล่องแจ้งเตือน, แสดงรายละเอียดสินค้า, หรือ popup ฟอร์มสั้นๆ บนเว็บ เพราะโค้ดน้อย โหลดไว และคอนเซ็ปต์ตรงกับการค้นหาแนว “modal web” ที่อยากได้ตัวอย่างพร้อมใช้งานครับ