CSS 26    CSS3 10    HTML 2    JavaScript 43    Wordpress 3    Блог 12    Инструменты 1    Не советую 1    Полезные ресурсы 4    Счетчики 1    Шпаргалки 6    Зарегистрироваться 33   Войти

Меню

Добро пожаловать, Гость! Вы можете Войти или Зарегистрироваться.

46

Раскрывающиеся блоки (div) на JavaScript

Jemand 12436 ,
JavaScript

Замечательные горизонтальные раскрывающиеся блоки. Применять можно где угодно и для чего угодно.
1. CSS

#slider {
	width: 508px;
	color: #fff;
	font-family: Georgia;
	font-size: 14px;
	}
.header {
	width: 488px;
	border: 2px solid #3F3F3F;
	padding: 8px;
	font-weight: bold;
	margin-top: 5px;
	cursor: pointer;
	background: url(images/header.png);
	text-align: center;
	}
.header:hover {
	background: url(images/header_over.png);
	color: #B7B7B7;
	}
.content {
	overflow: hidden;
	}
.text {
	width: 474px;
	border: 2px solid #3F3F3F;
	border-top: none;
	padding: 15px;
	text-align: left;
	background: #7F7F7F;
	}

2. JavaScript
Данный код вставляем перед закрывающим тегом </head>.

<script type="text/javascript">
var array = new Array();
var speed = 10;
var timer = 10;

// Loop through all the divs in the slider parent div //
// Calculate seach content divs height and set it to a variable //
function slider(target,showfirst) {
  var slider = document.getElementById(target);
  var divs = slider.getElementsByTagName('div');
  var divslength = divs.length;
  for(i = 0; i < divslength; i++) {
    var div = divs[i];
    var divid = div.id;
    if(divid.indexOf("header") != -1) {
      div.onclick = new Function("processClick(this)");
    } else if(divid.indexOf("content") != -1) {
      var section = divid.replace('-content','');
      array.push(section);
      div.maxh = div.offsetHeight;
      if(showfirst == 1 && i == 1) {
        div.style.display = 'block';
      } else {
        div.style.display = 'none';
      }
    }
  }
}

// Process the click - expand the selected content and collapse the others //
function processClick(div) {
  var catlength = array.length;
  for(i = 0; i < catlength; i++) {
    var section = array[i];
    var head = document.getElementById(section + '-header');
    var cont = section + '-content';
    var contdiv = document.getElementById(cont);
    clearInterval(contdiv.timer);
    if(head == div && contdiv.style.display == 'none') {
      contdiv.style.height = '0px';
      contdiv.style.display = 'block';
      initSlide(cont,1);
    } else if(contdiv.style.display == 'block') {
      initSlide(cont,-1);
    }
  }
}

// Setup the variables and call the slide function //
function initSlide(id,dir) {
  var cont = document.getElementById(id);
  var maxh = cont.maxh;
  cont.direction = dir;
  cont.timer = setInterval("slide('" + id + "')", timer);
}

// Collapse or expand the div by incrementally changing the divs height and opacity //
function slide(id) {
  var cont = document.getElementById(id);
  var maxh = cont.maxh;
  var currheight = cont.offsetHeight;
  var dist;
  if(cont.direction == 1) {
    dist = (Math.round((maxh - currheight) / speed));
  } else {
    dist = (Math.round(currheight / speed));
  }
  if(dist <= 1) {
    dist = 1;
  }
  cont.style.height = currheight + (dist * cont.direction) + 'px';
  cont.style.opacity = currheight / cont.maxh;
  cont.style.filter = 'alpha(opacity=' + (currheight * 100 / cont.maxh) + ')';
  if(currheight < 2 && cont.direction != 1) {
    cont.style.display = 'none';
    clearInterval(cont.timer);
  } else if(currheight > (maxh - 2) && cont.direction == 1) {
    clearInterval(cont.timer);
  }
}
</script>

2.1 Подключение JavaScript
В тег <body> добавляем onload=”slider(‘slider’,0)” получая следующее:

<body onload="slider('slider',0)">

Это необходимо для того, чтобы вся конструкция заработала так, как надо.
3. HTML

<div id="slider">
	<div class="header" id="1-header">Первый блок</div>
	<div class="content" id="1-content">
		<div class="text">
			Пример раскрывающегося блока. Пример раскрывающегося блока. Пример раскрывающегося блока. Пример раскрывающегося блока. Пример раскрывающегося блока. Пример раскрывающегося блока.
		</div>
	</div>
	<div class="header" id="2-header">Второй блок</div>
	<div class="content" id="2-content">
		<div class="text">
			Пример раскрывающегося блока. Пример раскрывающегося блока. Пример раскрывающегося блока. Пример раскрывающегося блока. Пример раскрывающегося блока. Пример раскрывающегося блока.
		</div>
	</div>
	<div class="header" id="3-header">Третий блок</div>
	<div class="content" id="3-content">
		<div class="text">
			Пример раскрывающегося блока. Пример раскрывающегося блока. Пример раскрывающегося блока. Пример раскрывающегося блока. Пример раскрывающегося блока. Пример раскрывающегося блока.
		</div>
	</div>
</div>

P.S.
В приведенном выше коде используется лишь три выпадающих блока, но их можно сделать любое количество, для этого нужно взять код блока:

<div class="header" id="1-header">Название блока</div>
<div class="content" id="1-content">
	<div class="text">
		Пример раскрывающегося блока. Пример раскрывающегося блока. Пример раскрывающегося блока. Пример раскрывающегося блока. Пример раскрывающегося блока. Пример раскрывающегося блока.
	</div>
</div>

Заменить в строках id=”1-header” и id=”1-content” цифру 1 (в данном случае) на порядковый номер блока.

Демо

Рекламная пауза

» 46 комментариев

  1. 25 февраля 2011 16:17

    Thumb up 1  Thumb down+1 0

    А если content меняется динамически и в стиле overflow:visible, то в IE эта часть все равно размер не меняет…подскажите плз какая альтернатива для ослика?

    • 25 февраля 2011 18:41

      Thumb up 0  Thumb down0 0

      Дайте ссылку на проблемную страницу, посмотрим.

  2. 19 марта 2011 18:14

    Thumb up 1  Thumb down0 1

    Спасибо, круто, то что искал, делал по другому не мог избежать непонятного “дергания”, здесь все плавно!

  3. 1 апреля 2011 11:20

    Thumb up 0  Thumb down0 0

    Скажите, а как видоизменить, чтобы предыдущий блок не закрывался сам?

    • 1 апреля 2011 19:14

      Thumb up 1  Thumb down+1 0

      По простому так:
      Найти строку

      } else if(contdiv.style.display == 'block') {

      И заменить её на

      } else if(head == div && contdiv.style.display == 'block') {
  4. 2 апреля 2011 04:11

    Thumb up 0  Thumb down0 0

    Спасибо!
    Скажите, а как можно сделать сохранение в cooks???

    • 2 апреля 2011 05:14

      Thumb up 0  Thumb down-1 1

      Изучайте jQuery Cookies. В одном комментарии всего не объяснить. Возможно опишу принцип работы в одной из следующих статей.

  5. 5 апреля 2011 19:24

    Thumb up 0  Thumb down0 0

    Ок! а как сделать что-бы ВСЕ блоки выезжали допустим слева или сверху

    • 5 апреля 2011 19:36

      Thumb up 0  Thumb down0 0

      Для этого нужно переписать большую часть скрипта.

  6. 14 апреля 2011 15:03

    Thumb up 0  Thumb down0 0

    Сделал все как описан у Вас. Но проблема в том, что подменю не выезжает при клике на пункт меню. При этом оно нормально заезжает обратно.

    • 14 апреля 2011 17:45

      Thumb up 0  Thumb down0 0

      Проверяйте свой код. Или дайте ссылку на проблемную страницу.
      Я сейчас скопировал код с этой страницы в HTML файл, всё работает как надо.

  7. 29 мая 2011 16:22

    Thumb up 0  Thumb down0 0

    Довольно долго уже это ищу, но не могу найти. Скажите, а если мне для одной страницы это нужно сделать, то вот эти громоздкие коды придётся для всех прописывать. А нет вариантов, что бы только на одной странице всё прописать? То есть не залазия в head и body…

    • 30 мая 2011 11:03

      Thumb up 0  Thumb down0 0

      Всё это можно засунуть в JS файлы и подключать их к странице.

  8. 15 июня 2011 15:09

    Thumb up 1  Thumb down+1 0

    Спасибо большое!
    А много ли переписывать чтобы добиться того, чтобы блоки выезжали не вниз, а вверх?

    • 17 июня 2011 12:30

      Thumb up 1  Thumb down+1 0

      Пожалуйста :)
      Честно говоря, я не знаю много или мало, т.к. не задавался данным вопросом.

  9. 4 июля 2011 20:34

    Thumb up 0  Thumb down0 0

    Скажите, а на юкозе это работает?

  10. 7 августа 2011 23:32

    Thumb up 0  Thumb down0 0

    Не получается подключить CSS.Положил его в корневую папку сайта.
    Что ещё надо прописывать или подключать?А так всё работает,но без
    красивостей.Так у меня выглядит _xapa.dyndns.org/documents/84.html
    Если можно объяснение поподробней,для не знающих азов веб.Только учусь.

    • 8 августа 2011 09:53

      Thumb up 0  Thumb down0 0

      Если CSS находится в отдельном файле, то он подключается кодом

      <link rel="stylesheet" type="text/css" href="style.css" media="screen" />
  11. 8 августа 2011 18:36

    Thumb up 0  Thumb down0 0

    И где это прописывать?Сайт делаю через EZGenerator.Может ещё надо ссылки на изображение?

    • 8 августа 2011 19:31

      Thumb up 0  Thumb down0 0

      Этот код прописывать в раздел head Вашей страницы.
      Ссылки на изображения прописаны в CSS коде.

  12. 8 августа 2011 22:57

    Thumb up 0  Thumb down0 0

    Спасибо за подсказки.Нашел всё у себя в программе.Одно слово лох.

  13. 15 августа 2011 04:48

    Thumb up 0  Thumb down0 0

    Посмотри пожалуйста не работает на Kapcms
    _xapa.dyndns.org/kap/?page=12
    Не дает вставить эти строки затирает

    • 15 августа 2011 16:11

      Thumb up 0  Thumb down0 0

      На вскидку не могу ничего сказать, т.к. не работал с данной CMS.
      Нужен доступ до шаблона…

  14. 11 октября 2011 08:47

    Thumb up 0  Thumb down0 0

    Здравствуйте. Очень классное меню, и вообще на сайте много хороших и полезных вещей. Подскажите а можно в этом меню организовать подпункты?
    Пункт№1
    Подпункт №1
    Подпункт№1
    Пункт№2
    Примерно так.

    • 11 октября 2011 11:30

      Thumb up 0  Thumb down0 0

      Можно, но это будет уже совершенно другой скрипт…

  15. 27 октября 2011 15:48

    Thumb up 0  Thumb down0 0

    При встраивании кода в существующую страницу блоки отображаются с отступом от верхнего края страницы или ячейки таблицы(в которую встроены). Где убрать параметр не догоняю?
    Ссылка на страницу _inform-plus-l.ru/news.php

    • 27 октября 2011 16:34

      Thumb up 0  Thumb down0 0

      В коде

      #slider {
      width: 508px;
      margin-top: 300px;
      }

      Уберите margin-top: 300px;

      p.s. Мрачный код

  16. 2 ноября 2011 17:31

    Thumb up 0  Thumb down0 0

    Прошу прощения за тупой вопрос, а скрытый текст он индексируется поисковой системой?

    • 3 ноября 2011 05:59

      Thumb up 0  Thumb down0 0

      Скрытый – это в закрытых блоках?
      Текст в блоках индексируется.

  17. 17 ноября 2011 16:57

    Thumb up 0  Thumb down0 0

    Большое спасибо очень красивые блоки! Работают.
    Подскажите пожалуйста у меня есть проблема, яндекс карта не работает в блоках, помогите решить проблему пожалуйста.

    • 17 ноября 2011 16:58

      Thumb up 0  Thumb down0 0

      _uborka-pro.ru/contacts/contacts.html выложил пример посмотрите плиз

    • 18 ноября 2011 08:21

      Thumb up 0  Thumb down0 0

      Пожалуйста.
      В чем заключается проблема с картой?

  18. 18 декабря 2011 23:07

    Thumb up 1  Thumb down+1 0

    Спасибо за скрипт, но я столкнулся с проблемой. Мне на одну страницу требуется вставить несколько таких блоков. Но когда я вставляю второй он отказывается работать. Подскажите пожалуйста, как заставить работать оба?

    • 26 декабря 2011 07:54

      Thumb up 0  Thumb down0 0

      Изучите JS код примера, всё там.

      • 31 января 2012 15:51

        Thumb up 1  Thumb down+1 0

        а можно все-таки вас попросить подсказать? просто первый раз пришлось столкнуться именно с javascript, сколько перерыл информации – нигде толком не нашел(

        • 31 января 2012 21:36

          Thumb up 1  Thumb down+1 0

          Хорошо, я помогу Вам как будет время…

  19. 26 декабря 2011 07:37

    Thumb up 0  Thumb down0 0

    отображает только 5 блоков (а сделано 15). прописал везде порядковый ID – не помогло. прошу помочь.

    _spmbiysk.ru/vakansii.html

    • 26 декабря 2011 07:45

      Thumb up 0  Thumb down0 0

      Вы явно напортачили в коде, т.к. “ученик токаря” появляется при нажатии “шлифовщик по шлифовке…”.
      Скиньте мне страницу на jemand[at]yandex[dot]ru

  20. 26 декабря 2011 07:44

    Thumb up 0  Thumb down0 0

    решил проблему. точнее.. нашел “косяк” :)

  21. 19 марта 2012 11:15

    Thumb up 0  Thumb down0 0

    На IE6 сворачивание не работает. Пожалуйста, модифицируйте код. Ждем…

    • 19 марта 2012 11:29

      Thumb up 0  Thumb down0 0

      Я с IE6 не работаю. Модифицируйте сами. Ждем…


Оставить комментарий