Цитата:
|
Цитата:
<head> <style> .float { height: 20px; background: yellow; } .size { height:100px } </style> </head> <body> <a href="http://mail.ru">Mail.ru</a> <div class="float"></div> <script> (function () { var element = document.querySelector('.float'); document.onclick = function (event) { event = event || window.event; var target = event.target || event.srcElement; if (target.tagName == "DIV" && (target.className == 'float' || target.className == 'float size')) { element.className = 'float' + (target.className == 'float' ? ' size' : ''); return false; } if (element.className == 'float size') { element.className = 'float'; } } })(); </script> </body> http://learn.javascript.ru/play/FaPQPb |
$('.float').click(function() { $('.float').toggleClass('size'); }); $(document).click(function(event){ if($(event.target).hasClass('float') return; if(!$(event.target).hasClass('size') && $('.float').hasClass('size')){ $('.float').toggleClass('size'); } }); Вообще пробую так как написал выше. Делаю проверку, если клик на элементе, то возврат. Если клик вне элемента и элемент имеет класс size то тогда убирать класс у него. На одном элементе работает такая схема, а когда элементов несколько то беда... Задача была у меня следующая: есть 4 картинки с описанием каждой, при клике на картинку необходимо увеличивать ее размер и показывать описание, мой способ работает если документ один, когда элементов несколько не хочет, плывет css весь( и вообще похоже это все на говнокод) я слабоват еще) |
Мой вариант, переписанный с использованием jQuery и слегка измененный.
<style> .float{height: 20px;background: yellow;margin-bottom:10px;} .size{height:100px} </style> <div class="float"></div> <div class="float"></div> <div class="float"></div> <script src="http://code.jquery.com/jquery-latest.min.js"></script> <script> (function(){ var $target = null; var skipClick = false; var onDocumentClick = function() { $target.removeClass('size'); $target = null; return false; }; var onElementClick = function() { if (!skipClick) { setTimeout(function(){ $(document).one('click', onDocumentClick); }); skipClick = true; $target = $(this); $target.addClass('size'); return false; } skipClick = false; }; $('.float').click(onElementClick); })(); </script> |
<!DOCTYPE HTML> <head> <style> .float { height: 80px; background: yellow; width:120px; margin: 5px; float: left; } .size { height:160px } </style> </head> <body> <div class="float"> <div>Test</div> </div> <div class="float"></div> <div class="float"></div> <div class="float"></div> <script> (function () { document.onclick = function (event) { event = event || window.event; var target = event.target || event.srcElement, active = this.querySelector('.size'), elCls; while (target != this) { elCls = target.className; elCls == 'float' && (target.className += ' size') || elCls == 'float size' && (target.className = 'float'); target = target.parentNode; } active && (active.className = 'float'); } }()); </script> </body> http://learn.javascript.ru/play/YGn0Sb:dance: А код то становится все короче |
Derekovich, при клике по элементу чередование открытия закрытия - вне элемента все закрываются
<!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style> .float{height: 20px;background: yellow;margin-bottom:10px;} .size{height:100px} </style> <script src="http://code.jquery.com/jquery-latest.min.js"></script> <script> </script> </head> <body> <div class="float"></div> <div class="float"></div> <div class="float"></div> <script> $('.float').click(function(event) { event.stopPropagation(); $(this).toggleClass('size'); }); $(document).click(function(){ $('.float').removeClass('size'); }); </script> </body> </html> |
Derekovich,
Вариант клик по другому элементу закрывает предыдущий - всё остальное как выше <!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style> .float{height: 20px;background: yellow;margin-bottom:10px;} .size{height:100px} </style> <script src="http://code.jquery.com/jquery-latest.min.js"></script> <script> </script> </head> <body> <div class="float"></div> <div class="float"></div> <div class="float"></div> <script> var floats = $('.float'); floats.click(function (event) { event.stopPropagation(); floats.not(this).removeClass('size'); $(this).toggleClass('size'); }); $(document).click(function () { floats.removeClass('size'); });</script> </body> </html> |
Derekovich,
Ещё вариант варианта выше ))) <!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style> .float{height: 20px;background: yellow;margin-bottom:10px;} .size{height:100px} </style> <script src="http://code.jquery.com/jquery-latest.min.js"></script> <script> </script> </head> <body> <div class="float"></div> <div class="float"></div> <div class="float"></div> <script> var floats = $('.float'); $(document).click(function (event) { $('.size').not(event.target).removeClass('size'); $(event.target, floats).toggleClass('size'); }); </script> </body> </html> |
В данном примере меняется только добавление/удаление единственного класса к элементу. А вот например как сделать, если есть 3 элемента с разными классами, и при клике должно также отображаться описание текста к картинке. Привожу пример самого блока:
<div class="section_1"> <div class="size_image"><img src="skin/frontend/default/il/images/img1.png" alt="" /></div> <div class="text_img1"> <p>TEXT only for img1</p> </div> </div> Таких картинок на странице 3 штуки, добавляю только в конце класса порядковый номер другой типа class="section_2", class="text_img2" и т.д. Возможно я неправильно сделал разметку, сейчас получается мне нужно для каждого клика необходимо писать обработчик клика, что не есть хорошо. Заранее благодарен! |
Цитата:
|
Часовой пояс GMT +3, время: 20:21. |