เนื้อหาต่อไปนี้ จะเป็นแนวทางการใช้งาน checkbox และ radio ซึ่งเป็น element ส่วนหนึ่งของ form โดยเราจะมาดู
แนวทางการใช้งานร่วมกับ jquery ในรูปแบบต่างๆ
ในที่นี้สมมติเรากำหนดชุดข้อมูล เป็นค่าตายตัว เป็นตัวแปร $arr_size แล้วจะทำการวนลูปเพื่อสร้างชุด checkbox
elemenet ที่มีค่าต่างๆ ตามโค้ดด้านล่าง
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <title>Document</title> <link rel="stylesheet" href="https://unpkg.com/bootstrap@4.1.0/dist/css/bootstrap.min.css" > </head> <body> <br> <br> <?php $arr_size = array( "1"=>"Size XS", "2"=>"Size S", "3"=>"Size M", "4"=>"Size L", "5"=>"Size XL", "6"=>"Size XXL", ); ?> <div class="containe mx-auto" style="width:500px;"> <?php foreach($arr_size as $k=>$v){ // วนลูปข้อมูล array ใช้งานค่า key และ value ?> <input type="checkbox" name="chk_size" id="chk_size_<?=$k?>" value="<?=$k?>"> <label for="chk_size_<?=$k?>"><?=$v?></label> <br> <?php } ?> </div> <script src="https://unpkg.com/jquery@3.3.1/dist/jquery.min.js"></script> <script type="text/javascript"> $(function(){ }); </script> </body> </html>
จากโค้ด เรากำหนด id สำหรับ input checkbox แต่ละตัว ด้วย chk_size_<?=$k?> ให้มีค่าเท่ากับ for ของ
label เพื่อให้ทั้งสอง element สัมพันธ์กัน โดยที่ เราสามารถเลือกที่กด check ที่ตัวข้อความแทนการกดที่ตัว checkbox
โดยตรงได้
เราสามารถกำหนด css class ให้กับ label เพื่อเปลี่ยน cursor ให้เป็นรูป มือ เพื่อให้ผู้ใช้สังเกตหรือเข้าใจได้ว่า สามารถ
กดเลือก checkbox ผ่านตัว label ได้
<style type="text/css"> .label_chk_size{ cursor:pointer; } </style>
<label for="chk_size_<?=$k?>" class="label_chk_size"><?=$v?></label>
ต่อไป สมมติเราให้แต่ละ checkbox และ label อยู่ใน div อีกที จะได้เป็น
<style type="text/css"> .label_chk_size{ cursor:pointer; background-color:#ffeae0; } .chk_size_wrap{ background-color:#f5d9cc; } </style> <?php $arr_size = array( "1"=>"Size XS", "2"=>"Size S", "3"=>"Size M", "4"=>"Size L", "5"=>"Size XL", "6"=>"Size XXL", ); ?> <div class="containe mx-auto" style="width:500px;"> <?php foreach($arr_size as $k=>$v){ ?> <div class="chk_size_wrap"> <input type="checkbox" name="chk_size" id="chk_size_<?=$k?>" value="<?=$k?>"> <label for="chk_size_<?=$k?>" class="label_chk_size"><?=$v?></label> </div> <?php } ?> </div>
ผลลัพธ์ที่ได้ จะเห็นว่าตัว label จะมีขนาดความกว้าง ตามขนาดของข้อมูลที่แสดง ไม่เท่ากัน ในขณะที่ div
ที่เรานำมาคลุม นั้นจะกลางเท่ากันหมด
ต่อไปเราลองให้ checkbox อยู่ใน label และกำหนด style display ของ label เป็น block จะได้เป็น
<style type="text/css"> .label_chk_size{ cursor:pointer; background-color:#ffeae0; display:block; } .chk_size_wrap{ background-color:#f5d9cc; } </style> <?php $arr_size = array( "1"=>"Size XS", "2"=>"Size S", "3"=>"Size M", "4"=>"Size L", "5"=>"Size XL", "6"=>"Size XXL", ); ?> <div class="containe mx-auto" style="width:500px;"> <?php foreach($arr_size as $k=>$v){ ?> <label for="chk_size_<?=$k?>" class="label_chk_size"> <input type="checkbox" name="chk_size" id="chk_size_<?=$k?>" value="<?=$k?>"> <?=$v?> </label> <?php } ?> </div>
ตอนนี้ เราสามารถกดส่วนไหนของ label เพื่อเลือก checkbox ได้ง่ายขึ้น เพราะขนาดความกว้างของ label เท่ากัน
ต่อไปเราจะสร้างความแตกต่าง โดยกำหนด highlight ให้กับ label เมื่อเลื่อนเมาส์อยู่เหนือรายการใดๆ ด้วยการกำหนด
css style ดังนี้
<style type="text/css"> .label_chk_size{ cursor:pointer; background-color:#ffeae0; display:block; margin-bottom:2px; } .label_chk_size:hover{ background-color:#f5d9cc; } .chk_size_wrap{ background-color:#f5d9cc; } </style>
เมื่อเคลื่อนเมาส์เหนือ รายการ label ใดๆ ก็จะทำการ highlight ทำให้เราสังเกตถึงตัวเลือกที่กำลังจะเลือกได้ง่ายขึ้น
ทีนี้ ถ้าเราเลือกรายการใดๆ อยากให้ทำการ highlight รายการนั้นๆ ให้เด่นขึ้นมาอีก ส่วนนี้ เราจำเป็นต้องใช้งาน
jquery เข้ามาช่วย โดยแนวทางคือ เราจะสร้าง css class สำหรับกรณี label ที่มี checkbox ถูกติ้กเลือก แล้วจะใช้
jquery ในการตรวจสอบและกำหนดค่าการ highlight ตามเงื่อนไขการ checked
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <title>Document</title> <link rel="stylesheet" href="https://unpkg.com/bootstrap@4.1.0/dist/css/bootstrap.min.css" > </head> <body> <br> <br> <style type="text/css"> .label_chk_size{ cursor:pointer; background-color:#ffeae0; display:block; margin-bottom:2px; } .label_chk_size.is_checked, .label_chk_size:hover.is_checked{ background-color:#fbbea1; } .label_chk_size:hover{ background-color:#f5d9cc; } .chk_size_wrap{ background-color:#f5d9cc; } </style> <?php $arr_size = array( "1"=>"Size XS", "2"=>"Size S", "3"=>"Size M", "4"=>"Size L", "5"=>"Size XL", "6"=>"Size XXL", ); ?> <div class="containe mx-auto" style="width:500px;"> <?php foreach($arr_size as $k=>$v){ ?> <label for="chk_size_<?=$k?>" class="label_chk_size"> <input type="checkbox" name="chk_size" id="chk_size_<?=$k?>" value="<?=$k?>"> <?=$v?> </label> <?php } ?> </div> <script src="https://unpkg.com/jquery@3.3.1/dist/jquery.min.js"></script> <script type="text/javascript"> $(function(){ $(".label_chk_size").on("click",function(){ $(this).has(":checkbox:checked").addClass("is_checked"); $(this).has(":checkbox:not(:checked)").removeClass("is_checked"); }); }); </script> </body> </html>
เราสามารถซ่อน input checkbox โดยกำหนด css เพิ่มเติมเป็นดังนี้
.label_chk_size input{ visibility:hidden; }
เราสามารถประยุกต์เพิ่มเติมกับ font-awesome เพื่อใช้งาน icon check | check-square | check-circle
โดย icon จะแสดงชัดขึ้นเมื่อรายการนั้นถูกเลือก แนวทางคือ ให้เราเพิ่ม
<i class="far fa-check-square"></i>
แทรกเข้าไปต่อจาก input checkbox
จะได้เป็น
<div class="containe mx-auto" style="width:500px;"> <?php foreach($arr_size as $k=>$v){ ?> <label for="chk_size_<?=$k?>" class="label_chk_size"> <input type="checkbox" name="chk_size" id="chk_size_<?=$k?>" value="<?=$k?>"> <i class="far fa-check-square"></i> <?=$v?> </label> <?php } ?> </div>
ปรับส่วนของ jquery
<script type="text/javascript"> $(function(){ $(".label_chk_size").on("click",function(){ $(this).has(":checkbox:checked").addClass("is_checked").find("i").addClass("fas"); $(this).has(":checkbox:not(:checked)").removeClass("is_checked").find("i").removeClass("fas");; }); }); </script>โค้ดทั้งหมด
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <title>Document</title> <link rel="stylesheet" href="https://unpkg.com/bootstrap@4.1.0/dist/css/bootstrap.min.css" > <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.7/css/all.css"> </head> <body> <br> <br> <style type="text/css"> .label_chk_size{ cursor:pointer; background-color:#ffeae0; display:block; margin-bottom:2px; } .label_chk_size.is_checked, .label_chk_size:hover.is_checked{ background-color:#fbbea1; } .label_chk_size:hover{ background-color:#f5d9cc; } .label_chk_size input{ visibility:hidden; } .chk_size_wrap{ background-color:#f5d9cc; } </style> <?php $arr_size = array( "1"=>"Size XS", "2"=>"Size S", "3"=>"Size M", "4"=>"Size L", "5"=>"Size XL", "6"=>"Size XXL", ); ?> <div class="containe mx-auto" style="width:500px;"> <?php foreach($arr_size as $k=>$v){ ?> <label for="chk_size_<?=$k?>" class="label_chk_size"> <input type="checkbox" name="chk_size" id="chk_size_<?=$k?>" value="<?=$k?>"> <i class="far fa-check-square"></i> <?=$v?> </label> <?php } ?> </div> <script src="https://unpkg.com/jquery@3.3.1/dist/jquery.min.js"></script> <script type="text/javascript"> $(function(){ $(".label_chk_size").on("click",function(){ $(this).has(":checkbox:checked").addClass("is_checked").find("i").addClass("fas"); $(this).has(":checkbox:not(:checked)").removeClass("is_checked").find("i").removeClass("fas");; }); }); </script> </body> </html>
สังเกตว่า ใน font-awesome css class ที่ชื่อ fas จะเป็นตัวพื้นหลังเข็ม ส่วน far จะเป็นตัวพื้นหลังจาง รูปแบบการ
ทำงาน ให้หา i ที่อยู่ใน label แล้วเปลี่ยน icon เป็นพื้นหลังเข็มใน checkbox ที่ถูกเลือก และเปลี่ยน icon เป็นตัว
พื้นจาง เมื่อ checkbox ยกเลิกการเลือก