List/Grid View Toggle ให้ผู้ใช้เลือกมุมมองข้อมูล: List View (รายการแนวตั้ง) หรือ Grid View (การ์ดแนวนอน) ตัวอย่างนี้ใช้ JavaScript Toggle Class และ CSS Width เพื่อสลับ Layout
ตัวอย่างโค้ด
<!DOCTYPE html>
<html>
<head>
<style>
* { box-sizing: border-box; }
body { font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; }
.column {
float: left;
width: 50%;
padding: 10px;
color: white;
}
.row:after { content: ""; display: table; clear: both; }
.btn {
border: none; outline: none; padding: 12px 16px;
background-color: #f1f1f1; cursor: pointer;
}
.btn:hover { background-color: #ddd; }
.btn.active { background-color: #666; color: white; }
</style>
</head>
<body>
<h1>List Grid view example</h1>
<h2>Click on the below buttons to switch views</h2>
<div id="btnContainer">
<button class="btn" onclick="listView()">List</button>
<button class="btn active" onclick="gridView()">Grid</button>
</div>
<br />
<div class="row">
<div class="column" style="background-color:rgb(154, 9, 173);"><h2>Column 1</h2></div>
<div class="column" style="background-color:rgb(113, 35, 216);"><h2>Column 2</h2></div>
</div>
<div class="row">
<div class="column" style="background-color:rgb(19, 143, 85);"><h2>Column 3</h2></div>
<div class="column" style="background-color:rgb(207, 69, 27);"><h2>Column 4</h2></div>
</div>
<script>
var elements = document.querySelectorAll(".column");
function listView() {
Array.from(elements).forEach(item => { item.style.width = "100%"; });
Array.from(document.querySelectorAll(".btn")).forEach((item, index) => {
if (index === 0) item.classList.add("active");
else item.classList.remove("active");
});
}
function gridView() {
Array.from(elements).forEach(item => { item.style.width = "50%"; });
Array.from(document.querySelectorAll(".btn")).forEach((item, index) => {
if (index === 1) item.classList.add("active");
else item.classList.remove("active");
});
}
</script>
</body>
</html>
วิธีทำงาน
- HTML: ปุ่ม 2 ปุ่ม (List, Grid) + Container .row ที่มี .column 4 อัน
- CSS: .column เริ่มต้น width: 50% (Grid 2 คอลัมน์)
- JS listView(): ตั้ง width = 100% ทุก .column + Active ปุ่ม List
- JS gridView(): ตั้ง width = 50% ทุก .column + Active ปุ่ม Grid
Modern Approach: CSS Class Toggle (แยก Logic/Style)
.row { display: flex; flex-wrap: wrap; }
.column { flex: 1 1 45%; min-width: 300px; transition: flex-basis 0.3s; }
.row.list-view .column { flex-basis: 100%; min-width: 100%; }
JavaScript แบบ Cleaner
const container = document.querySelector('.row');
const buttons = document.querySelectorAll('.btn');
buttons.forEach(btn => {
btn.addEventListener('click', () => {
const view = btn.dataset.view; // 'list' or 'grid'
container.classList.toggle('list-view', view === 'list');
buttons.forEach(b => b.classList.toggle('active', b === btn));
});
});
HTML แบบ Semantic + Accessible
<div role="group" aria-label="View options">
<button class="btn" data-view="list" aria-pressed="false">
<svg aria-hidden="true">...list icon...</svg> List
</button>
<button class="btn active" data-view="grid" aria-pressed="true">
<svg aria-hidden="true">...grid icon...</svg> Grid
</button>
</div>
Enhancement: Save Preference to localStorage
// On load
const savedView = localStorage.getItem('viewMode') || 'grid';
container.classList.toggle('list-view', savedView === 'list');
updateButtons(savedView);
// On change
function setView(view) {
container.classList.toggle('list-view', view === 'list');
localStorage.setItem('viewMode', view);
updateButtons(view);
}
ใช้กับข้อมูลจริง (Dynamic Data)
<div class="row" id="products"> <!-- Render ด้วย JS จาก API --> </div>