Раздвигающийся текст
Ребята! Очень надеюсь на Вашу помощь!
Имеется большой кусок текста с 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, время: 02:05. |