Раздвигающийся текст
Ребята! Очень надеюсь на Вашу помощь!
Имеется большой кусок текста с html-тегами. Как сделать так, чтоб была видна только его верхняя часть (в пределах 80px), а остальная часть появлялась при нажатии на кнопку "Читать далее..." (без перезагрузки страницы). Находил несколько решений, но к сожалению не одно из них не подошло, т.к. во всех этих решениях предполагается наличие двух частей - то что должно быть отображено и то, что должно быть скрыто. Самый подходящий вариант который был найден выглядет следующим образом: <html> <body> Тут текст<BR> <div style="height:'100%'"> <div id="ta" style="height:80px;overflow:hidden"> bla<br>bla<br>bla<br>bla<br>bla<br>bla<br>bla<br>bla<br>bla<br>bla<br>bla<br>bla<br>bla<br>bla<br>bla<br>bla<br> </div> <span style="cursor:pointer;color:blue" onclick="document.getElementById('ta').style.height = '100%'">Читать далее...</span> </div> Еще какой-то текст.... </body> </html> Можно ли в этом примере сделать чтобы "Читать далее" Не отображалась если текст помещается в 80px, а также если он уже был раскрыт? И самое главное как сделать автоуменьшение блока, если текст занимает меньше чем 80px? Возможно это уже здесь где-то обсуждалось, но я к сожалению не смог найти... |
Имеет один недостаток если высота контента равна 80 будет показываться кнопка -можно убрать подобрав размер шрифта и межстрочный интервал
1 задaть max-height =80, overflow-y =hidden; 2 при нажатии на кнопку убирать max-height 3 показывать не показывать кнопку -если высота блока меньше 80 -не показывать кнопку по поводу не показывать -если раскрыт-скрывать \изменять при нажатии на кнопку |
Алгоритм мне понятен... Но мне бы javascript наброски хотя бы, т.к. в нем я полный ноль, или какое-то другое готовое решение (наверняка оно есть)!
Подобрать размер шрифта и межстрочный интервал не получится, т.к. при этом теряется весь смысл отформатированного текста вводимого пользователем в cleditor-е... |
Вот пример на jQuery
<html> <head> <script language="JavaScript" src="../js/jquery.min.js"></script> </head> <script> $(function(){ if($('#ta').length){ blok_height = Number($('#ta').css('height').replace('px','')); if(blok_height > 80){ $('#ta').css('max-height','80px'); $('.read-next').show(); } } }); $('.read-next').live('click', function(){ if($('#ta').css('max-height') != 'none'){ $('#ta').css('max-height',''); $(this).text('Скрыть'); } else { $('#ta').css('max-height','80px'); $(this).text('Читать далее...'); } return false; }); </script> <body> <div style="height:'100%'"> <div id="ta" style="overflow:hidden"> Ребята! Очень надеюсь на Вашу помощь! <br /> Имеется большой кусок текста с html-тегами. Как сделать так, <br /> чтоб была видна только его верхняя часть (в пределах 80px), <br /> а остальная часть появлялась при нажатии на <br /> кнопку "Ч <br /> итать далее..." (без перезагрузки страницы). <br /> Находил несколько решений, но к сожалению не <br /> одно из них не подошло, <br /> т.к. во всех этих решениях предполагает <br /> <br /> ся наличие двух частей - то что должно б <br /> ыть отображено и то, что должно быть скрыто. <br /> Самый подходящий вариант который был найден выглядет следующим образом: <br /> <br /> Можно ли в этом примере сделать чтобы "Читать далее" Н <br /> е отображалась если текст помещается в 80px, а также если он уже был раскрыт? <br /> И самое главное как сделать автоуменьшение блока, если <br /> текст занимает меньше чем 80px? <br /> Возможно это уже здесь где-то обсуждалось, но я к сожалению не смог найти... <br /> </div> <a class="read-next" style="display:none;" href="#">Читать далее...</a> </div> </body> </html> вот без jQuery <script> window.onload = function(){ blok = document.getElementById('ta'); parent = blok.parentNode; blok_height = blok.style.height ? blok.style.height : blok.offsetHeight; if(blok_height > 80){ blok.style.maxHeight = '80px'; link = parent.getElementsByClassName('read-next')[0]; link.style.display = 'inline'; link.onclick = function(){ if(blok.style.maxHeight){ blok.style.maxHeight = '' link.innerHTML = 'Скрыть'; } else { blok.style.maxHeight = '80px'; link.innerHTML = 'Читать далее...'; } return false; } } } </script> |
Спасибо огромное! Работает как надо (Пробовал 1-ый вариант)! НО только работает для одного блока :(
Таких блоков на странице будет n-ое количество, забыл это сразу упомянуть... Попробовал поэксперементировать с id, но я так понял Вы его в скрипте жестко привязали!? |
да в этом примере к id жестко привязан, для многоблочного варианта поменяйте id на класс и всё делать в цикле
|
вот вариант для многоблочного использования на jQuery
$(function(){ bloks_total = $('body').find('.ta'); if(bloks_total.length){ for(i=0; i < bloks_total.length;i++){ blok_height = Number($(bloks_total[i]).css('height').replace('px','')); if(blok_height > 80){ $(bloks_total[i]).css('max-height','80px'); $('.read-next').show(); } } } }); $('.read-next').live('click', function(){ is_parent = $(this).parent(); blok = is_parent.find('.ta'); if(blok.css('max-height') != 'none'){ blok.css('max-height',''); $(this).text('Скрыть'); } else { blok.css('max-height','80px'); $(this).text('Читать далее...'); } return false; }); |
В общем ситуация получается следующая... Если блок один то все нормально работает... Но если блоков несколько то отображается ссылка "Читать далее" у тех блоков у которых она появлятся не должна...
<html> <head> <script language="JavaScript" src="jquery.min.js"></script> </head> <script> $(function(){ bloks_total = $('body').find('.ta'); if(bloks_total.length){ for(i=0; i < bloks_total.length;i++){ blok_height = Number($(bloks_total[i]).css('height').replace('px','')); if(blok_height > 80){ $(bloks_total[i]).css('max-height','80px'); $('.read-next').show(); } } } }); $('.read-next').live('click', function(){ is_parent = $(this).parent(); blok = is_parent.find('.ta'); if(blok.css('max-height') != 'none'){ blok.css('max-height',''); $(this).text('Скрыть'); } else { blok.css('max-height','80px'); $(this).text('Читать далее...'); } return false; }); </script> <body> <div style="height:'100%'"> <div class="ta" style="overflow:hidden"> 1-ый блок bla<br>bla<br>bla<br>bla<br>bla<br>bla<br>bla<br>bla<br>bla<br>bla<br>bla<br> </div> <a class="read-next" href="#" style="display:none;" >Читать далее...</a> </div> <div style="height:'100%'"> <div class="ta" style="overflow:hidden"> 2-ой блок bla<br>bla </div> <a class="read-next" href="#" style="display:none;" >Читать далее...</a> </div> <div style="height:'100%'"> <div class="ta" style="overflow:hidden"> n-ый блок bla<br>bla<br>bla<br>bla<br>bla<br>bla<br>bla<br>bla<br>bla<br>bla<br>bla<br> </div> <a class="read-next" href="#" style="display:none;">Читать далее...</a> </div> </body> </html> |
ща поправим
|
$(bloks_total[i]).parent().find('.read-next').show(); вот это вставь вместо записи на 14 строчке
|
Огромное человеческое спасибо Вам добрый человек!!! Если бы Вы знали как меня выручили!!! И всем остальным спасибо, кто помог разобраться и не отправил читать мануалы как это часто бывает на других форумах. Вот честное пионерское изучу js и постараюсь не задавать глупых вопросов, просто только приступил к освоению Web-программирования...
|
В общем выявилась одна проблема....
Скрипт не работает в IE :( , в остальных браузерах работает как надо! IE9 все настройки по умолчанию... |
на че ругается IE?
|
вот это вставь -
blok = bloks_total[i]; blok_height = blok.style.height ? blok.style.height : blok.offsetHeight; вместо - blok_height = Number($(bloks_total[i]).css('height').replace('px','')); |
Заменил... Проблема осталась...
А проблема заключается в том, что IE не скрывает блок более 80px, а отображает его полностью... |
не может быть, что бы не заработало, у меня то работает, точно на странице ошибок нет?
|
Ошибок на странице нет...
Винда лицензионная. IE 9.0.8112.16421 Может где в настройках IE покапаться!? Хотя как я уже говорил, все настрой IE по умолчанию... Код с учетом всех Ваших передложений выглядит: $(function(){ bloks_total = $('body').find('.ta'); if(bloks_total.length){ for(i=0; i < bloks_total.length;i++){ blok = bloks_total[i]; blok_height = blok.style.height ? blok.style.height : blok.offsetHeight; if(blok_height > 80){ $(bloks_total[i]).css('max-height','80px'); $(bloks_total[i]).parent().find('.read-next').show();; } } } }); $('.read-next').live('click', function(){ is_parent = $(this).parent(); blok = is_parent.find('.ta'); if(blok.css('max-height') != 'none'){ blok.css('max-height',''); $(this).text('Скрыть'); } else { blok.css('max-height','80px'); $(this).text('Читать далее...'); } return false; }); |
я тестил на ie7 и ie8 все робит как надо, ща посмотрю твой код
|
всё робит, но 9-ки у меня нет, но я думаю, если робит на 7 и 8, то в 9 точно уже должна пахать.
Как вариант посмотри, какой у тебя режим документов в ie ставится когда ты страницу открываешь, потому что в режиме совместимости код не робит |
попробуй алертом проверять че тебе blok_height выдает
|
На одном компе нашел IE7 (8 не смог найти), но и там тоже не сработало!
Везде одно и то же: ![]() начало 2-го блока всегда находится внизу страницы IE (хотел скрин более наглядным сделать, смасштабировав страницу, но оказался вот такой вот эффект), т.е. получается каждый блок занимает целиком страницу, сразу раскрывая его и заполняя пустотой до самого низа страницы... blok_height для 1-го, 2-го и 3-го блока из рассматриваемого примера составил 209,38,209 соответственно. Режим совместимости отключен... Может проблема в версиях jQuery? У меня 1.8.3 |
Кстати, на моем создаваемом сайте такого растягивания нет! Поскольку блок вставляется в таблицу... Но блок все равно открывается полностью:
![]() |
ну по крайней мере blok_height выдает вроде то что нужно
посмотрите у каждого блока появилась ли в стилях max-height?если появилась значит проблема в структуре html, может быть иммеено в таблице, я припоминаю, что в каком то случае у меня max-height не срабатывал именно в таблице |
но ведь 1-ый вариант скриншота я привел как есть (без таблиц)
в стилях max-height: 80px появился только у 1-го и 3-го блоков... Что-то я думаю, что проблема в <div style="height:'100%'"> !? |
ну попробуй без style="height:'100%'" если заработает, попробую у себя так же сделать
пробуй вставлять алерты между кодом, найди место где он ломается, и покажи мне, я бы у себя попробовал, но ведь у меня то работает почему то... |
Проблему с IE победил, просто указазал:
<!DOCTYPE html> Теперь возникла необходимость поменять стиль ссылки: a.more:visited { font-family: Georgia, 'Times New Roman', Times, serif; font-size: 11pt; color: rgb(48, 189, 250); text-decoration: none; font-weight: bold; } a.more:hover { font-family: Georgia, 'Times New Roman', Times, serif; font-size: 11pt; color: rgb(242, 109, 0); text-decoration: underline; font-weight: bold; } a.more:link { font-family: Georgia, 'Times New Roman', Times, serif; font-size: 11pt; color: rgb(48, 189, 250); text-decoration: none; font-weight: bold; } a.more:active { font-family: Georgia, 'Times New Roman', Times, serif; font-size: 11pt; color: rgb(242, 109, 0); text-decoration: underline; font-weight: bold; } Но как его "прикрутить" к строке: <a class="read-next" href="#" style="display:none;" >Читать далее...</a>Ума не приложу.... Стиль ссылок на своем сайте я везде менял так: <a class="more" href="... А вот как в данном случае его поменять? Чтобы и "Читать далее" и "Скрыть" - были во вновь заданном стиле. |
Олег, скажи, пожалуйста, как сделать чтобы данная кнопка открывала объект к примеру на 1000 px, затем опять на 1000 px, затем опять. И так до конца страницы.
|
Часовой пояс GMT +3, время: 16:24. |