Packery layout flickers too much on hover

Viewed 19

My requirement is when hovering on one circle it grows with 50px and the other moves a bit from their positions as it grows.

I have achieved on mouse enter grow and on mouse leave shrink for circle - but the layout flickers way too much while going from one circle to another circle. anything can be done here with js to stop flicker?

// Dynamic font size based on outer div
flexFont = function () {
  var divs = document.getElementsByClassName("flexFont");
  for (var i = 0; i < divs.length; i++) {
    var relFontsize = divs[i].offsetWidth * 0.18;
    divs[i].style.fontSize = relFontsize + "px";
  }
};

var container = document.querySelector("#js__itemList");
var pckry = new Packery(container, {
  // Options
  itemSelector: ".item",
  gutter: 5,
});

var selectedItem = "";

// Circle Grow
function circleGrow(e) {
  if (!e.classList.contains("item")) {
    return;
  }

  if (selectedItem != e.id) {
    selectedItem = e.id;

    let widthCircle;
    let heightCircle;

    e.classList.toggle("grid-item--large");

    if (e.classList.contains("one-time-increase")) {
    } else {
      widthCircle = parseFloat(e.style.width) + 50;
      heightCircle = parseFloat(e.style.height) + 50;
      e.classList.add("one-time-increase");
    }

    e.style.width = widthCircle + "px";
    e.style.height = heightCircle + "px";

    setTimeout(() => {
      pckry.layout();
      flexFont();
    }, 250);
  }
}

// Circle Shrink
function circleShrink(e) {
  let widthCircle;
  let heightCircle;

  e.classList.toggle("grid-item--large");

  if (e.classList.contains("one-time-increase")) {
    widthCircle = parseFloat(e.style.width) - 50;
    heightCircle = parseFloat(e.style.height) - 50;
    e.classList.remove("one-time-increase");
  }

  e.style.width = widthCircle + "px";
  e.style.height = heightCircle + "px";

  setTimeout(() => {
    pckry.layout();
    flexFont();
  }, 250);

  selectedItem = "";
}

window.onload = function (event) {
  flexFont();
};
window.onresize = function (event) {
  flexFont();
};
body{margin:0;padding:100px 20px}ul,li{list-style:none;padding:0;margin:0}.item-list{max-width:950px;width:100%;margin:0 auto;overflow:hidden}.item-list .item{display:flex;background-color:#000;align-items:center;justify-content:center;flex-direction:column;transition-duration:.5s;z-index:0}.item-list .item.circle{border-radius:50%;text-align:center}.item-list .item.grid-item--large{z-index:99999999}.item-list .item *{color:#fff;margin:0}.item-list .item span{font-weight:bold;font-size:1.5em}
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JS Bubble</title>
    <link rel="stylesheet" href="css/style.css">
</head>

<body>
    <ul id="js__itemList" class="item-list">
        <li id="item1" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)" class="item circle flexFont"
            style="width: 300px; height: 300px;">
            <p>English</p>
            <span>361</span>
        </li>
        <li id="item2" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 142px; height: 142px;">
            <p>Greek</p>
            <span>8</span>
        </li>

        <li id="item3" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 160px; height: 160px;">
            <p>Cantonese</p>
            <span>12</span>
        </li>
        <li id="item4" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 100px; height: 100px;">
            <p>Catalan</p>
            <span>2</span>
        </li>
        <li id="item5" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 136px; height: 136px;">
            <p>Bengali</p>
            <span>7</span>
        </li>
        <li id="item6" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 80px; height: 80px;">
            <p>Croatian</p>
            <span>1</span>
        </li>

        <li id="item7" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 80px; height: 80px;">
            <p>Danish</p>
            <span>1</span>
        </li>
        <li id="item8" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 173px; height: 173px;">
            <p>Chinese</p>
            <span>38</span>
        </li>
        <li id="item9" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 142px; height: 142px;">
            <p>Arabic</p>
            <span>8</span>
        </li>
        <li id="item10" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 100px; height: 100px;">
            <p>Dutch</p>
            <span>2</span>
        </li>
        <li id="item11" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 163px; height: 163px;">
            <p>French</p>
            <span>15</span>
        </li>
        <li id="item12" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 100px; height:100px;">
            <p>German</p>
            <span>4</span>
        </li>
        <li id="item13" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 152px; height: 152px;">
            <p>Gujarati</p>
            <span>10</span>
        </li>
        <li id="item14" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 80px; height: 80px;">
            <p>Hebrew</p>
            <span>1</span>
        </li>
        <li id="item15" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 180px; height: 180px;">
            <p>Hindi</p>
            <span>71</span>
        </li>
        <li id="item16" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 78px; height: 78px;">
            <p>Japanese</p>
            <span>1</span>
        </li>
        <li id="item17" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 158px; height: 158px;">
            <p>Italian</p>
            <span>13</span>
        </li>
        <li id="item18" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 100px; height: 100px;">
            <p>Kannada</p>
            <span>2</span>
        </li>
        <li id="item19" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 100px; height: 100px;">
            <p>Kazakh</p>
            <span>2</span>
        </li>
        <li id="item20" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 100px; height: 100px;">
            <p>Korean</p>
            <span>2</span>
        </li>
        <li id="item21" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 80px; height: 80px;">
            <p>Latin</p>
            <span>1</span>
        </li>
        <li id="item22" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 170px; height: 170px;">
            <p>Marathi</p>
            <span>33</span>
        </li>
        <li id="item23" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 77px; height: 77px;">
            <p>Latvian</p>
            <span>1</span>
        </li>
        <li id="item24" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 80px; height: 80px;">
            <p>Lithuanian</p>
            <span>1</span>
        </li>
        <li id="item25" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 100px; height: 100px;">
            <p>Malay</p>
            <span>2</span>
        </li>
        <li id="item26" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 80px; height: 80px;">
            <p>Maltese</p>
            <span>1</span>
        </li>
        <li id="item27" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 147px; height: 147px;">
            <p>Russian</p>
            <span>9</span>
        </li>
        <li id="item28" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 100px; height: 100px;">
            <p>Romanian</p>
            <span>4</span>
        </li>
        <li id="item29" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 100px; height: 100px;">
            <p>Nepali</p>
            <span>2</span>
        </li>
        <li id="item30" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 190px; height: 190px;">
            <p>Spanish</p>
            <span>81</span>
        </li>
        <li id="item31" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 136px; height: 136px;">
            <p>Persian</p>
            <span>7</span>
        </li>
        <li id="item32" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 147px; height: 147px;">
            <p>Polish</p>
            <span>9</span>
        </li>
        <li id="item33" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 80px; height: 80px;">
            <p>Punjabi</p>
            <span>1</span>
        </li>
        <li id="item34" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 80px; height: 80px;">
            <p>Irish</p>
            <span>1</span>
        </li>
        <li id="item35" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 132px; height: 132px;">
            <p>Portuguese</p>
            <span>6</span>
        </li>
        <li id="item36" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 76px; height: 76px;">
            <p>Sindhi</p>
            <span>1</span>
        </li>
        <li id="item37" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 132px; height: 132px;">
            <p>Malayalam</p>
            <span>6</span>
        </li>
        <li id="item38" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 80px; height: 80px;">
            <p>Turkmen</p>
            <span>1</span>
        </li>
        <li id="item39" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 80px; height: 80px;">
            <p>Swedish</p>
            <span>1</span>
        </li>
        <li id="item40" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 110px; height: 110px;">
            <p>Tagalog</p>
            <span>3</span>
        </li>
        <li id="item41" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 100px; height: 100px;">
            <p>Taiwanese</p>
            <span>2</span>
        </li>
        <li id="item42" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 80px; height: 80px;">
            <p>Bulgarian</p>
            <span>1</span>
        </li>
        <li id="item43" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 136px; height: 136px;">
            <p>Tamil</p>
            <span>7</span>
        </li>
        <li id="item44" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 132px; height: 132px;">
            <p>Telugu</p>
            <span>6</span>
        </li>
        <li id="item45" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 80px; height: 80px;">
            <p>Azerbaijani</p>
            <span>1</span>
        </li>
        <li id="item46" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 100px; height: 100px;">
            <p>Thai</p>
            <span>2</span>
        </li>
        <li id="item47" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 163px; height: 163px;">
            <p>Mandarin</p>
            <span>15</span>
        </li>
        <li id="item48" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 132px; height: 132px;">
            <p>Turkish</p>
            <span>6</span>
        </li>

        <li id="item49" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 125px; height: 125px;">
            <p>Ukrainian</p>
            <span>5</span>
        </li>
        <li id="item50" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 100px; height: 100px;">
            <p>Urdu</p>
            <span>4</span>
        </li>
        <li id="item51" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 80px; height: 80px;">
            <p>Somali</p>
            <span>1</span>
        </li>
        <li id="item52" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 152px; height: 152px;">
            <p>Vietnamese</p>
            <span>10</span>
        </li>
        <li id="item53" class="item circle flexFont" onmouseenter="circleGrow(this)" onmouseleave="circleShrink(this)"
            style="width: 80px; height: 80px;">
            <p>Yoruba</p>
            <span>1</span>
        </li>
    </ul>
    <!-- Packery -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/packery/1.4.1/packery.pkgd.min.js"></script>
    <script src="js/custom.js"></script>
</body>

</html>

0 Answers
Related