Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   При клике ссылки, открыть DIV блок, и при клике ещё раз, закрыть его (https://javascript.ru/forum/misc/2238-pri-klike-ssylki-otkryt-div-blok-i-pri-klike-eshhjo-raz-zakryt-ego.html)

ghostcom 06.08.2015 17:24

Цитата:

Сообщение от Octane (Сообщение 8827)
Ну если хотите универсальный код, вот, пожалуйста, выглядеть будет примерно так:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Togglers</title>
<script type="text/javascript">
// Набор функций
var base = {
	// Поиск элементов по классу
	findClass: function(str, node) {
		 if(document.getElementsByClassName) return (node || document).getElementsByClassName(str);
		 else {
			  var node = node || document, list = node.getElementsByTagName('*'), length = list.length, Class = str.split(/\s+/), classes = Class.length, array = [], i, j, key;
			  for(i = 0; i < length; i++) {
					key = true;
					for(j = 0; j < classes; j++) if(list[i].className.search('\\b' + Class[j] + '\\b') == -1) key = false;
					if(key) array.push(list[i]);
			  }
			  return array;
		 }
	},
	// Добавление обработчиков событий
	bind: function(node, type, listener) {
		if(node.addEventListener) node.addEventListener(type, listener, false);
		//@cc_on node.attachEvent('on' + type, function() { listener.call(node); });
	},
	// Реализация DOMContentLoaded
	init: [],
	ready: function() {
		if(!arguments.callee.done) {
			arguments.callee.done = true;
			if(this.timer) clearInterval(this.timer);
			var i, length = this.init.length;
			for(i = 0; i < length; i++) this.init[i]();
			this.init = [];
		}
	},
	check: function() {
		var _this = this, listener = function() {
			_this.ready();
		};
		if(document.addEventListener) document.addEventListener('DOMContentLoaded', listener, false);
		if(/KHTML|WebKit/i.test(navigator.userAgent)) this.timer = setInterval(function() {
			if(/loaded|complete/.test(document.readyState)) base.ready();
		}, 10);
		/*@cc_on document.write(unescape('%3CSCRIPT onreadystatechange="if(this.readyState==\'complete\') base.ready()" defer=defer src=\/\/:%3E%3C/SCRIPT%3E')); @*/
		this.bind(window, 'load', listener);
	}
};

// Функции для работы с панельками
var toggler = {
	process: function() {
		var i, list = base.findClass('toggler'), length = list.length;
		for(i = 0; i < length; i++) base.bind(list[i], 'click', this.toggle);
		list = base.findClass('content');
		length = list.length;
		for(i = 0; i < length; i++) list[i].style.display = 'none';
	},
	toggle: function() {
		var content = base.findClass('content', this.parentNode)[0], e = arguments[0] || window.event;
		if(content.style.display == 'block') {
			content.style.display = 'none';
			this.innerHTML = 'Показать';
		}
		else {
			content.style.display = 'block';
			this.innerHTML = 'Скрыть';
		}
		e.preventDefault ? e.preventDefault() : e.returnValue = false;
	}
};

// Ищем блоки с классом «toggle» по событию DOMContentLoaded
base.init.push(function() {
	toggler.process();
});

// Запускаем проверку готовности DOM
base.check();
</script>
<style type="text/css">
.toggle {
width: 200px;
margin: 0 0 14px;
text-align: right;
border: 1px solid #ccc;
}
.toggle .content {
text-align: left;
border: 1px solid #ccc;
background: #eee;
}
.toggle .toggler {
font-size: 11px;
}
</style>
</head>
<body>
	<div class="toggle">
		<div class="content">Текст текст текст текст Текст текст текст текст Текст текст текст текст Текст текст текст текст</div>
		<a class="toggler" href="#">Показать</a>
	</div>
	<div class="toggle">
		<div class="content">Текст текст текст текст Текст текст текст текст Текст текст текст текст Текст текст текст текст</div>
		<a class="toggler" href="#">Показать</a>
	</div>
	<div class="toggle">
		<div class="content">Текст текст текст текст Текст текст текст текст Текст текст текст текст Текст текст текст текст</div>
		<a class="toggler" href="#">Показать</a>
	</div>
</body>
</html>

Здесь таких панелек может быть сколько угодно в коде, не используется ниодного идентифкатора, в XHTML-коде нужно только правильно классы расставить.

Подскажите пожалуйста как прикрутить плавное появления блока? через CSS-transition не получается. В Javascript не силен, только копи-паст(.

рони 06.08.2015 17:43

ghostcom,
поиск по форуму - искать открывашка выбирать из 223 вариантов

ghostcom 06.08.2015 17:46

ладно буду искать. хотелось побыстренькому:)

ghostcom 06.08.2015 17:52

И еще хотелось именно к выше указаному коду

ghostcom 06.08.2015 20:11

ок,
toggle: function() {
		var content = base.findClass('content', this.parentNode)[0], e = arguments[0] || window.event;
		if(content.style.display == 'block') {
			content.style.display = 'none';
			this.innerHTML = 'Показать';
		}
		else {
			content.style.display = 'block';
			this.innerHTML = 'Скрыть';
		}
		e.preventDefault ? e.preventDefault() : e.returnValue = false;
	}

а возможно ли вот здесь менять не стиль а класс или мож добавлять класс?

EmperioAf 06.08.2015 22:24

Цитата:

Сообщение от ghostcom
а возможно ли вот здесь менять не стиль а класс или мож добавлять класс?

можно. Но ведь количество строк меньше не станет :)

ghostcom 06.08.2015 22:50

Цитата:

Сообщение от EmperioAf (Сообщение 383019)
можно. Но ведь количество строк меньше не станет :)

А как прописать?

EmperioAf 07.08.2015 13:42

Цитата:

Сообщение от ghostcom (Сообщение 383021)
А как прописать?

создать два класса такого вида:
.displayblock {
    display: block;
}

.displaynone {
    display: none;
}


и вместо этого:

if(content.style.display == 'block') {
            content.style.display = 'none';
            this.innerHTML = 'Показать';
        }


написать:

if(content.classList.contains('displayblock')) {
            content.classList.remove('displayblock');
            content.classList.add('displaynone');
            this.innerHTML = 'Показать';
        }

ghostcom 08.08.2015 19:04

не могу разобраться, что то не то(((
Суть вопроса изначально была чтоб блок появлялся сверху вниз, а при повторном нажатии плавно уезжал вверх.

Вот мой шаблон: https://jsfiddle.net/ghostcom/xkqcn2dr/

Помогите пожалуйста!!!

P.S. И еще желательно не менять HTML часть !!

EmperioAf 08.08.2015 19:55

сделать плавно со свойством display невозможно. Можно писать своё за счёт изменения положения элемента, но проще подключить JQuery и использовать slow/hide:
http://jquery.page2page.ru/index.php...ементов

или slideDown()/slideUp() :
http://jquery.page2page.ru/index.php...ементов


Часовой пояс GMT +3, время: 22:56.