🔍 บทนำ
ในการพัฒนาเว็บแอปพลิเคชันหรือระบบรายงาน เช่น ใบเสร็จ, ใบเสนอราคา หรือแบบฟอร์ม มักจะมีความต้องการ “พิมพ์เฉพาะส่วน” ของหน้าเว็บ ไม่ใช่ทั้งหน้า เพื่อความสะดวกและลดความยุ่งยากในการตัดต่อข้อมูลหลังพิมพ์
ในบทความนี้ เราจะเรียนรู้วิธีการสั่งพิมพ์เฉพาะ <div> ที่ต้องการ โดยไม่ต้องรีโหลดหน้า พร้อมตัวอย่างโค้ด HTML, CSS และ JavaScript ที่ใช้งานได้จริง
🎯 เป้าหมาย
- พิมพ์เฉพาะส่วน
<div>ที่กำหนด - ป้องกันหน้าว่าง หรือเนื้อหาซ้อนกันขณะพิมพ์
- ไม่ต้องเปิดหน้าใหม่ หรือโหลดใหม่
- รองรับการพิมพ์หลายส่วนต่อเนื่อง
🛠 แนวคิดเบื้องหลัง
- ใช้ CSS
@media printเพื่อควบคุมสิ่งที่จะแสดงเฉพาะตอนสั่งพิมพ์ - ใช้ JavaScript เพื่อเพิ่ม/ลบคลาส
.print-targetให้กับ<div>ที่ต้องการพิมพ์ - ใช้
display: noneซ่อนองค์ประกอบอื่น - ใช้
page-break-beforeเพื่อควบคุมการแบ่งหน้า (เมื่อพิมพ์หลายส่วน)
✅ ตัวอย่างโค้ดสมบูรณ์
ใส่ลายน้ำเป็นพื้นหลัง
ต้องเปิด "Print Background Graphics" ในหน้าต่าง Print ด้วย
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>พิมพ์เฉพาะ DIV โดยไม่รีโหลด</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
@import url('https://fonts.googleapis.com/css2?family=Sriracha&display=swap');
* {
font-family: "Sriracha", cursive;
}
.section {
border: 1px solid #ccc;
margin-bottom: 1em;
padding: 1em;
background-color: white;
}
@media print {
/* ซ่อนทุกอย่างใน container ยกเว้น .print-target */
.container > *:not(.print-target) {
display: none !important;
}
.print-target,
.print-target * {
display: revert !important;
}
.print-target {
width: 100%;
page-break-before: always;
position: relative;
/* ✅ ลายน้ำแบบ background image */
background-image: url('https://semicon.github.io/img/web/logoxxx.png');
background-repeat: no-repeat;
background-position: center;
background-size: 300px auto;
background-attachment: local;
}
.print-target:first-of-type {
page-break-before: auto;
}
}
</style>
</head>
<body>
<div class="container mt-4">
<!-- Section 1 -->
<div class="section" id="printableArea1">
<h2>เนื้อหาที่ต้องการพิมพ์ 1</h2>
<p>เฉพาะส่วนนี้จะถูกพิมพ์</p>
</div>
<button class="btn btn-primary mb-3" onclick="printOnly('printableArea1')">พิมพ์ส่วนนี้</button>
<!-- Section 2 -->
<div class="section" id="printableArea2">
<h2>เนื้อหาที่ต้องการพิมพ์ 2</h2>
<p>เฉพาะส่วนนี้จะถูกพิมพ์</p>
</div>
<button class="btn btn-dark mb-3" onclick="printOnly('printableArea2')">พิมพ์ส่วนนี้</button>
<!-- Section 3 -->
<div class="section" id="printableArea3">
<h2>เนื้อหาที่ต้องการพิมพ์ 3</h2>
<p>เฉพาะส่วนนี้จะถูกพิมพ์</p>
</div>
<button class="btn btn-success mb-3" onclick="printOnly('printableArea3')">พิมพ์ส่วนนี้</button>
<!-- Print all -->
<div class="mt-4">
<button class="btn btn-danger" onclick="printAll()">พิมพ์ทั้งหมด</button>
</div>
</div>
<script>
function clearAllPrintTargets() {
document.querySelectorAll('.print-target').forEach(el => el.classList.remove('print-target'));
}
function printOnly(divId) {
clearAllPrintTargets();
const el = document.getElementById(divId);
if (el) el.classList.add('print-target');
window.print();
}
function printAll() {
clearAllPrintTargets();
document.querySelectorAll('#printableArea1, #printableArea2, #printableArea3').forEach(el => {
el.classList.add('print-target');
});
window.print();
}
</script>
</body>
</html>
💡 เคล็ดลับเพิ่มเติม
- หากต้องการพิมพ์พร้อมโลโก้บริษัท / หัวกระดาษ → ใส่ภายใน
.print-targetด้วย - หากต้องการซ่อนไฟล์ JavaScript หรือปุ่มเฉพาะตอนพิมพ์ ให้ใช้:
✅ สรุป
การพิมพ์เฉพาะบางส่วนของหน้าเว็บเป็นสิ่งที่ทำได้ง่ายมากด้วยการผสมผสานของ CSS และ JavaScript โดยไม่ต้องเปลี่ยนหน้า ไม่ต้องเปิดแท็บใหม่ และสามารถควบคุมรูปแบบการพิมพ์ได้เต็มที่
คุณสามารถนำโค้ดนี้ไปปรับใช้กับระบบของคุณ เช่น ระบบรายงาน, ระบบออกใบเสร็จ, หรือหน้าแบบฟอร์มที่ต้องการพิมพ์เฉพาะส่วนได้ทันที
