Как исправить баг анимации у Isotope filter?

194
19 июля 2018, 15:20

Недавно начал пользоваться Isotope filter для фильтрации каталога. Но когда попытался добавить к нему transition c border и transform, при переключении фильтра ячейки начали вести себя странно.

Анимация перестановки ячеек проигрываться 2 раза, причем второй раз быстрее первого, ссылка

// external js: isotope.pkgd.js 
 
// init Isotope 
var $grid = $('.grid').isotope({ 
  itemSelector: '.element-item', 
  layoutMode: 'fitRows' 
}); 
// filter functions 
var filterFns = { 
  // show if number is greater than 50 
  numberGreaterThan50: function() { 
    var number = $(this).find('.number').text(); 
    return parseInt(number, 10) > 50; 
  }, 
  // show if name ends with -ium 
  ium: function() { 
    var name = $(this).find('.name').text(); 
    return name.match(/ium$/); 
  } 
}; 
// bind filter button click 
$('.filters-button-group').on('click', 'button', function() { 
  var filterValue = $(this).attr('data-filter'); 
  // use filterFn if matches value 
  filterValue = filterFns[filterValue] || filterValue; 
  $grid.isotope({ 
    filter: filterValue 
  }); 
}); 
// change is-checked class on buttons 
$('.button-group').each(function(i, buttonGroup) { 
  var $buttonGroup = $(buttonGroup); 
  $buttonGroup.on('click', 'button', function() { 
    $buttonGroup.find('.is-checked').removeClass('is-checked'); 
    $(this).addClass('is-checked'); 
  }); 
});
* { 
  box-sizing: border-box; 
} 
 
body { 
  font-family: sans-serif; 
} 
 
 
/* ---- button ---- */ 
 
.button { 
  display: inline-block; 
  padding: 10px 18px; 
  margin-bottom: 10px; 
  background: #EEE; 
  border: none; 
  border-radius: 7px; 
  background-image: linear-gradient( to bottom, hsla(0, 0%, 0%, 0), hsla(0, 0%, 0%, 0.2)); 
  color: #222; 
  font-family: sans-serif; 
  font-size: 16px; 
  text-shadow: 0 1px white; 
  cursor: pointer; 
} 
 
.button:hover { 
  background-color: #8CF; 
  text-shadow: 0 1px hsla(0, 0%, 100%, 0.5); 
  color: #222; 
} 
 
.button:active, 
.button.is-checked { 
  background-color: #28F; 
} 
 
.button.is-checked { 
  color: white; 
  text-shadow: 0 -1px hsla(0, 0%, 0%, 0.8); 
} 
 
.button:active { 
  box-shadow: inset 0 1px 10px hsla(0, 0%, 0%, 0.8); 
} 
 
 
/* ---- button-group ---- */ 
 
.button-group:after { 
  content: ''; 
  display: block; 
  clear: both; 
} 
 
.button-group .button { 
  float: left; 
  border-radius: 0; 
  margin-left: 0; 
  margin-right: 1px; 
} 
 
.button-group .button:first-child { 
  border-radius: 0.5em 0 0 0.5em; 
} 
 
.button-group .button:last-child { 
  border-radius: 0 0.5em 0.5em 0; 
} 
 
 
/* ---- isotope ---- */ 
 
.grid { 
  border: 1px solid #333; 
} 
 
 
/* clear fix */ 
 
.grid:after { 
  content: ''; 
  display: block; 
  clear: both; 
} 
 
 
/* ---- .element-item ---- */ 
 
.element-item { 
  position: relative; 
  float: left; 
  width: 100px; 
  height: 100px; 
  margin: 5px; 
  padding: 10px; 
  background: #888; 
  color: #262524; 
  box-model: border-box; 
  transition: transform 0.1s ease-in-out, border 0.1s ease-in-out; 
} 
 
.element-item:hover { 
  transform: translate(0px, -7px); 
  border: 2px solid orange; 
} 
 
.element-item>* { 
  margin: 0; 
  padding: 0; 
} 
 
.element-item .name { 
  position: absolute; 
  left: 10px; 
  top: 60px; 
  text-transform: none; 
  letter-spacing: 0; 
  font-size: 12px; 
  font-weight: normal; 
} 
 
.element-item .symbol { 
  position: absolute; 
  left: 10px; 
  top: 0px; 
  font-size: 42px; 
  font-weight: bold; 
  color: white; 
} 
 
.element-item .number { 
  position: absolute; 
  right: 8px; 
  top: 5px; 
} 
 
.element-item .weight { 
  position: absolute; 
  left: 10px; 
  top: 76px; 
  font-size: 12px; 
} 
 
.element-item.alkali { 
  background: #F00; 
  background: hsl( 0, 100%, 50%); 
} 
 
.element-item.alkaline-earth { 
  background: #F80; 
  background: hsl( 36, 100%, 50%); 
} 
 
.element-item.lanthanoid { 
  background: #FF0; 
  background: hsl( 72, 100%, 50%); 
} 
 
.element-item.actinoid { 
  background: #0F0; 
  background: hsl( 108, 100%, 50%); 
} 
 
.element-item.transition { 
  background: #0F8; 
  background: hsl( 144, 100%, 50%); 
} 
 
.element-item.post-transition { 
  background: #0FF; 
  background: hsl( 180, 100%, 50%); 
} 
 
.element-item.metalloid { 
  background: #08F; 
  background: hsl( 216, 100%, 50%); 
} 
 
.element-item.diatomic { 
  background: #00F; 
  background: hsl( 252, 100%, 50%); 
} 
 
.element-item.halogen { 
  background: #F0F; 
  background: hsl( 288, 100%, 50%); 
} 
 
.element-item.noble-gas { 
  background: #F08; 
  background: hsl( 324, 100%, 50%); 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<h1>Isotope - filtering</h1> 
 
<div class="button-group filters-button-group"> 
  <button class="button is-checked" data-filter="*">show all</button> 
  <button class="button" data-filter=".metal">metal</button> 
  <button class="button" data-filter=".transition">transition</button> 
  <button class="button" data-filter=".alkali, .alkaline-earth">alkali and alkaline-earth</button> 
  <button class="button" data-filter=":not(.transition)">not transition</button> 
  <button class="button" data-filter=".metal:not(.transition)">metal but not transition</button> 
  <button class="button" data-filter="numberGreaterThan50">number > 50</button> 
  <button class="button" data-filter="ium">name ends with &ndash;ium</button> 
</div> 
 
<div class="grid"> 
  <div class="element-item transition metal " data-category="transition"> 
    <h3 class="name">Mercury</h3> 
    <p class="symbol">Hg</p> 
    <p class="number">80</p> 
    <p class="weight">200.59</p> 
  </div> 
  <div class="element-item metalloid " data-category="metalloid"> 
    <h3 class="name">Tellurium</h3> 
    <p class="symbol">Te</p> 
    <p class="number">52</p> 
    <p class="weight">127.6</p> 
  </div> 
  <div class="element-item post-transition metal " data-category="post-transition"> 
    <h3 class="name">Bismuth</h3> 
    <p class="symbol">Bi</p> 
    <p class="number">83</p> 
    <p class="weight">208.980</p> 
  </div> 
  <div class="element-item post-transition metal " data-category="post-transition"> 
    <h3 class="name">Lead</h3> 
    <p class="symbol">Pb</p> 
    <p class="number">82</p> 
    <p class="weight">207.2</p> 
  </div> 
  <div class="element-item transition metal " data-category="transition"> 
    <h3 class="name">Gold</h3> 
    <p class="symbol">Au</p> 
    <p class="number">79</p> 
    <p class="weight">196.967</p> 
  </div> 
  <div class="element-item alkali metal " data-category="alkali"> 
    <h3 class="name">Potassium</h3> 
    <p class="symbol">K</p> 
    <p class="number">19</p> 
    <p class="weight">39.0983</p> 
  </div> 
  <div class="element-item alkali metal " data-category="alkali"> 
    <h3 class="name">Sodium</h3> 
    <p class="symbol">Na</p> 
    <p class="number">11</p> 
    <p class="weight">22.99</p> 
  </div> 
  <div class="element-item transition metal " data-category="transition"> 
    <h3 class="name">Cadmium</h3> 
    <p class="symbol">Cd</p> 
    <p class="number">48</p> 
    <p class="weight">112.411</p> 
  </div> 
  <div class="element-item alkaline-earth metal " data-category="alkaline-earth"> 
    <h3 class="name">Calcium</h3> 
    <p class="symbol">Ca</p> 
    <p class="number">20</p> 
    <p class="weight">40.078</p> 
  </div> 
  <div class="element-item transition metal " data-category="transition"> 
    <h3 class="name">Rhenium</h3> 
    <p class="symbol">Re</p> 
    <p class="number">75</p> 
    <p class="weight">186.207</p> 
  </div> 
  <div class="element-item post-transition metal " data-category="post-transition"> 
    <h3 class="name">Thallium</h3> 
    <p class="symbol">Tl</p> 
    <p class="number">81</p> 
    <p class="weight">204.383</p> 
  </div> 
  <div class="element-item metalloid " data-category="metalloid"> 
    <h3 class="name">Antimony</h3> 
    <p class="symbol">Sb</p> 
    <p class="number">51</p> 
    <p class="weight">121.76</p> 
  </div> 
  <div class="element-item transition metal " data-category="transition"> 
    <h3 class="name">Cobalt</h3> 
    <p class="symbol">Co</p> 
    <p class="number">27</p> 
    <p class="weight">58.933</p> 
  </div> 
  <div class="element-item lanthanoid metal inner-transition " data-category="lanthanoid"> 
    <h3 class="name">Ytterbium</h3> 
    <p class="symbol">Yb</p> 
    <p class="number">70</p> 
    <p class="weight">173.054</p> 
  </div> 
  <div class="element-item noble-gas nonmetal " data-category="noble-gas"> 
    <h3 class="name">Argon</h3> 
    <p class="symbol">Ar</p> 
    <p class="number">18</p> 
    <p class="weight">39.948</p> 
  </div> 
  <div class="element-item diatomic nonmetal " data-category="diatomic"> 
    <h3 class="name">Nitrogen</h3> 
    <p class="symbol">N</p> 
    <p class="number">7</p> 
    <p class="weight">14.007</p> 
  </div> 
  <div class="element-item actinoid metal inner-transition " data-category="actinoid"> 
    <h3 class="name">Uranium</h3> 
    <p class="symbol">U</p> 
    <p class="number">92</p> 
    <p class="weight">238.029</p> 
  </div> 
  <div class="element-item actinoid metal inner-transition " data-category="actinoid"> 
    <h3 class="name">Plutonium</h3> 
    <p class="symbol">Pu</p> 
    <p class="number">94</p> 
    <p class="weight">(244)</p> 
  </div> 
</div>

Answer 1

Как видите создать фильтр проще простого ...на обычном hide/show

только не забываем подключать clearfix в родительский блок div.item

$("span.item1").click(function() { 
  $("div.item").hide(); 
  $("div.red").show("fast"); 
}); 
 
$("span.item2").click(function() { 
  $("div.item").hide(); 
  $("div.green").show("fast"); 
}); 
 
$("span.item3").click(function() { 
  $("div.item").hide(); 
  $("div.blue").show("fast"); 
}); 
 
$("span.item4").click(function() { 
  $("div.item").hide(); 
  $("div.yellow").show("fast"); 
}); 
 
$("span.item5").click(function() { 
  $("div.item").show("fast"); 
});
span.item { 
  border: 1px solid #ccc; 
  padding: 4px 6px; 
  border-radius: 4px; 
  cursor: pointer; 
  color: #ccc; 
} 
 
span.item:hover { 
  color: #222; 
  border: 1px solid #222; 
} 
 
.items { 
  width: 60%; 
  margin: 40px auto; 
} 
 
div.item { 
  padding: 30px; 
  float: left; 
  margin: 1px; 
} 
 
div.red { 
  background: red; 
} 
 
div.green { 
  background: green; 
} 
 
div.blue { 
  background: blue; 
} 
 
div.yellow { 
  background: yellow; 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
 
 
<span class="item item1" title="показать red">item1</span> 
<span class="item item2" title="показать green">item2</span> 
<span class="item item3" title="показать blue">item3</span> 
<span class="item item4" title="показать yellow">item4</span> 
<span class="item item5" title="показать все">view all</span> 
 
<div class="items"> 
  <div class="item red"></div> 
  <div class="item green"></div> 
  <div class="item blue"></div> 
  <div class="item red"></div> 
  <div class="item green"></div> 
  <div class="item green"></div> 
  <div class="item blue"></div> 
  <div class="item blue"></div> 
  <div class="item blue"></div> 
  <div class="item red"></div> 
  <div class="item red"></div> 
  <div class="item yellow"></div> 
  <div class="item yellow"></div> 
  <div class="item yellow"></div> 
  <div class="item red"></div> 
  <div class="item yellow"></div> 
  <div class="item yellow"></div> 
  <div class="item green"></div> 
  <div class="item green"></div> 
  <div class="item green"></div> 
</div>

READ ALSO
Как сделать такую функцию vuejs?

Как сделать такую функцию vuejs?

На странице есть иконка, при наведение на нее, она исчезает и вместо нее появляется input:

187
value для select при загрузке

value для select при загрузке

есть селект со значениями от 1 до 10как мне сделать, что при загрузке страницы у меня в селекте сразу было выбрано значение семь?

195
Добавление кнопок js, методом document.getElementById

Добавление кнопок js, методом document.getElementById

есть код, который выбирает и выводит рандомный элемент массиваЭлемент массива представляет из себя вопрос с вариантами ответов

171