Cách thêm mục lục tự động bên dưới dấu ngắt nhảy của bài viết

Những Blog chuyên viết về thủ thuật, nhật ký,..., có bài viết với nội dung dài nên sử dụng mục lục để giúp điều hướng nhanh đến mục muốn xem khi click chuột vào mục đó. Tương tự như sách, văn bản, thuyết trình,..., phải có mục lục đầu trang thì trong bài viết cũng vậy nhưng đơn giản hơn vì bài viết bị giới hạn từ nên chỉ cần chia thành những mục chính cũng đủ đáp ứng yêu cầu.

Khi soạn thảo bài viết sau vài đoạn giới thiệu đầu dòng thường sử dụng dấu nhắt nhảy, và thêm mục lục bên dưới vị trí này là thích hợp nhất

Các bước thực hiện:

1. Chèn code html

Thêm đoạn code bên dưới thẻ dữ liệu nội dụng bài viết <data:post.body/>

<b:if cond='data:view.isPost'>
  <div class='box_category'/>
</b:if>

2. Chèn script trước thẻ đóng </body>

<b:if cond='data:view.isPost'>
<script>//<![CDATA[
var postBody = document.querySelector('.post-body')
var titleChapter = postBody.querySelectorAll('h2,h3,h4,h5,h6')
if (1 <= titleChapter.length) {
  var i, leChapteraptor = []
  for (i = 0; i < titleChapter.length; i++) {
    anchorChapter = 'chapter-' + (i + 1)
    titleChapter[i].setAttribute('id', anchorChapter)
    titleChapter[i].setAttribute('title', 'Lên đầu trang')
    leChapteraptor[i] = '<li data-target=' + "#" + anchorChapter + '>' + titleChapter[i].innerHTML + '</li>'
  }
  $('.box_category').html('<p>Nội dung chính <label></label></p><ul class="chapter">' + leChapteraptor.join('') + '</ul>')
} else {
  $('.box_category').remove()
}
$(function() {
  var name_more = $('.post-body a[name=more]')
  if (name_more) {
    $('.box_category').insertAfter(name_more)
  } else {
    $('.box_category').remove()
  }
})
$('.box_category p>label').click(function() {
  $(this).toggleClass('show')
  $(this).parent().parent().find('ul').slideToggle('slow')
})
$('.box_category li').bind('click', function() {
  var target = $(this).attr('data-target')
  $('html, body').stop().animate({
    scrollTop: ($(target).offset().top) - 70
  }, 'slow')
})
for (k = 0; k < titleChapter.length; k++) {
  titleChapter[k].addEventListener('click', function() {
    $('html, body').stop().animate({
      scrollTop: ($('.box_category').position().top)
    }, 'slow')
  })
}
//]]></script>
</b:if>
Lưu ý:
  • Bài viết phải chèn dấu ngắt nhảy sau vài dòng mở đầu, nếu không mục lục sẽ không hiển thị.
  • Template cần có thư viện link jquery

3. Cách thêm thẻ tiêu đề:

>

Có 2 cách:

+ Thêm trực tiếp bên khung soạn thảo bằng cách để con trỏ nhấp nháy, ngay trước hoặc sau hoặc bôi đen đoạn văn bản sau đó trên thanh công cụ soạn thảo click chọn ô Chuẩn => menu xổ xuống chọn một trong các loại Tiêu đề (h2), Tiêu đề con (h3), Tiêu đề nhỏ (h4)

+ Thêm bên khung soạn thảo HTML bài viết

Khi soạn hay chỉnh sửa bài viết, bên khung soạn thảo HTML của bài viết, thêm các thẻ h2, h3, h4, h5, h6.

<h2>Tiêu đề </h2>
<h3>Tiêu đề con</h3>
<h4>Tiêu đề nhỏ</h4>
...

Các bạn có thể thay bằng các thẻ headings h2, h3, h4, h5 hay h6 tùy các bạn

4. Viết css hiển thị

Phần viết css cho giao diện hiển thị của mục lục, các bạn tự thiết kế theo sở thích của mình, code css tham khảo đang áp dụng với trường hợp blog mình


.box_category {
    background-color: #f0f1f5;
    margin-top: 22px;
    padding: 15px;
    border-left: 4px solid;
    border-color: #4285f4;
}
.box_category p {
    font-size: 1.3em;
    text-align: center;
}
.box_category p>label:after {
    content: '[Ẩn]';
}
.box_category p>label.show:after {
    content: '[Hiện]';
}
.box_category ul {
    margin: 10px 0 0;
    padding: 0;
}
.box_category li {
    list-style-type: none;
    line-height: 1.8rem;
}
@media (min-width: 769px) {
    .box_category p>label, .box_category li {
        cursor: pointer;
    }
}
4.1/5 - (128 bình chọn)

7 Nhận xét
  1. Đã test thành công. Hoạt động tốt nhưng khi đưa con trỏ chuột lên bảng mục lục nó không hiện lên dấu hiệu bàn tay như bài demo này.

    Trả lờiXóa
    Trả lời
    1. Bạn sửa class .box_tin li thành .box_category li là được, mình viết nhầm

      Xóa
    2. Cám ơn bạn nhiều nhé. Mình đã fix được lỗi rỗi.

      Xóa
  2. Sao em thêm vào không được nhỉ

    Trả lờiXóa
  3. Cái này có thể nào ẩn khi bài viết không có dấu ngắt nháy không a? Chứ mỗi lần có thẻ tiêu đề là nó hiện mặc dù không muốn

    Trả lờiXóa
    Trả lời
    1. Em giới hạn lại thẻ H là được như trong code lấy hết h2,h3,h4,h5,h6 em chỉ lấy h3 thôi

      Xóa