CSS / Javascript анимация высоты увеличивается и уменьшается для элементов с различной высотой - PullRequest
1 голос
/ 08 января 2020

Я пытаюсь создать меню с различными вкладками, которые можно щелкнуть, чтобы развернуть, а затем снова щелкнуть, чтобы свернуть.

Я успешно использовал css анимации / переходы для достижения этой цели путем изменения максимальной высоты. Однако каждый из блоков будет содержать различное количество контента, что приведет к разной высоте. Что, в свою очередь, заставляет их анимироваться на разных скоростях.

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

Пример CSS, плюс несколько простых jQuery для добавления и удаления активного идентификатора:

.options .optionTab > div {
    max-height: 0;
    overflow: hidden;
    transition: max-height 2s ease;
}

.options .optionTab#active > div {
    max-height: 1000px;
    transition: max-height 2s ease;
}

$(".optionTab > h3").click(function() {
    if($(this).closest(".optionTab").attr("id") == "active") {
        $(this).closest(".optionTab").attr("id", "");
    }
    else {
        $(this).closest(".optionTab").attr("id", "active");        
    }
});

JSFiddle

Is Есть ли способ использовать анимацию css или javascript для достижения согласованной скорости анимации среди элементов различной высоты?

Ответы [ 3 ]

2 голосов
/ 08 января 2020

Аккордеон

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

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>jQuery UI Accordion - Collapse content</title>
  <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
  <link rel="stylesheet" href="/resources/demos/style.css">
  <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  <script>
  $( function() {
    $( "#accordion" ).accordion({
      collapsible: true,
      active: false
    });
  } );
  </script>
</head>
<body>
 
<div id="accordion">
  <h3>Section 1</h3>
  <div>
    <p>Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.</p>
  </div>
  <h3>Section 2</h3>
  <div>
    <p>Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In suscipit faucibus urna. </p>
  </div>
  <h3>Section 3</h3>
  <div>
    <p>Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui. </p>
    <ul>
      <li>List item one</li>
      <li>List item two</li>
      <li>List item three</li>
    </ul>
  </div>
  <h3>Section 4</h3>
  <div>
    <p>Cras dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia mauris vel est. </p><p>Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. </p>
  </div>
</div>
 
 
</body>
</html>
0 голосов
/ 08 января 2020

Вы можете попробовать это

$(".optionTab").each(function() {
  var self = $(this);
  var slideHolder = self.find('>div');
  var heading = self.find("h3");
  var initialHeight = slideHolder.outerHeight();
  slideHolder.css('height',0);
  
  heading.on('click', function(e) {
    e.preventDefault(); //if it is anchor tag 
    slideHolderHeight = $(this).next().outerHeight();
    var checkFlag = (slideHolderHeight > 0) ? true : false;
    console.log(slideHolder);
    
    slideHolder.animate({
     height: checkFlag ? 0 : initialHeight
   },300)
  });
});
body {
  background: #20262E;
  padding: 20px;
  font-family: Helvetica;
}

.options {
  background: #fff;
}

.options .optionTab h3 {
  background: #f3f3f3;
  padding: 1em;
  box-sizing: border-box;
  margin: 0;
  cursor: pointer;
}

.options .optionTab h3:hover {
  background: #ccc;
}

.options .optionTab > div {
  overflow: hidden;
  transition: max-height 2s ease;
}

.options .optionTab > div > div {
  padding: 1em;
  box-sizing: border-box;
}
0 голосов
/ 08 января 2020

Я заметил, что вы используете облегчение в своем CSS переходе.

Попробуйте изменить функцию времени перехода на линейный . Возможно, изменение временной функции приведет к изменению высоты, завершающей анимацию за одно и то же время. Также попробуйте easy-out .

...