S3.Blog

23 Апреля 2024
A A A   RSS-лента
"Я знаю, что ничего не знаю, но многие не знают и этого". Сократ [?].

JavaScript: Скрытые блоки

Дата последнего изменения: 8 Сентября 2009
Метки статьи: Готовые решения, HTML, JavaScript, © Авторское
На многих сайта, особенно на форумах, вы, наверное, не раз видели скрытые блоки, которые раскрываются при клике на них.
Практически все они построены по одному принципу: внутри общего DIV находятся два других - один, это панель для нажатия, во-втором скрытый текст.


Похожие материалы:




drAculenok (гость) • ответить
Спасибо очень помогло!
Alexa (гость) • ответить
Спасибо, то, что надо!
Антон (гость) • ответить
Здорово, все гениальное просто, сколько я уже ищу нормальное решение.
Реализовал тут:
Сибирский интернет аукцион
Леха Г. (гость) • ответить
а есть вариант, когда div всегда открывается в заданном месте страницы и при этом, когда нажимаем второй блок, первый, уже открытый до этого, скрывается?
Александрответить
готового примера нет, но в этом нет ничего сложного.
впишите в начале скрипта, перед function openBlock(el), переменную, хранящую div-элемент, например:
div_view = undefined;

и в условии, где открывается/закрывается блок, напишите так:
if (child && child.className == "this_block_is_hidden" ) {
if (child.style.display != 'block') {
if (div_view) {
div_view.style.display = 'none';
}
div_view = child;

child.style.display = 'block';
} else {
child.style.display = 'none';
}
}
Андрей (гость) • ответить
Подскажите, пожалуйста, можно ли сделать так, что бы при наведении курсора на определенный блок, плавно открывался скрытый блок?
Александрответить
можно, для этого вместо onclick поставьте onMouseOver, ну и пошаманьте с openBlock()
самое простое, это назначить изначально скрытому диву высоту в 1px, а потом в цикле, при наведении мыши, эту высоту увеличить до нормального размера, а при onMouseOut наоборот - в цикле уменьшить высоту с нормальной до 1 пиксела
Suicide (гость) • ответить
Спасибо! Пользуюсь
Юрий (гость) • ответить
можно, для этого вместо onclick поставьте onMouseOver, ну и пошаманьте с openBlock()
самое простое, это назначить изначально скрытому диву высоту в 1px, а потом в цикле, при наведении мыши, эту высоту увеличить до нормального размера, а при onMouseOut наоборот - в цикле уменьшить высоту с нормальной до 1 пиксела


Здравствуйте!
Вот мне как раз именно это и требуется, я заменил onclick на onmouseover, но:
[HTML]<div onmouseover="openBlock(this);" class="toggle">Нажмите, что бы раскрыть блок.</div>[/HTML]
[COLOR="DarkRed"]Здесь еще несколько DIV-ов![/COLOR]
[HTML]<div class="this_block_is_hidden">это первый скрытый блок</div>[/HTML]

Я так понимаю, что в выше приведенном примере, открывается второй див, дочерний как бы?
Поэтому у меня условие не работает?
Александрответить
покажите реальную структуру вашего html и попробуем разобраться вместе что, где и почему у вас не работает
Юрий (гость) • ответить
Спасибо, что ответили.

Решил остановится на onclick, взял Ваш код, прикрутил, вроде все норм.
Собственно мой сайт: Инфо-Рунет
При нажатии на кнопку, блок "добавить в закладки", справа под каждым сайтом.
Появляется скрытый блок, собственно закладки.

Можно посмотреть исходник страницы.
С использованием onmouseover ничего не получилось, правда и блок на котором был задан onmouseover был выше, это текст, описание сайта.
Вот планировалось, что при наведении на него откроются закладки, а кнопки не будет.

В любом случае, меня устраивает и этот вариант.
Большое спасибо!
Александрответить
т.е. моя помощь не нужна?
посмотрите исходники моего блога и http://s3blog.org/js/s3blog.js - использование моего метода view_block. там конечно не так как в статье описано, но конкретно для вашего случая это будет более красивый вариант. могу даже помочь бесплатно внедрить
Юрий (гость) • ответить
Спасибо!
Тоесть этот скрипт отвечает за "наведение по блокам", когда он меняет цвет и появляется надпись подробнее, так же заметил что мигает заголовок записи, правильно? Смотрится неплохо.

Возможно это можно применить к моему каталогу, Вы его смотрели, может по этому поводу у Вас есть советы или предложения?

Я, вообще уже использую изменение стиля при наведении, вот так:
<div onmouseover="this.className='blocksiteh'" onmouseout="this.className='blocksite'" >
Но пока еще не опредилился с самим стилем.
Александрответить
давайте продолжим разговор по почте.
s3 [плюшка] smtp.ru
Миша (гость) • ответить
всем привет! всё работает! скажите, что нужно сделать, чтоб спустя заданный промежуток времени (ну например 5 сек) див автоматически опять становился скрытым?
Александрответить
добавить таймер в этом месте который скроет блок по истечении заданного времени

// если блок не виден, то показать его
if (child.style.display != 'block') {
child.style.display = 'block';
}
Миша (гость) • ответить
попробовал с setTimeout поэкспериментировать - не получается что-то!
Александрответить
а как именно пробовали?
Uncle Bob (гость) • ответить
Скажите а как сделать в этом пример смену изображений + и - (ну как на многих форумах в теге spoiler). Тоесть пока блок скрыт слева от надписи находится изображение +, а когда после нажатия открывается блок, то + меняется на -.
Александрответить
тут вставить <span>, например так:
<div>
<div onclick="openBlock(this);"><span>+</span>Нажмите, что бы раскрыть блок.</div>

а в коде добавить:

if (child.style.display != 'block') {
child.style.display = 'block';
//---
el.getElementsByTagName("span" )[0].innerHTML = '-';
//---
}

// иначе скрыть его
else {
child.style.display = 'none';
//---
el.getElementsByTagName("span" )[0].innerHTML = '+';
//---
}

код не проверял, но должно работать
Артём (гость) • ответить
Очень хороший скрипт. А как сделать так, что бы мог быть открыт всего лишь один спойлер?? То есть, При открытии нового, предыдущий автоматически закрывается. Очень нужно, помогите.
Александрответить
добавьте в начало скрипта, перед function openBlock(el) переменную, в которой будет храниться последний обработанный элемент, например:
var old_block_hidden = undefined;

а потом, перед child.style.display = 'block'; добавьте такую конструкцию:
if (old_block_hidden) {
old_block_hidden.style.display = 'none';
}
Александрответить
в итоге скрипт будет выглядеть так:
<script>
var old_block_hidden = undefined;
function openBlock(el) {
var kids = el.parentNode.childNodes;
for (var k = 0; k < kids.length; k++) {
var child = kids[k];
if (child && child.className == "this_block_is_hidden" {
if (child.style.display != 'block') {
if (old_block_hidden) {
old_block_hidden.style.display = 'none';
}
old_block_hidden = child;
child.style.display = 'block';
} else {
child.style.display = 'none';
}
}
}
}
</script>
Илья (гость) • ответить
<script>
function openBlock(el) {
var kids = el.parentNode.childNodes;
for (var k = 0; k < kids.length; k++) {
var child = kids[k];
if (child && child.className == "this_block_is_hidden" || child && child.className == "this_block_is_hidden-1" || child && child.className == "this_block_is_hidden-2" {
if (child.style.display != 'block') {
child.style.display = 'block';
} else {
child.style.display = 'none';
}
}
}
}
</script>

как сделать, что бы плавно открывался? Помоги те плиз. Уже 2 день мучаюсь...
Александрответить
ну, как-то так:
1. в стили для "DIV.this_block_is_hidden" добавьте это:
	overflow: hidden;


2. вот это:
	if (child.style.display != 'block') {
child.style.display = 'block';
} else {
child.style.display = 'none';
}

замените на это:
	if (child.style.display != 'block') {
openBlock_open(child, 1);
child.style.display = 'block';
child.style.height = '1px';
} else {
openBlock_close(child, 20); // <-- МАКС. ВЫСОТА БЛОКА
child.style.height = '20px'; // <-- МАКС. ВЫСОТА БЛОКА
}


3. добавьте это:
function openBlock_open(el, height) {
height += 1;
el.style.height = height + 'px';
if (height<20) { // <-- ДО КАКОЙ ВЫСОТЫ РАСКРЫВАТЬСЯ
setTimeout(function(){ openBlock_open(el, height); }, 10); // 10 - СКОРОСТЬ РАСКРЫТИЯ
}
}
function openBlock_close(el, height) {
height -= 1;
el.style.height = height + 'px';
if (height>1) {
setTimeout(function(){ openBlock_close(el, height); }, 10); // 10 - СКОРОСТЬ ЗАКРЫТИЯ
} else {
el.style.display = 'none';
}
}

Илья (гость) • ответить
Огромное тебе спасибо Саш. Реально, спасибо. Выручил.
Александрответить
пожалуйста
там наверняка нужно еще обработать напильником, но, надеюсъ сам дальше справишься
Ариан (гость) • ответить
Подскажите пожалуйста - как сделать на ява такое событие:
хтмл блок со ссылкой через заданное время скрывается от посетителя страницы и более не доступен ему?
В идеале, хотелось бы, чтобы при обновлении страницы блок уже не показывался.
Спасибо!
Александрответить
вам алгоритм или готовый код надо?
если алгоритм, то так:
1. проверяем наличие cookie "mmm", если есть - выполняем п.4, иначе п.2
2. запускаем setTimeout по истечению заданного времени выполняем п.3
3. устанавливаем куку "mmm"
4. устанавливаем нужному html-блоку style=display: none
Ариан (гость) • ответить
Александр, спасибо!
Забыл написать, что я на ява не программирую
Мне хотелось бы получить готовый код. Я думаю, что он и другим пригодится.
Ариан (гость) • ответить
И да, чуть не забыл - нужно какой-нибудь таймер рядом, показывать обратный отсчёт (счёт на минуты)
Александрответить
вместо setTimeout используем setInterval и переменную nnn=5
при каждой итерации setInterval уменьшаем nnn на 1 и отображаем значение nnn в хтмл
при достижении nnn = 0 делаем clearInterval, записываем куку и прячем нужный хтмл-блок
Евгения (гость) • ответить
Добрый день! А как сделать чтобы при нажатии на "Нажмите, чтобы раскрыть блок" - эта надпись менялась, например на "Нажмите, чтобы скрыть". А вообще лучше чтобы менялся вид кнопки.До нажатия - один вид, после - другой.
Александрответить
До нажатия - один вид, после - другой.

переключайте className
Евгения (гость) • ответить
А где можно посмотреть пример?
Александрответить
ну, смотря какая у вас html-структура.
в качестве примера, вот, ниже, но надо под ваши реалии подстроить:
if (child.style.display != 'block') {
child.style.display = 'block';
el.className = 'название стиля кнопки (блок открыт)';
} else {
child.style.display = 'none';
el.className = 'название стиля кнопки (блок закрыт)';
}
Евгения (гость) • ответить
Оk, классно, работает) А если не только стиль, но и саму надпись поменять?
Александрответить
там же, где и el.className, добавьте строчку:
el.innerHTML="<font color='red'>закрой меня</font>";
Сергей (гость) • ответить
Добрый день, то что искал! Но буду очень признателен, если вы подскажете как сделать некоторые изменениея. У вас список отображается по вертикали. А можно разместить его по горизонтали,чтобы не было такого, допустим при клике по Меню1 отображается скрытый блок,а Меню2 и Меню3 сползаю вниз вместе со скытым блоком. Надо сделать,что бы Меню1 Меню2 Меню3 отображалось по горизонтали и чтобы при клике по любому Меню, все они оставались также по горизонтали, а скрытый блок, открывался под ними.Спасибо
Александрответить
добавьте в стиле для DIV.main_block это: float: left;
и уберите <br> между блоками
Сергей (гость) • ответить
Я также думал, но если вся ширина составляет 800 пикселей и ширина скрытого блока тоже 800 пикселей, то все равно при нажатии меню1 тогда меню2 и меню3 все равно уйдет вниз. Вот был бы вам благодарен, если бы помогли сделать,чтобы скрытые блоки отображались всегда внизу, а меню не смещалось ни куда.Спасибо
Александрответить
к тому что я написал выше добавьте это: в стиль DIV.this_block_is_hidden добавьте position: absolute;
Jimmi (гость) • ответить
Подскажите, как сделать, что-бы как только курсор уходил с блока, выпадающий блок прятался?
Александрответить
в div добавьте это:
onmouseout="openBlock(this, true);"

а в javascript это: function openBlock(el) {
замените на это: function openBlock(el, is_hide) {

а это: if (child.style.display != 'block') {
замените на это: if ((! is_hide) && (child.style.display != 'block')) {
Сергей (гость) • ответить
Добрый вечер. Подскажите пожалуйста, как реализовать так, чтобы открывал не дочерний div, а в другом месте на сайте. У меня такая структура кода:

<td class="minfo"> <i onclick="openBlock(this);" class="fa fa-chevron-down"></i></div></td>
</tr>
<tr><div class="this_block_is_hidden">это первый скрытый блок</div></tr>


Следовательно, скрипт не может его открыть.

В JavaScript поверхностно, поэтому был бы благодарен за помощь Спасибо)
Александрответить
тут без id не обойтись, в вашем случае это будет примерно так:
<tr><td class="minfo">
<i onclick="openBlock(document.getElementById('my_menu_1'));" class="fa fa-chevron-down"></i>
</td></tr>
<tr><td>
<div><div id="my_menu_1" class="this_block_is_hidden">это первый скрытый блок</div></div>
</td></tr>

Сергей (гость) • ответить
Спасибо за ответ. У меня порядка 50 блоков (всегда разное значение) раскрывается на одной странице. Ну что поделать, буду привязывать id.

Спасибо еще раз)
Сергей (гость) • ответить
Есть возможно готовое (не сильно грамоздкое) решение в виде формирования ID у блок, как в примере в вашем посте?

<div>
<div onclick="openBlock('4efdea3a6c787b89')">Нажмите, что б раскрыть блок</div>
<div id="4efdea3a6c787b89" style="display: none;">текст текст текст</div>
</div>
Александрответить
сформировать ID случайным образом не проблема, но кто их будет назначать какой-куда и за что отвечает? поэтому, в вашем случае, к сожалению, только ручная работа.

вы можете только облегчить конструкцию немного изменив скрипт:

<tr><td class="minfo">
<i onclick="openBlock('my_menu_1');" class="fa fa-chevron-down"></i>
</td></tr>
<tr><td>
<div id="my_menu_1" class="this_block_is_hidden">это первый скрытый блок</div>
</td></tr>


и измените скрипте на это:
<script>
function openBlock(el_id) {
var child = document.getElementById(el_id);
if (child) {
// если блок не виден, то показать его
if (child.style.display != 'block') {
child.style.display = 'block';
}
// иначе скрыть его
else {
child.style.display = 'none';
}
}
}
</script>
Сергей (гость) • ответить
Просто количество блоков все время разное, у схожих сайтов с моей тематикой формируется через ID, видимо и мне придется также поступать)

пример:


Я не особо в javascript, поэтому и спрашивал ссылочку на какой нибудь интересный пример для реализации открывания блоков через ID
Александрответить
дык, я вам и дал простой пример открывания без десятков килобайт кода в виде jQuery и прочего
михаил (гость) • ответить
Как сделать чтобы при клике на другой блок предыдущий закрывался?
Александрответить
посмотрите комментарий от 3 Февраля 2011

 
 
  Имя *:   Решите пример *: =
 
Полужирный Курсив Подчеркнутый Перечеркнутый
 
Вставить изображение Сделать цитатой Вставить ссылку Вставить код

Вставить смайл
 
 

 



© S3.Blog: Если критикуешь, не предлагая решения проблемы, то ты становишься частью этой проблемы.