Как правильно установить TOCBOT с Bootrap-4
Я пытаюсь использовать хорошее дополнение под названием TOCBot. У меня есть два следующих вопроса, которые, я надеюсь, кто-нибудь мне поможет.
Проблема № 1: Там вы можете видеть, что белая вертикальная полоса, которая значительно выходит за пределы элементов списка. Я думаю, что бар должен быть таким же длинным, как и вертикальный контент. Можно ли как-нибудь настроить ширину или длину этого бара?
JSFiddle. Обратите внимание на ссылку на инструмент, не показанный здесь.
HTML-код:
<body data-spy="scroll" data-target=".js-toc">
<div class="container-fluid">
<div class="row">
<div class="col bg-dark">
<nav class="js-toc sticky-top py-5"></nav>
</div>
<div class="col js-toc-content">
some text1
<h1 id="h1root">Root </h1>
<h2 id="2">Subheading, h2</h2>
Some text 2
<h3 id="2">Third level heading</h3>
Some text 3
<h3 id="3">Another level 3 heading</h3>
Some text 4
<h2 id="4">A second subheading</h2>
Some text 4
</div>
</div>
</body>
инициализация
tocbot.init({
tocSelector : '.js-toc',
contentSelector: '.js-toc-content',
headingSelector: 'h1, h2, h3, h4',
collapseDepth : 6,
headingsOffset : 1,
orderedList : true
});
Проблема № 2. Я хочу, чтобы последняя нажатая (текущая) ссылка выделялась либо по цвету, цвету фона или настройкам полей. Как это можно сделать?
2 ответа
Попробуй это.
1) Давайте настроим CSS более явно для переопределения CSS-кодов без использования !important
body a.toc-link{
color: wheat;
}
2) Белая линия создается с помощью a.toc-link::before
псевдо-селектор. Так как он использует height:inherit
высота может потенциально меняться в зависимости от того, на каком устройстве / размере экрана вы находитесь, поэтому давайте используем jQuery, чтобы получить высоту тега привязки и установить ее равной высоте белой линии.
var tocHeight = $('a.toc-link').height(); //18
3) Мы не можем напрямую стилизовать ::before
с JS, поэтому мы должны динамически вставить его на страницу в виде <style>
тег. Обратите внимание на обратные галочки и использование ${}
- это известно как литералы шаблона JS
//Create the html
// remember, tocHeight = 18 so we add the 'px' here
var html = `<style>a.toc-link::before {
height: ${tocHeight}px;
}</style>`;
//Insert it above the closing `</body>` tag
$('body').append(html);
4) Настройте прослушиватель событий при щелчке для тегов привязки и добавьте класс, чтобы изменить цвет на красный.
$('a.toc-link').on('click', function(){
//Remove any previously added classes of 'clicked' to all toc-link elements
$('a.toc-link').removeClass('clicked');
//Add the class to the currently clicked anchor tag
$(this).addClass('clicked');
});
5) создать .clicked
класс в CSS
body a.toc-link.clicked {
color:red;
}
демо: https://jsfiddle.net/b0n4xk1c/
Примечание. Хотя белая линия имеет тот же размер, что и теги привязки, между ссылками есть промежутки из-за полей / промежутков (см. Демонстрацию). Если вы хотите, чтобы линия полностью соединилась, просто добавьте несколько дополнительных пикселей к значению после захвата.
var tocHeight = $('a.toc-link').height() + 6;
Я связался с автором TOCBOT, который любезно обнаружил ошибку в моем коде. Эта ошибка связана с проблемой № 1.
Мне нужно включить класс "toc", а не только класс "js-toc" в коде выше.
<nav class="js-toc toc" sticky-top py-5></nav>
При этом нет необходимости писать дальше JS.
Обновление: если ваш список нумеруется, вам также нужно будет сделать что-то подобное и не полагаться на настройку параметров orderedList: true
в одиночестве.
.toc>.toc-list li{
list-style:decimal-leading-zero;
}