Home » Vọc web » Cách làm nội dung ẩn hiện bằng javascript đơn giản
Cách làm nội dung ẩn hiện bằng javascript đơn giản

Bạn muốn làm một trang hướng dẫn chung về sử dụng website, diễn đàn,… Hoặc chẳng hạn một trang các câu hỏi thường gặp đi kèm câu trả lời. Thường thấy kiểu hướng dẫn này sẽ liệt kê những câu hỏi và ẩn các câu trả lời đi. Mục đích là để người dùng có thể lướt nhanh toàn bộ nội dung chính và chỉ nhấp vào nội dung chi tiết cần xem để mở chúng. Không cần xem nữa thì nhấp thêm một lần để ẩn (show hide). Chúng ta sẽ giải quyết vấn đề với chỉ một đoạn javascript và css kết hợp.

Minh họa ẩn hiện nội dung

1 Ẩn hiện show hide nội dung không có hiệu ứng trượt

Kiểu ẩn hiện show hide này sẽ mở hoặc đóng nhanh câu trả lời mà không cần thời gian di trượt.

.accordion {
  background-color: #eee;
  color: #444;
  cursor: pointer;
  padding: 18px;
  width: 100%;
  border: none;
  text-align: left;
  outline: none;
  font-size: 15px;
  transition: 0.4s;
  margin-bottom: 10px;
  width:600px;
}

.active, .accordion:hover {
  background-color: #ccc; 
}

.panel {
  padding: 0 18px;
  display: none;
  background-color: white;
  overflow: hidden;
  width:600px;
}
<h2>Hướng dẫn chung</h2>
<div class="accordion">Câu hỏi 1</div>
<div class="panel">
  <p>Câu trả lời 1 </p>
</div>

<div class="accordion">Câu hỏi 2</div>
<div class="panel">
  <p>Câu trả lời 2</p>
</div>
<div class="accordion">Câu hỏi 3</div>
<div class="panel">
  <p>Câu trả lời 3</p>
</div>
<div class="accordion">Câu hỏi 4</div>
<div class="panel">
  <p>Câu trả lời 4</p>
</div>
<script>
var acc = document.getElementsByClassName("accordion");
var i;

for (i = 0; i < acc.length; i++) {
  acc[i].addEventListener("click", function() {
    this.classList.toggle("active");
    var panel = this.nextElementSibling;
    if (panel.style.display === "block") {
      panel.style.display = "none";
    } else {
      panel.style.display = "block";
    }
  });
}
</script>

Ở phần HTML, chúng ta sẽ thay đổi nội dung trang thay cho Câu hỏi 1,2,3,4…Câu trả lời 1,2,3,4…
Chúng ta cũng có thể tạo thêm nhiều nội dung nữa bằng cách thêm mã HTML tương tự.
Phần CSS giúp ta tùy biến màu sắc, kích thước,… cho nội dung cần hiển thị.

2 Ẩn hiện show hide nội dung với hiệu ứng trượt

Gần như tương tự trường hợp 1, chỉ thay đổi một vài chỗ trong phần CSS và javascript. Phần HTML vẫn giữ nguyên.

Để thêm dấu + – khi ẩn hiện nội dung, chúng ta bổ sung thêm đoạn CSS sau. Phần sau content chính là mã HTML của dấu + -, chúng ta có thể thay bằng ký hiệu khác nếu muốn.

.accordion:after {
  content: '\002B';
  color: #777;
  font-weight: bold;
  float: right;
  margin-left: 5px;
}

.active:after {
  content: "\2212";
}

Mã đầy đủ sẽ như sau.

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
.accordion {
  background-color: #eee;
  color: #444;
  cursor: pointer;
  padding: 18px;
  width: 100%;
  border: none;
  text-align: left;
  outline: none;
  font-size: 15px;
  transition: 0.4s;
  margin-bottom: 10px;
  width:600px;
}

.active, .accordion:hover {
  background-color: #ccc; 
}
.accordion:after {
  content: '\002B';
  color: #777;
  font-weight: bold;
  float: right;
  margin-left: 5px;
}

.active:after {
  content: "\2212";
}
.panel {
  padding: 0 18px;
  max-height: 0;
  background-color: white;
  overflow: hidden;
  width:600px;
    transition: max-height 0.2s ease-out;
}
</style>
</head>
<body>

<h2>Hướng dẫn chung</h2>

<div class="accordion">Câu hỏi 1</div>
<div class="panel">
  <p>Câu trả lời 1</p>
</div>

<div class="accordion">Câu hỏi 2</div>
<div class="panel">
  <p>Câu trả lời 2</p>
</div>
<div class="accordion">Câu hỏi 3</div>
<div class="panel">
  <p>Câu trả lời 3</p>
</div>
<div class="accordion">Câu hỏi 4</div>
<div class="panel">
  <p>Câu trả lời 4</p>
</div>

<script>
var acc = document.getElementsByClassName("accordion");
var i;

for (i = 0; i < acc.length; i++) {
  acc[i].addEventListener("click", function() {
    this.classList.toggle("active");
    var panel = this.nextElementSibling;
    if (panel.style.maxHeight) {
      panel.style.maxHeight = null;
    } else {
      panel.style.maxHeight = panel.scrollHeight + "px";
    } 
  });
}
</script>

</body>
</html>

Kết quả sẽ được như bên dưới

Hướng dẫn chung

Câu hỏi 1

Câu trả lời 1

Câu hỏi 2

Câu trả lời 2

Câu hỏi 3

Câu trả lời 3

Câu hỏi 4

Câu trả lời 4

Vậy là chúng ta đã có một bảng hướng dẫn cho người dùng. Rất nhẹ nhàng, đơn giản mà không cần plugin hay dịch vụ nào hỗ trợ. Chúc các bạn thành công và hãy để lại bình luận bên dưới nếu gặp bất kỳ trở ngại nào.

Xem thêm: Tạo mục lục thủ công cho bài viết không cần plugin


Trả lời

Email được bảo mật. Dấu * là bắt buộc