Почему эта простая анимация переключения jQuery не работает должным образом? - PullRequest
2 голосов
/ 15 сентября 2009

Ваша помощь будет очень высоко ценится. Я потратил 4 часа, пытаясь выяснить это, но безуспешно, хотя это очень простой пример:

Учитывая следующий пример (полный запуск и копирование и вставка готовы), у меня есть две странные проблемы (возникающие как в IE, так и в Firefox):

1.) При наличии строки <div id="notexid" style="clear:both;"> со следующим тегом стиля: "style="clear:both;" проблема заключается в том, что Toggle Display не "скрывает / скользит в слое. При нажатии на ссылку только слой" выдвигается (но это, конечно, не предназначено. Он должен скользить при первом щелчке и выдвигаться при следующем щелчке ....) => Таким образом, style="clear:both;" нарушает функцию переключения jQuery, но почему ??

2.) Если я удаляю style="clear:both;" (который, кажется, вызывает эту проблему), то я получаю другое странное поведение, что элемент для переключения отображается (= рендеринг слайда) не в правильном положении, а скорее на правая сторона и затем прыгает после рендеринга в конечную позицию. Но почему этот рендеринг выполняется с правой стороны, когда он позже возвращается в правильное положение ??? (Так что jQuery знает, где на самом деле правильная позиция ....)

Я был бы очень признателен, если кто-то может просто подтвердить, что это странная ошибка в jQuery, поэтому я могу представить ее как ошибку. Или, если у кого-то есть решение проблемы, это было бы еще лучше!

Большое спасибо !!

<!DOCTYPE HTML PUBLIC"-// W3C//DTD HTML 4.01 Transitional//EN"" http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <style>
*.item {clear:both;}
*.item > *.label { display:block; float:left; width:150px; }
*.item > *.content { display:block; float:left; width:220px;}
  </style>

<script type="text/javascript" language="JavaScript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
</head>


<body>
  <form method="GET" accept-charset="UTF-8" action="dddd">

    <div class="item">
      <span class="label">
        <label for="note">Label 0
        </label>
      </span>
      <span class="content">
        <textarea id="coafasf" name="casfasfasf" cols="30" rows="4">
        </textarea>
      </span>
    </div>


<script type="text/javascript">

        function toggleElement() {
          $("#notexid").slideToggle("slow");
        }

        $(document).ready ( function() {

          $("#notexid").before('<div class="item"><span class="label">&nbsp;<\/span><span class="content"><a href="javascript:toggleElement();"> CLICK HERE TO TOGGLE  <\/a><\/span><\/div>');

        }
        );

      </script> 


    <!-- INSERT style="clear:both;" Solves the formating Problem but results in a broken toggle -->

    <div id="notexid" style="clear:both;">
      <div class="item">
        <span class="label">
          <label for="note">Label 1
          </label>
        </span>
        <span class="content">
          <textarea id="test" name="test" cols="30" rows="2">
          </textarea>
        </span>
      </div>

    </div>      

    <div class="item">
      <span class="label">
        <label for="teasst">Label 2
        </label>
      </span>
      <span class="content">
        <input id="aaaaaa" name="asdfasfasf" type="text">
      </span>

    </div>


  </body>
</html>

1 Ответ

4 голосов
/ 16 сентября 2009

проблема

Вы плаваете все, что в противном случае может дать эту div высоту. Поэтому, когда jQuery идет на его анимацию и проверяет высоту, чтобы увидеть, следует ли ему уменьшить или расширить его, он видит 0 и принимает решение о расширении. Каждый раз.

Одно решение

Простое (и общее) решение этой проблемы - просто поместить что-то после плавающих дочерних элементов, установить их очистку и, следовательно, заставить родителя иметь высоту - например:

<div id="notexid" style="clear:both;">
  <div class="item" >
    <span class="label"><label for="note">Label 1</label></span>
    <span class="content">
      <textarea id="test" name="test" cols="30" rows="2" ></textarea>
    </span>
  </div>

  <br clear="all"> <!-- you could probably find something less useless... -->

</div>

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

Лучшее решение

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

*.item > *.label { display:block; float:left; width:150px; }
*.item > *.content { display:block; width:220px; overflow:hidden; }

Теперь плавают только метки. Содержимое размещается и занимает обычное место, позволяя ярлыкам плавать поблизости. Обратите внимание на добавление стиля overflow:hidden: это позволяет негабаритным детям выходить из блоков content и разрушать ваш макет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...