Многострочный усеченный текст с кнопкой «Показать больше» на чистом CSS
Я задался вопросом, позволяет ли CSS правильно оформить усеченный текст так, чтобы разместить в нем несколько строк? А также по нажатию кнопки «Показать больше» отобразить текст полностью.
Свойство text-overflow: ellipsis не поддерживает многострочность. Но я вспомнил о свойстве line-clamp , которое позволяет обрезать многострочный текст.
Подробнее о кнопке «Показать больше»
Для создания кнопки «Показать больше» я не мог использовать тег или . Для этого требуется label и чекбокс. Вот что получилось:
Hey, don't cut me off like that. I want to speak my mind and don't appreciate being put into a box.
Я разместил чекбокс прямо перед абзацем, поэтому можно использовать псевдокласс :checked для активации усечения текста:
input:checked + p
Нажмите кнопку, и в абзаце отобразится обрезанная версия текста.
Но как насчет доступности?
Хак с чекбоксом не только семантически неправильный, но и ограничивает возможности доступа к функционалу для людей с плохим зрением. При этом присваивается для чекбокса свойство display: none. Из-за этого нарушается навигация с помощью клавиатуры. Нельзя использовать скрытый чек-бокс , а использование метки не помогает. Событие нажатия клавиши пробела/ввода не перенаправляют событие в чекбокс.
Чтобы решить эту проблему, я сделал чекбокс фокусируемым, хоть и все еще невидимым.
input
Теперь чекбокс можно выделить, но без скринридера нельзя узнать, установлен он или нет, так как невидим. Чтобы решить эту проблему, я заставил label наследовать стиль фокуса браузера по умолчанию, когда чекбокс выделен:
input:focus ~ label
Ниже приведена комбинированная демо-версия. Попробуйте нажать на кнопку с помощью мышки, а затем используя клавишу пробела.
Как отображать кнопку динамически?
Но как динамически отображать кнопку, когда текст в абзаце слишком длинный, чтобы поместиться в контейнер. Это единственная функция, которую я не смог реализовать с помощью CSS. Потому что она требует применения селектора :truncated :
.read-more < display: none; >p:truncated + .read-more
Поэтому реализовать это можно только с помощью JavaScript. Например:
const ps = document.querySelectorAll('p'); const observer = new ResizeObserver(entries => < for (let entry of entries) < entry.target.classList[entry.target.scrollHeight >entry.contentRect.height ? 'add' : 'remove']('truncated'); > >); ps.forEach(p => < observer.observe(p); >);
А вот расширенная демо-версия:
кнопка читать далее
Добрый день! Думаю хорошим решением будет добавить в функционал кнопку читать далее, которая в ленте новостей или постов, при выводе полного текста статьи укорачивала ее, показывая часть, потом сама кнопка при нажатии на которую выводился весь текст прямо в ленте.
В общем не силен в коде, но кое-что нашел, что можно применить:
Если вместо text review поставить свой div все работает, только не на всю ленту, а на первый пост.
Задача, как сделать, чтобы кнопка отрабатывала на все посты в одной ленте.
(подставлял в файлы шаблонов вывода контента), кроме того есть еще одна проблема, на сайте установлена автоподгрузка контента.
Прошу помощи в данном вопросе, или может у кого-нибудь имеется решение лучше! Спасибо!
erni21
- Испытатели
- Сообщений: 33
#2 27 февраля 2018 в 00:06
Вот такой вот есть доделанный, без багов. Для автоматической установки пакет не собран, но если сможете ручками установить (просто файлы закинуть) то могу скинуть
Jestik
- Испытатели
- На орбите
- Сообщений: 3134
#3 27 февраля 2018 в 13:57
Спасибо Вам за помощь! Буду пробовать!
erni21
- Испытатели
- Сообщений: 33
Сегодня в 09:37
Реклама
#4 27 февраля 2018 в 15:07
GWK, там другой человек добавлял, и код нашел я, но я не смог его адаптировать под icms
instantcms.ru/blogs/chut-chut-blog/stil-spiska-dlja-tipa-kontenta-kombinirovanyi.html
Jestik
- Испытатели
- На орбите
- Сообщений: 3134
#5 27 февраля 2018 в 15:07
Это вот убрать надо, смысл с него если оно все равно закоментировано
Jestik
- Испытатели
- На орбите
- Сообщений: 3134
#6 27 февраля 2018 в 15:54
Пора бы уже подобные плюшки добавлять в саму сборку цмс, ну на крайняк как компоненты дополнения по разумной цене
Aliaksandr
- Испытатели
- Сообщений: 1091
#7 27 февраля 2018 в 22:03
GWK, у меня без этого куска все работает
instantcms.ru/users/hostelbeat и я — один и тот же человек. Я просто от старого аккаунта доступ утерял по глупости
GWK
ну дак тут админы дружелюбные, сделали бы новый)
Jestik
- Испытатели
- На орбите
- Сообщений: 3134
#8 1 марта 2018 в 13:44
Для начала в нужном виде вывода контента из папки templates/default/content добавляем примерно такой код:
Код PHP:
ЧИТАТЬ ДАЛЕЕ
Ну и после этого в самом конце нужного вам вида контента добавляем это:
$(document).ready(function() var hhh = 300;
$(«.content_text .f_content»).each(function() if ($(this).height() > hhh) $(this).css(«max-height», hhh+»px»);
$(this).parent().parent().parent().find(«.read-next»).css(«display», «inline»);
$(this).parent().parent().parent().find(«.shadow»).css(«display», «block»);
>
>);
$(«.read-next»).click(function() var block = $(this).parent().find(«.content_text .f_content»);
var shadow = $(this).parent().find(«.shadow»);
if (block.css(«max-height») == hhh+»px») block.css(«max-height», «»);
shadow.css(«display», «none»);
$(this).text(«Скрыть»);
>else block.css(«max-height», hhh+»px»);
$(this).text(«Читать полностью»);
shadow.css(«display», «block»);
>
>);
>);
/*window.onload = function() blok = document.getElementById(‘content_text’);
shadow = document.getElementById(‘shadow’);
parent = blok.parentNode;
blok_height = blok.style.height? blok.style.height: blok.offsetHeight;
if(blok_height > 400) blok.style.maxHeight = ‘400px’;
link = parent.getElementsByClassName(‘read-next’)[0];
link.style.display = ‘inline’;
if(blok.style.maxHeight) blok.style.maxHeight = »;
shadow.style.display =’none’;
link.innerHTML = ‘Скрыть’;
> else blok.style.maxHeight = ‘400px’;
link.innerHTML = ‘Читать далее. ‘;
shadow.style.display =’block’;
>
return false;
>
>
>*/
GWK
Множите по подробней объяснить что и как заменить чтоб все работало, потому если просто вставить код в default_list.tpl.php то нечего не происходить.
Как сделать кнопку читать далее?
Всем привет! Ребята прошу за глупый вопрос но как можно сделать вот такую кнопочку чтобы допустим сначала половина текста показывало а потом остальное?

- Вопрос задан более трёх лет назад
- 6897 просмотров
Комментировать
Решения вопроса 1
xmoonlight @xmoonlight
https://sitecoder.blogspot.com
Целых три варианта:
1. DIV+CSS: overflow: hidden (по клику — убираем свойство hidden через JS)
2. Jquery: api.jquery.com/load (грузим с сервера динамически)
3. NewPage (делаем переход на полную версию публикации)
Ответ написан более трёх лет назад
Нравится 5 1 комментарий
Функция «читать далее» после определённого количества слов

Здравствуйте. Как сделать так, чтобы там, где я пометил красным, появлялась ссылка «читать далее»? Т.е как установить лимит слов?
Отслеживать
3,857 4 4 золотых знака 22 22 серебряных знака 58 58 бронзовых знаков
задан 8 фев 2017 в 19:50
91 2 2 золотых знака 4 4 серебряных знака 10 10 бронзовых знаков
Мне кажется неверным делать это на стороне клиента. Но если очень хочется, на js считаете пробелы в строке да и все.
8 фев 2017 в 20:10
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Как правильно заметил @AndreyFedorov , обрезку традиционно логично делают на стороне сервера.
Но если очень хочется, то можно обрезать по словам и на клиенте с помощью javascript:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin pulvinar rhoncus tempus. Mauris non velit vitae leo tempor fringilla sed quis mi. In dignissim ultrices augue ut molestie. Maecenas venenatis auctor mauris. Integer a ex sit amet nibh ultricies posuere. Integer suscipit dui augue. Donec finibus mi eget dapibus varius. In pulvinar nec dolor eu rhoncus. Etiam volutpat pellentesque eros et euismod. Nam vitae mollis sem. Suspendisse ornare enim libero, a ornare tortor suscipit quis. Nunc tincidunt pretium ligula a finibus. Suspendisse cursus massa a convallis mattis. Integer consectetur aliquam nisl, pretium mattis mi. Donec laoreet felis a ligula congue, tincidunt bibendum dolor dignissim. Nam sodales imperdiet tincidunt. Vivamus eu lobortis nisi, sed sodales nulla. Nullam quis hendrerit mauris. Vestibulum sollicitudin sit amet urna in viverra. Vestibulum eros libero, elementum at vehicula eu, fringilla porta turpis. Curabitur at elit at quam ultrices fermentum ut in turpis. Donec porta, turpis non fermentum sollicitudin, dui purus tincidunt diam, ut euismod orci neque eget felis. Integer pharetra pretium eros ut mattis. Nunc quam nisi, egestas eget dui vel, tempor efficitur tortor.
Но обрезать по количеству слов не всегда уместно, ведь в зависимости от жанра текста в нём могут попадаться слова разной длины, потому результат не всегда предсказуем. Потому на практике чаще обрезают по количеству символов, т.к. символы имеют приблизительно одинаковую ширину и, соответственно, разные тексты тоже будут иметь приблизительно одинаковую ширину:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin pulvinar rhoncus tempus. Mauris non velit vitae leo tempor fringilla sed quis mi. In dignissim ultrices augue ut molestie. Maecenas venenatis auctor mauris. Integer a ex sit amet nibh ultricies posuere. Integer suscipit dui augue. Donec finibus mi eget dapibus varius. In pulvinar nec dolor eu rhoncus. Etiam volutpat pellentesque eros et euismod. Nam vitae mollis sem. Suspendisse ornare enim libero, a ornare tortor suscipit quis. Nunc tincidunt pretium ligula a finibus. Suspendisse cursus massa a convallis mattis. Integer consectetur aliquam nisl, pretium mattis mi. Donec laoreet felis a ligula congue, tincidunt bibendum dolor dignissim. Nam sodales imperdiet tincidunt. Vivamus eu lobortis nisi, sed sodales nulla. Nullam quis hendrerit mauris. Vestibulum sollicitudin sit amet urna in viverra. Vestibulum eros libero, elementum at vehicula eu, fringilla porta turpis. Curabitur at elit at quam ultrices fermentum ut in turpis. Donec porta, turpis non fermentum sollicitudin, dui purus tincidunt diam, ut euismod orci neque eget felis. Integer pharetra pretium eros ut mattis. Nunc quam nisi, egestas eget dui vel, tempor efficitur tortor.
Ну а если задача стоит вроде «текст должен занимать заданный контейнер, не больше и не меньше», тогда можно скрыть часть текста с помощью css:
div < width: 300px; height: 90px; position: relative; overflow: hidden; background: #EEE; >div a
