Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Переписать код (https://javascript.ru/forum/dom-window/79539-perepisat-kod.html)

LADYX 20.02.2020 10:56

Переписать код
 
Здравствуйте. Есть у меня такой код на jQuery. А как можно его же написать, но только на нативном JavaScript?
$(document).ready(function() {
  var list = $(".wrapper-boxes .box");
  var numToShow = 10;
  var button = $("button");
  var numInList = list.length;
  list.hide();
  if (numInList > numToShow) {
    button.show();
  }
  list.slice(0, numToShow).show();
  button.click(function() {
    var showing = list.filter(':visible').length;
    list.slice(showing - 1, showing + numToShow).fadeIn();
    var nowShowing = list.filter(':visible').length;
    if (nowShowing >= numInList) {
      button.hide();
    }
  });
});

рони 20.02.2020 11:49

LADYX,
Скрыть элементы больше чем ...

LADYX 20.02.2020 13:31

рони,
Цитата:

Сообщение от рони
Скрыть элементы больше чем ...

Это другое, там показать/спрятать.
А у меня скрипт по кнопке выводит по N элементов. И когда уже все элементы показаны, кнопка скрывается.

voraa 20.02.2020 14:33

Cтранно смншивать show/hide и fadeIn
Это, насколькоя я помню, немного разные вещи.
fadeIn делает элемент непрозрачным
А show/hide показывают/убирают через display:
Но, как написано, так и перевожу

Определить дополнительно стили

/*Многие современные браузеры используют это по умолчанию, но лишним не будет*/
[hidden] {
  display:none;
}

.fadein {
  opacity: 1;
}


document.addEventListener("DOMContentLoaded", () => {
  let list = document.querySelectorAll(".wrapper-boxes .box")
  var numToShow = 10;
  var button = document.querySelectorAll("button");
  var numInList = list.length;
  list.forEach(el => el.hidden = true)
  if (numInList > numToShow) {
//    button.show();  // ??? А как они были скрыты
// Если через hidden то
       button.forEach(el => el.hidden = false)   
  }
  list.slice(0, numToShow).forEach(el => el.hidden = false);
  button.forEach(el => {
    el.addEventListener("click", () => {
      var showing = document.querySelectorAll('.wrapper-boxes .box:visible').length
	  list.slice(showing - 1, showing + numToShow).forEach(el => el.classList.add('fadein'));
      var nowShowing = document.querySelectorAll('.wrapper-boxes .box:visible').length
      if (nowShowing >= numInList) {
        button.forEach(el => el.hidden = true)
      }
    })  
  })
})

рони 20.02.2020 15:06

Цитата:

Сообщение от voraa
Cтранно смншивать show/hide и fadeIn
Это, насколькоя я помню, немного разные вещи.

почти одинаковые.

рони 20.02.2020 15:19

LADYX,
структуру html неплохо было бы показать.

LADYX 20.02.2020 17:47

рони,
Цитата:

Сообщение от рони
структуру html неплохо было бы показать.

А вот она:
<style>
.wrapper-boxes {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
}

.box {
  position: relative;
  margin: 5px;
  width: 10px;
  height: 10px;
  background-color: black;
}
</style>
<div class="wrapper-boxes">
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
</div>
<button>Ещё</button>

Элементов .box естественно может быть много

voraa 20.02.2020 17:52

Цитата:

Сообщение от рони (Сообщение 520400)
почти одинаковые.

Почти.
Выглядит так.
Посмотрите код jquery.
show/hide, если не заданы параметры меняют display:
fadeIn даже без параметров меняет opacity:
Только без параметров это делается мгновенно, без анимации.

рони 20.02.2020 19:28

voraa,
все эти методы меняют и display и opacity, без параметров "мгновенно" это 400ms.
есть разница, но в этом они одинаковы.

рони 20.02.2020 20:47

LADYX,
<!DOCTYPE html>
<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style>
.wrapper-boxes {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
}

.box {
  position: relative;
  margin: 5px;
  width: 10px;
  height: 10px;
  background-color: black;
}
.box.nextstop ~ .box {
    display: none;
}
 </style>

  <script>
document.addEventListener( "DOMContentLoaded" , function() {
  const limit = 5;
  const nextOpen = (wrapper, button) => {
  const boxs = wrapper.querySelectorAll(".box"),
        len = boxs.length - 2,
        endBox = wrapper.querySelector(".nextstop"),
        index = [...boxs].indexOf(endBox) + limit;
        if(endBox) endBox.classList.remove("nextstop");
        if(index < len) boxs[index].classList.add("nextstop");
        else button.remove()
  }
  document.querySelectorAll(".wrapper-boxes").forEach(wrapper => {
  const button = wrapper.nextElementSibling;
        button.addEventListener("click", nextOpen.bind(null,wrapper, button));
        nextOpen(wrapper, button);
  })
 });
  </script>
</head>
<body>

<div class="wrapper-boxes">
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
</div>
<button>Ещё</button>

<div class="wrapper-boxes">
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
</div>
<button>Ещё</button>

<div class="wrapper-boxes">
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
</div>
<button>Ещё</button>
</body>
</html>


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