Иногда, так или иначе, возникает необходимость скрыть часть информации со страницы. По разным причинам. Как по визуально-оформительским, так и из-за не особой важности или чисто технической стороне скрываемой информации. Сделать это можно многими способами. Давайте рассмотрим некоторые из них и научимся, если для вас это до сих пор «неизвестная» область, делать скрытые области/блоки, раскрывающиеся при клике, и, заодно, посмотрим, как можно их оформить для придания более интуитивно-понятного вида. Вот так «завернул». ヅ
Итак, задача: создать скрытый блок, который бы, при клике на управляющем элементе, плавно открывался, а при повторном - закрывался, сворачивался.
Задача ясна, я думаю, посмотрим на реализацию. Должно получится что-то вроде этого:
Использовать, как и написано в заголовке, будем известную во многих кругах, JavaScript библиотеку jQuery.
Информация:
Если у вас сайт на хостинге юКоз, и вы не совершали никаких действий по отключению скрипта - jQuery у вас есть, так как подключена «по умолчанию». Это, тот самый, скрипт «u.js» - который включает в себя эту библиотеку.
Если вы подобные (скрытые) блоки, используете не часто или очень редко, проще всего воспользоваться вот таким кодом, хотя это и не очень «правильно».
Набросаю неболшой код, для примера. Классы и прочее - произвольные.
Код HTML.
Code (HTML)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>hide_block_v0</title> <link rel="stylesheet" type="text/css" href="http://likbezz.ucoz.ru/_theme/_st/_ext/example_mini.css" media="screen" /> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js" type="text/javascript"></script> <style type="text/css"> /* StartStyle */ .hideWrap{} /* Общий блок */ .hideBtn{} /* Класс для ссылки/кнопки и т.п. */ .hideCont{} /* Класс блока скрытого контента */ /* EndStyle */ </style> </head>
<body> <div class="hideWrap"> <a class="hideBtn" href="javascript://" onclick="$('#hideCont1').slideToggle('normal');return false;">Показать</a> <div style="display:none;" id="hideCont1" class="hideCont">Здесь располагается содержимое class "hideCont"</div> </div> </body> </html>
Где:
<script src="http://ajax.googleapis.com/.... - подключаем библиотеку jQuery - только для примера!!!.
<link href="http://likbezz.ucoz.ru/_theme/_st/_ext/example_mini.css".... - основные стили - только для примера!!!
onclick="$('#hideCont1') - действие при клике. Применяем к блоку с ID=hideCont1.
.slideToggle('normal'); - Функция скрывает видимые элементы и показывает скрытые (в данном случае - показывает - «div style="display:none;" id="hideCont1"») используя эффект изменения высоты. Скорость (в скобочках - speed) может быть «slow», «normal», или «fast». Либо задаваться числом в мс.
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Praesent aliquam, justo convallis luctus rutrum, erat nulla fermentum diam, at nonummy quam ante ac quam. Maecenas urna purus, fermentum id, molestie in, commodo porttitor, felis. Nam blandit quam ut lacus. Quisque ornare risus quis ligula. Phasellus tristique purus a augue condimentum adipiscing. Aenean sagittis. Etiam leo pede, rhoncus venenatis, tristique in, vulputate at, odio. Donec et ipsum et sapien vehicula nonummy. Suspendisse potenti. Fusce varius urna id quam. Sed neque mi, varius eget, tincidunt nec, suscipit id, libero. In eget purus. Vestibulum ut nisl. Donec eu mi sed turpis feugiat feugiat. Integer turpis arcu, pellentesque eget, cursus et, fermentum ut, sapien. Fusce metus mi, eleifend sollicitudin, molestie id, varius et, nibh. Donec nec libero.
Наведём немного лоску. И добавим интуитивности открывающей скрытый блок ссылке. ヅ Используем CSS... Как и обычно... ヅ
Стили CSS
Code (CSS)
<style type="text/css"> /* StartStyle */ .hideWrap{ text-align:left; /* Устанавливаем выравнивание по левому краю */ clear:both; } .hideBtn{ display:block; /* Дисплей блок - для ссылки - необходимо, для установки фона */ background:transparent url("/_example/_img/_lib1/_plus.gif") no-repeat left center; /* Картинка «плюс» */ font:bold 11px/15px Verdana,sans-serif; padding:1px 14px 2px; /* Отступы - для картинки ... и вообще ... */ cursor:pointer; outline:none; /* Скрываем рамочку, при нажатии */ } .hideBtn.show{ background-image: url(/_example/_img/_lib1/_minus.gif); /* картинка «минус» - для открытого блока */ } .hideCont{ display:none; /* Скрываем контент */ } /* EndStyle */ </style>
Сам код
Code (HTML)
<div class="hideWrap"> <a class="hideBtn" href="javascript://" onclick="$('#hideCont1').slideToggle('normal');$(this).toggleClass('show');return false;">Показать</a> <div id="hideCont1" class="hideCont">Здесь располагается содержимое class "hideCont"</div> </div>
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Praesent aliquam, justo convallis luctus rutrum, erat nulla fermentum diam, at nonummy quam ante ac quam. Maecenas urna purus, fermentum id, molestie in, commodo porttitor, felis. Nam blandit quam ut lacus. Quisque ornare risus quis ligula. Phasellus tristique purus a augue condimentum adipiscing. Aenean sagittis. Etiam leo pede, rhoncus venenatis, tristique in, vulputate at, odio. Donec et ipsum et sapien vehicula nonummy. Suspendisse potenti. Fusce varius urna id quam. Sed neque mi, varius eget, tincidunt nec, suscipit id, libero. In eget purus. Vestibulum ut nisl. Donec eu mi sed turpis feugiat feugiat. Integer turpis arcu, pellentesque eget, cursus et, fermentum ut, sapien. Fusce metus mi, eleifend sollicitudin, molestie id, varius et, nibh. Donec nec libero.
Но, еслы вы используете подобную функцию достаточно часто, да и просто - для чистоты кода, проще написать функцию, которая будет выполнять открытие/сокрытие блока без лишнего вмешательства в исходный код страницы.
Функция. Назвал просто ... «function hideShow»
Code (JavaScript)
<script type="text/javascript"> function hideShow(el){ $(el).toggleClass('show').next('div.hideCont').slideToggle('normal'); return false; }; </script>
Вот такая чистенькая и незамысловатая функция получилсь. Теперь, чтобы её вызвать, достаточно написать вот так:
Code (HTML)
<div class="hideWrap"> <a class="hideBtn" href="javascript://" onclick="hideShow(this);return false;">Показать</a> <div class="hideCont">Здесь располагается содержимое class "hideCont"</div> </div>
Пояснения, думаю, излишни. Всё и так понятно. Единственное, не забывайте, что .next(); - выбирает только непосредственно следующй далее, сразу же за элементом, элемен. Вот по такому принципу «$("#el + div")». Если предполагается наличие смежных элементов - используйте «siblings». Работает по вот такому принципу $("#el ~ div") - выбирает все элементы siblings(называемые "сестринскими", "братскими").
Собираем всё вместе ... и пример(используем вместо .next(); .siblings();):
Code (JavaScript)
function hideShow(el){ $(el).toggleClass('show').siblings('div.hideCont').slideToggle('normal');return false; };
Показать | Смежные элементы: | Ссылки
Основное содержимое скрытого блока
(Здесь располагается содержимое class "hideCont")
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Praesent aliquam, justo convallis luctus rutrum, erat nulla fermentum diam, at nonummy quam ante ac quam. Maecenas urna purus, fermentum id, molestie in, commodo porttitor, felis. Nam blandit quam ut lacus. Quisque ornare risus quis ligula. Phasellus tristique purus a augue condimentum adipiscing. Aenean sagittis. Etiam leo pede, rhoncus venenatis, tristique in, vulputate at, odio. Donec et ipsum et sapien vehicula nonummy. Suspendisse potenti. Fusce varius urna id quam. Sed neque mi, varius eget, tincidunt nec, suscipit id, libero. In eget purus. Vestibulum ut nisl. Donec eu mi sed turpis feugiat feugiat. Integer turpis arcu, pellentesque eget, cursus et, fermentum ut, sapien. Fusce metus mi, eleifend sollicitudin, molestie id, varius et, nibh. Donec nec libero.
Или ещё лучше - обрабатывать все ссылки, в блоке «hideWrap»(после загрузки документа ... ヅ ) и назначать им действие при клике. Примерно вот так:
<div class="hideWrap"> <a class="hideBtn" href="javascript://" title="Показать\Скрыть блок">Показать</a> <div class="hideCont">Здесь располагается содержимое class "hideCont"</div> </div>
А саму функцию поместить в отдельный файл,и подключать к тем страницам, в которых эта функция используется. Подключать ниже $BODY$ - после контента, в самом низу... Как и рекомендуется со всеми скриптами ...
Как привязать к данному скрипту куки, чтобы у пользователя запоминалась какой блок скрыт (на его усмотрение), а какой нет... и прочие вариации на тему, описаны на форуме - Плавное сворачивание / разворачивание блока + куки(Инструкция и подробное описание привязки куки к объекту).
Очень полезная статья - пользуюсь везде (а именно самым последним вариантом, описанным в статье), где нужно аккуратно скрыть дополнительную информацию, но надо признаться js даётся трудно. Так вот встал вопрос возможно ли с помощью этого скрипта выполнить это: придать один фон ссылке (слову "Показать") и скрытому содержимому, а картинке плюс/минус другой фон. Я это реализовывала с помощью другого скрипта без эффекта плавного открытия, создавая таблицу и помещая картинку плюса/минуса в одной ячейке, а "Показать" и скрытое содержимое в другой. Выглядит, примерно, как на картинке: Вопрос, возможно ли что-то похожее сделать с помощью Вашего скрипта, чтобы скрытое содержимое открывалось плавно. Заранее благодарю.
Почему то при разрешении монитора 1280х1024 сворачивание/разворачивание идет рывками
- Разрешение монитора, я думаю, ни при чём. Основная причина - это содержание блока. Возможно, оно не определено по высоте, и, следовательно, вычисляется на лету. Также, причиной «рывков» может служить скрип в контенте блока, изменяющий содержание/свойства, или фиксированный блок с переполнением, с прокруткой. Возможным решением является - плюнуть на .slideToggle(), и прописать просто .toggle(). Тоже самое, только без вычисления высоты скрытого контента. Просто плавно открывает/закрывает скрытый блок. Пример работы можно посмотреть в FAQ - jQuery, элементы
Но ведь при разрешении 1024х768 рывков нет, да и рывки при разрешении 1280х1024 только под Windows, под Linux сворачивание/разворачивание идет очень плавно...
под Linux сворачивание/разворачивание идет очень плавно...
- ヅ - Это вообще другая тема. Под Линуксом многое по-другому.
Quote (Nigelist)
Но ведь при разрешении 1024х768 рывков нет
- У меня 1152x864. На примерах выше нет скачков. А вот на форуме, с такими же параметрами - были - переделал на просто «toggle()» - перестало. - При 800x600 - уверен, тоже не будет - другие масштабы ... ヅ Плавное сворачивание / разворачивание блока test - посмотри прыгает или нет. У меня, более-менее плавно. Ссылка на проблему не помешала бы... ヅ Кстати, в примере без стилей, вообще всё очень плавно. Гораздо глаже, чем с оформлением. Пример почти без стилей.
И правда, рывков при использовании «toggle()» практически нету. Но и сворачивание/разворачивание стало анимироваться по другому. Можно ли вернуть старую?