Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Изменение размера элемента при клике (https://javascript.ru/forum/dom-window/43401-izmenenie-razmera-ehlementa-pri-klike.html)

danik.js 04.12.2013 16:10

Цитата:

Сообщение от Poznakomlus
return target.tagName == 'A';

А как же кнопки, селекты, чекбоксы и тд и тп. Ты все это собрался перечислить? Ну удачи :)

Vlasenko Fedor 04.12.2013 23:48

Цитата:

Сообщение от danik.js (Сообщение 284536)
Ты все это собрался перечислить

Да нет. Я за спичками то зашел, а то в каждом посте все новые задачи. Может они и не нужны были Т.С.
<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

Derekovich 05.12.2013 02:20

$('.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 весь( и вообще похоже это все на говнокод) я слабоват еще)

danik.js 05.12.2013 02:40

Мой вариант, переписанный с использованием 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>

Vlasenko Fedor 05.12.2013 03:05

<!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:
А код то становится все короче

рони 05.12.2013 03:36

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>

рони 05.12.2013 03:46

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>

рони 05.12.2013 10:03

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>

Derekovich 05.12.2013 14:02

В данном примере меняется только добавление/удаление единственного класса к элементу. А вот например как сделать, если есть 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" и т.д. Возможно я неправильно сделал разметку, сейчас получается мне нужно для каждого клика необходимо писать обработчик клика, что не есть хорошо. Заранее благодарен!

danik.js 05.12.2013 14:58

Цитата:

Сообщение от Derekovich
добавляю только в конце класса порядковый номер

Зачем? Не нужно этого делать.


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