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...ементов

ghostcom 08.08.2015 20:01

Спасибо, буду пробовать)

2009bes 04.09.2015 13:22

Помогите,прошу вас, я уже перевернул данную тему, но не могу решить свою проблему. Как сделать чтобы спрятать содержание под картинку/банер (статичную png,gif или flash), при клике на которую будет осуществлён переход по указанной ссылке,и сам блок будет открыт, или же произойдёт открытие ссылки в новой вкладке, при этом блок будет открыт сразу

pitbullalex 19.11.2015 11:15

в этой теме был код:
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);
        
        this.bind(window, 'load', listener);
    }
};
 
// Функции для работы с панельками
var toggler = {
    current : null,
    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(toggler.current && toggler.current != content) 
		{toggler.current.style.display = 'none';

	     };
        toggler.current = content;
        if(content.style.display == 'block') {
            content.style.display = 'none';
        }
        else {
            content.style.display = 'block';
        }
        e.preventDefault ? e.preventDefault() : e.returnValue = false;
    }
};
 
// Ищем блоки с классом «toggle» по событию DOMContentLoaded
base.init.push(function() {
    toggler.process();
});
// Запускаем проверку готовности DOM
base.check();


подскажите как изменить эти функции, что бы вызывать не только для классов "'content" и "toggler"
(<a class='toggler' href='#' >$row[15]&nbsp;</a><div id='content'), но и для других классов на этой же странице
(<a class='toggler2' href='#' >$row[15]&nbsp;</a><div id='content2' - например)
, что бы не плодить этих функций (и если не сложно напишите как после этого их вызывать в HTML)
(извините за глупую просьбу, с JS пока не дружу, только учусь)

// Функции для работы с панельками
var toggler = {
    current : null,
    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(toggler.current && toggler.current != content) 
		{toggler.current.style.display = 'none';

	     };
        toggler.current = content;
        if(content.style.display == 'block') {
            content.style.display = 'none';
        }
        else {
            content.style.display = 'block';
        }
        e.preventDefault ? e.preventDefault() : e.returnValue = false;
    }
};

рони 19.11.2015 18:32

pitbullalex,
поиск по слову открывашка

Андрей111111 26.05.2017 08:18

а как добавить к данному коду функцию чтоб при навидении менялась картинка?

рони 26.05.2017 09:09

Андрей111111,
css :hover

Андрей111111 28.05.2017 14:28

в js ноль, есть скрипт
<script>
window.onload= function() {
document.getElementById('toggler').onclick = function() {
openbox('box', this);
return false;
};
};
function openbox(id, toggler) {
var div = document.getElementById(id);
if(div.style.display == 'block') {
div.style.display = 'none';
toggler.innerHTML = '<img src="/wp-content/uploads/2017/04/menu.jpg" >';

}
else {
div.style.display = 'block';
toggler.innerHTML = '<img src="/wp-content/uploads/2017/04/menu1.jpg" >';

}


var links = document.getElementById(id);

}

</script>

а куда css в скрипте включать?

рони 28.05.2017 17:22

Андрей111111,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

Андрей111111 28.05.2017 17:27

window.onload= function() {
	document.getElementById('toggler').onclick = function() {
		openbox('box', this);
		return false;
	};
};
function openbox(id, toggler) {
	var div = document.getElementById(id);
	if(div.style.display == 'block') {
		div.style.display = 'none';
		toggler.innerHTML = '<img src="/wp-content/uploads/2017/04/menu.jpg">';	
		 
	 }
	else {
		div.style.display = 'block';
		toggler.innerHTML = '<img src="/wp-content/uploads/2017/04/menu1.jpg" >';	
		
	}
	
	
	var links = document.getElementById(id);

}

рони 28.05.2017 17:31

Андрей111111,
учебник вверху, сообщения можно редактировать, а не новые писать с тем же содержанием.
медитируйте ...
<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title>Эффект перекатывания</title>
  <style>
   a.rollover {
    background: url(http://htmlbook.ru/example/images/mark.png); /* Путь к файлу с исходным  рисунком */
    display:  inline-block; /* Рисунок как блочный элемент */
    width: 151px; /* Ширина рисунка в пикселах */
    height: 40px; /* Высота рисунка */
   }
   a.rollover:hover, a.rollover.active,  #menu:hover a.rollover.active:hover  {
    background-position: 0 -40px; /* Смещение фона */
   }

   #menu:hover a.rollover.active {
    background-position: 0 0;
   }

  </style>
 </head>
  <body>
  <nav id="menu"><a href="link.html" class="rollover"></a><a href="link.html" class="rollover"></a><a href="link.html" class="rollover"></a><a href="link.html" class="rollover"></a></nav>
<script>
     window.addEventListener('DOMContentLoaded', function() {
       var menu = document.querySelector('#menu'),
       a = menu.querySelectorAll('.rollover');
       menu.addEventListener('click', function(event) {
          var el = event.target, cls = el.classList;
          if(cls && cls.contains('rollover')) {
            event.preventDefault();
            [].forEach.call( a, function(lnk) {
                   lnk == el ? lnk.classList.toggle('active'):  //или  lnk.classList.add('active')
                   lnk.classList.remove('active');
            });
          }
       });
         });
</script>
 </body>
</html>


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