Плавное появление блоков

216
14 апреля 2018, 17:54

Подскажите, пожалуйста, как сделать, чтобы при нажатии на троеточие очень плавно появлялись другие кнопки? transition что-то не срабатывает...

    var buttons = document.querySelectorAll('ul li'); 
for (var i = 3; i < buttons.length - 2; i++) { 
     buttons[i].style.display = "none"; 
} 
 
var dots = document.querySelector('ul li span'); 
dots.onclick = function () { 
     for (var i = 0; i < buttons.length; i++) { 
         buttons[i].style.display = "inline"; 
     } 
     dots.style.display = 'none'; 
}
    ul > li { 
        display: inline; 
        padding: 10px; 
        background: #c7c7c7; 
    }
<ul> 
    <li><a href="">Следующая</a></li> 
    <li><a href="">1</a></li> 
    <li style="cursor: pointer"><span>...</span></li> 
    <li><a href="">2</a></li> 
    <li><a href="">3</a></li> 
    <li><a href="">4</a></li> 
    <li><a href="">6</a></li> 
    <li><a href="">7</a></li> 
    <li><a href="">Предыдущая</a></li> 
</ul>

Answer 1

Свойство transition не обрабатывает дискретные значения(прерывистые, состоят из отдельных значений, например block, inline, inline-block...), а только аналоговые(например цифры, цвета).

Для примера сделаем opacity: 0, а при клике будет изменять его на opacity: 1. Добавим transition: opacity 1s ease-in-out, но у нас снова ничего не работает, почему? Ответ не так очевиден, все из-за движка обрабатывающего JavaScript, а точнее его event-loop, он обрабатывает и меняет значения css свойств, но не дает время для его отрисовки браузером. Решить можно так - завернуть наше изменение свойства в setTimeout - setTimeout(() => buttons[i].style.opacity = 1, 0). SetTimeout с нулевым значением, смысл? А смысл в том, что между этими функциями будет происходить передачи контроля браузеру и он будет отрисовывать нашу анимацию.

PS dots.style.display = 'none', нужно присваивать его родителю.

PPS Более подробно с event-loop можно ознакомиться тут

var buttons = document.querySelectorAll('ul li'); 
for (var i = 3; i < buttons.length - 2; i++) { 
     buttons[i].style.display = "none"; 
     buttons[i].style.opacity = 0; 
} 
 
var dots = document.querySelector('ul li span'); 
dots.onclick = function () { 
     for (let i = 0; i < buttons.length; i++) { 
         buttons[i].style.display = "inline"; 
         setTimeout(() => buttons[i].style.opacity = 1, 0) 
     } 
     dots.parentElement.style.display = 'none'; 
}
    ul > li { 
        display: inline; 
        padding: 10px; 
        background: #c7c7c7; 
        transition: opacity 1s ease-in-out 
    }
<ul> 
    <li><a href="">Следующая</a></li> 
    <li><a href="">1</a></li> 
    <li style="cursor: pointer"><span>...</span></li> 
    <li><a href="">2</a></li> 
    <li><a href="">3</a></li> 
    <li><a href="">4</a></li> 
    <li><a href="">6</a></li> 
    <li><a href="">7</a></li> 
    <li><a href="">Предыдущая</a></li> 
</ul>

Answer 2

Вот так получилось полностью плавное появление кнопок

var buttons = document.querySelectorAll('ul li'); 
 
for (var i = 3; i < buttons.length - 2; i++) { 
  buttons[i].classList.add('hidden'); 
} 
 
var dots = document.querySelector('.d'); 
dots.onclick = function() { 
  for (var i = 0; i < buttons.length; i++) { 
    buttons[i].classList.remove('hidden'); 
  } 
  dots.style.display = 'none'; 
}
* { 
  list-style: none; 
  text-decoration: none; 
  margin: 0; 
  padding: 0; 
  box-sizing: border-box; 
} 
 
html, 
body { 
  font-family: Helvetica, sans; 
  font-size: 1em; 
  font-weight: 900; 
} 
 
ul { 
  width: 600px; 
  margin: 20px auto; 
  text-align: center; 
  display: flex; 
  justify-content: center; 
} 
 
li { 
  background: lightblue; 
  width: 50px; 
  overflow: hidden; 
  border-radius: 6px; 
  transition: all .3s linear; 
} 
 
a { 
  color: #000; 
} 
 
li.hidden { 
  visibility: hidden; 
  transition: all .3s linear; 
  opacity: 0; 
  width: 0; 
} 
 
.d { 
  line-height: 15px; 
}
<ul> 
  <li><a href="">next</a></li> 
  <li><a href="">1</a></li> 
  <li><a href="">2</a></li> 
  <li><a href="">3</a></li> 
  <li><a href="">4</a></li> 
  <li><a href="">5</a></li> 
  <li><a href="">6</a></li> 
  <li><a href="">7</a></li> 
  <li><a href="">8</a></li> 
  <li><a href="">9</a></li> 
  <li class="d"><a href="/" onclick="event.preventDefault()">...</a></li> 
  <li><a href="">prev</a></li> 
</ul>

Answer 3

// генерация разметки кнопок, для компактности примера  
let btnsHtml = (to => { let str = ''; for (let i = 2; i <= to; i++) str += `<li><a href="">${i}</a></li>\n\t`; return str; })(10);  
let list = document.querySelector('ul'); list.innerHTML = list.innerHTML.replace(/<\!--[\s\S]+-->/g, btnsHtml);  
 
// значимая часть примера начинается здесь  
var buttons = document.querySelectorAll('ul > li:nth-child(n+4):nth-last-child(n+3)');  
for (let btn of buttons) 
  btn.classList.add('collapse'); 
 
let dots = document.querySelector('ul > li:nth-child(3)'); 
dots.onclick = function () { 
  for (let btn of buttons) 
    btn.classList.remove('collapse');  
  this.classList.add('collapse'); 
}; 
ul > li { 
  display: inline-block; 
  padding: 10px; 
  background: #c7c7c7; 
  font: 12px sans-serif;  
  text-align: center; vertical-align: middle;  
} 
ul > li:nth-child(n+2):nth-last-child(n+2) { 
  width: 2ch; overflow: hidden;  
  transition: all 0.8s cubic-bezier(0.75, 0, 0.5, 1);  
} 
 
ul > li.collapse { 
  width: 0 !important;  
  padding: 10px 0; margin: 0 -2px;  
} 
 
ul > li a { text-decoration: none; } 
ul { margin: 0; padding: 0; }
<ul> 
  <li><a href="">Следующая</a></li> 
  <li><a href="">1</a></li> 
  <li style="cursor: pointer"><span>...</span></li> 
  <li><a href="">2</a></li> 
  <!-- не обращайте внимания, кнопки создаются средствами JS --> 
  <li><a href="">Предыдущая</a></li> 
</ul>

Answer 4
var dots = document.querySelector('ul li span');
dots.onclick = function () {
  for (var i = 0; i < buttons.length; i++) {
    buttons[i].slideDown( 'slow' );
  }
  dots.slideUp( 'slow' );
}
READ ALSO
Как убрать точки от &lt;li&gt;

Как убрать точки от <li>

Как можно убрать это (в неупорядоченном списке <li>):

140
Генерация HTML на основе JSON и наоборот

Генерация HTML на основе JSON и наоборот

Есть иерархическая структура полей (select,input), c возможностью для пользователя объединения и вложения их друг в другаИначе говоря дерево логических...

170
Почему не подключается Jquery?

Почему не подключается Jquery?

По какой причине не подключается JQuery?

151
Bootstrap 3 - горизонтальный скролл при row внутри container

Bootstrap 3 - горизонтальный скролл при row внутри container

Использую bootstrap 3, у страницы появляется горизонтальный скроллЕсли убрать какую-то одну секцию (section) - он исчезает

170