Как сделать спойлер для текста
Здравствуйте!
Есть текст, например: <div class="category-products-page-content"> <p>Первая часть текста</p> <p><!-- pagebreak --></p> <p>Вторая часть текста</p> </div> Состоит из двух частей, разделенным тегом <p><!-- pagebreak --></p> Предполагаю, что тег нужно преобразовать в кнопку с текстом, например, "Подробнее" и при клике на нее должна показываться вторая часть текста, которая изначально скрыта. Но моими силами пока ничего не выходит. Буду очень благодарен, если подскажете, как реализовать данную возможность. |
<div class="category-products-page-content">
<p>Первая часть текста</p>
<p style="display: none">Вторая часть текста</p>
<button>Подробнее</button>
</div>
<script>
document.querySelector('.category-products-page-content button').onclick = function(e){
var el = e.target.previousElementSibling;
el.style.display = el.style.display == "none"? "block":"none";
e.target.textContent = e.target.textContent == "Подробнее"?"Cкрыть":"Подробнее";
};
</script>
|
Спасибо, но немного не то.
Текст будет писаться в текстовом редакторе обычным пользователем. В текстовом редакторе есть кнопка "Добавить разрыв страницы". Вот ее я и хочу использовать для реализации своей задумки. Кнопка формирует тег <!-- pagebreak -->, которым можно разделить текст на две части. Вторая часть текста, т.е. та которая идет после <!-- pagebreak --> должна быть на сайте изначально скрыта. <!-- pagebreak --> должен быть преобразован в кнопку, при клике на которую вторая часть текста должна отображаться. Как-то так. |
kos0760,
а можно так ? <p class="pagebreak "></p> |
Можно было бы, если бы я сам писал это все в редакторе. Добавил бы класс pagebreak к p и все. А так Писать тексты будет человек далекий от html и хочется максимально упростить ему работу. Чтобы он написал абзац нажал на кнопочку разрыв страницы, а далее все то что хочет скрыть. К сожалению, кнопка формирует только <!-- pagebreak --> и в этом вся проблема.
|
<div class="category-products-page-content">
<p>Первая часть текста</p>
<p><!-- pagebreak --></p>
<p>Вторая часть текста</p>
</div>
<div class="category-products-page-content">
<p>Первая часть текста</p>
<p><!-- pagebreak --></p>
<p>Вторая часть текста</p>
</div>
<script>
[].forEach.call(document.querySelectorAll('.category-products-page-content>p'), function(el){
if(el.firstChild.textContent == ' pagebreak ') {
el.nextElementSibling.style.display = "none";
el.nextElementSibling.insertAdjacentHTML('afterend', '<button>Подробнее</button>');
}
});
[].forEach.call(document.querySelectorAll('.category-products-page-content button'), function(el){
el.onclick = function(e){
var el = e.target.previousElementSibling;
el.style.display = el.style.display == "none"? "block":"none";
e.target.textContent = e.target.textContent == "Подробнее"?"Cкрыть":"Подробнее";
};
});
</script>
Допилил |
Цитата:
|
j0hnik, спасибо, что активно помогаете. все получилось. почти. проблема в том что если во второй части несколько параграфов, то кнопка Подробнее отображается только после первого параграфа, идущего за <p><!-- pagebreak --></p>. А так вообще документ может содержать множество html тегов: и заголовки и картинки и т.д. То, что я привел в качестве примера - это упрощенный вариант. Разделять текст нужно будет после одного или нескольких абзацев и после разделения тоже может быть несколько абзацев, заголовков, картинок, как я уже писал выше. Т.е получается что скрыто должно быть все после <p><!-- pagebreak --></p> и до закрывающего </div>
|
<div class="category-products-page-content">
<p>Первая часть текста</p>
<p><!-- pagebreak --></p>
<p>Вторая часть текста</p>
<img src="https://javascript.ru/forum/images/ca_serenity/misc/logo.gif" alt="">
<div>третья часть текста</div>
</div>
<div class="category-products-page-content">
<p>Первая часть текста</p>
<p><!-- pagebreak --></p>
<p>Вторая часть текста</p>
<img src="https://javascript.ru/forum/images/ca_serenity/misc/logo.gif" alt="">
<div>третья часть текста</div>
</div>
<script>
[].forEach.call(document.querySelectorAll('.category-products-page-content'), function(el){
var flag = 0, elt = el.firstElementChild;
while(elt = elt.nextElementSibling) {
console.log(elt);
if(flag) elt.style.display = "none";
if(elt.firstChild && elt.firstChild.textContent == ' pagebreak ') flag = 1;
}
el.insertAdjacentHTML('beforeend', '<button>Подробнее</button>');
});
[].forEach.call(document.querySelectorAll('.category-products-page-content button'), function(el){
el.onclick = function(e){
var elt = this;
while(elt = elt.previousElementSibling) {
if(elt.firstChild && elt.firstChild.textContent == ' pagebreak ') break;
elt.style.display = elt.style.display == "none"? "block":"none";
}
e.target.textContent = e.target.textContent == "Подробнее"?"Cкрыть":"Подробнее";
};
});
</script>
|
j0hnik, то что надо! поэксперементировал сам, вроде все работает. благодаря Вам сэкономил кучу времени. огромное спасибо! :thanks:
|
| Часовой пояс GMT +3, время: 06:17. |