πŸ“Έ Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π³Π°Π»Π΅Ρ€Π΅ΡŽ Π² стилС Instagram

Π“Π°Π»Π΅Ρ€Π΅ΠΈ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ с Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΎΠΉ выглядят соврСмСнно ΠΈ ΡƒΠ·Π½Π°Π²Π°Π΅ΠΌΠΎ. РассказываСм, ΠΊΠ°ΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ CSS ΠΈ JS пСрСнСсти Π·Π½Π°ΠΊΠΎΠΌΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΡƒ Π² ваши Π²Π΅Π±-прилоТСния.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ Π΄Π²Π° Ρ‚ΠΈΠΏΠ° Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… списков ΠΈ Π³Π°Π»Π΅Ρ€Π΅ΡŽ. Π’Π½Π°Ρ‡Π°Π»Π΅ Π² тСорСтичСской части опишСм, ΠΊΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ элСмСнтов интСрфСйса Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ. Π’ практичСской части рассмотрим, ΠΊΠ°ΠΊ Π²ΠΎΠΏΠ»ΠΎΡ‚ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΡƒ Π² CSS ΠΈ JavaScript.

ВСория: Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ списки ΠΈ галСрСя

ΠŸΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Π°Ρ Π½ΠΈΠΆΠ΅ анимация ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ список со свободным скроллингом. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρƒ ΠΌΠΎΠΆΠ½ΠΎ свободно ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Π²Π»Π΅Π²ΠΎ ΠΈ Π²ΠΏΡ€Π°Π²ΠΎ. Бписок ΠΌΠΎΠΆΠ½ΠΎ слСгка ΠΎΡ‚Ρ‚ΡΠ³ΠΈΠ²Π°Ρ‚ΡŒ Π½Π° ΠΊΡ€Π°ΠΉΠ½ΠΈΡ… элСмСнтах. Π­Ρ‚ΠΎ Π΄Π°Ρ‘Ρ‚ подсказку ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΎ Π³Ρ€Π°Π½ΠΈΡ†Π°Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π“ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ список со свободной ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΎΠΉ (free-scrolling horizontal lists)

Π“ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ список со снэппингом – ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚ΠΎ ΠΆΠ΅ самоС, Π½ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ элСмСнт списка ΠΏΡ€ΠΈ Ρ‚Π°ΠΏΠ΅ замСняСтся Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ.

Π“ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ список со снэппингом (snapping horizontal lists)

Оба элСмСнта ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ я Π² сочСтании, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, список со снэппингом для ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, относящихся ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΡΡŽΠΆΠ΅Ρ‚Ρƒ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ, Π° список с ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΎΠΉ – для быстрого пСрСмСщСния ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚Π°ΠΊΠΈΠΌΠΈ Ρ€Π°Π·Π΄Π΅Π»Π°ΠΌΠΈ.

Π’Ρ€Π΅Ρ‚ΠΈΠΉ рассматриваСмый элСмСнт – галСрСя. Она ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° snapping-списки, Π½ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ всё ΠΏΠΎΠ»Π΅, ΠΊΠ°ΠΊ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ постС Instagram ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΉ. Под ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°ΠΌΠΈ располоТСн ряд Ρ‚ΠΎΡ‡Π΅ΠΊ – ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ изобраТСния. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ понятно, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ изобраТСния ΠΈ ΠΊΠ°ΠΊΠΎΠ΅ ΠΈΠ· Π½ΠΈΡ… Π²ΠΈΠ΄Π½ΠΎ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π³Π°Π»Π΅Ρ€Π΅ΠΈ

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ

1. Π“ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ списки со свободной ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΎΠΉ

Для Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ списка ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ flexbox, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠΌ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ скроллинг. Π Π°Π·ΠΌΠ΅Ρ€ элСмСнтов списка ΡƒΠΊΠ°ΠΆΠ΅ΠΌ явно, ΠΊΠ°ΠΊ ΠΈ Π·Π°Π·ΠΎΡ€ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ. Поля установим бо́льшими, Ρ‡Π΅ΠΌ Π·Π°Π·ΠΎΡ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π΄ΠΎΠΊΡ€ΡƒΡ‚ΠΈΠ»ΠΈ Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ†Π° списка.

.list {
  display: flex;
  padding: 20px;
  overflow-x: scroll;
}

.item {
  height: 224px;
  width: 125px;
  flex-shrink: 0;
}

.item:not(:last-child) { margin-right: 10px; }

Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ прСдставлСниС ΠΈ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ доступны Π² Π² сэндбоксС:

Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ.

ПовСдСниС ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠ΅ Π²Π»Π΅Π²ΠΎ. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… свайп Π²Π»Π΅Π²ΠΎ повторяСт дСйствиС ΠΊΠ½ΠΎΠΏΠΊΠΈ «Назад». Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ, установив для overscroll-behavior Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ contain.

ΠŸΠΎΠ»ΠΎΡΡƒ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ, установив overflow-x Π² auto. Однако ΠΏΡ€ΠΈ скроллингС полоса вновь появится. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ scrollbar-width Π² none. На ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания ΡΡ‚Π°Ρ‚ΡŒΠΈ это Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Firefox. Для Π΄Ρ€ΡƒΠ³ΠΈΡ… Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ² придСтся Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚Ρ€ΡŽΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π° Π² CSS:

.list { -ms-overflow-style: none; }
.list::-webkit-scrollbar { display: none; }

Плавная ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠ°. Π’ iOS Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ стандартной ΠΏΠ»Π°Π²Π½ΠΎΠΉ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ (momentum scrolling). ΠŸΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ -webkit-overflow-scrolling: touch;.

ΠŸΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°Ρ‚ΡŒ страницу ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ. Π­Ρ‚Ρƒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… устройств, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΠΊ списку touch-action: pan-x. Однако Ссли список ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ всю Π²ΠΈΠ΄ΠΈΠΌΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ просмотра, Π° Π½Π° страницС Π΅ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Ρ‘, эти элСмСнты станут нСдоступны. Π’ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π½Π°Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π½Π°ΡˆΠΈΡ… ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ CSS Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

.list {
  display: flex;
  overflow-x: scroll;
  padding: 20px;

  /* ΠŸΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ случайноС использованиС "Назад"*/
  overscroll-behavior: contain;

  /* Π‘ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ полосу ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ */
  scrollbar-width: none;
  -ms-overflow-style: none;

  /* Плавная ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠ° Π½Π° iOS */
  -webkit-overflow-scrolling: touch;

  /* ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ скроллинг для Ρ‚Π°Ρ‡-устройств */
  touch-action: pan-x;
}

/* Π‘ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ полосу ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ  */
.list::-webkit-scrollbar {
  display: none;
}

.item {
  height: 224px;
  width: 125px;
  flex-shrink: 0;
}

.item:not(:last-child) {
  margin-right: 10px;
}

/* фикс для отступов Π² ΠΊΠΎΠ½Ρ†Π΅ списка */
.item:last-child {
  position: relative;
}

.item:last-child::after {
  position: absolute;
  left: 100%;
  height: 1px;
  width: 20px;
  display: block;
  content: "";
}

А Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выглядит Π²ΠΎΡ‚ Ρ‚Π°ΠΊ (Ρ‚Π°ΠΌ ΠΆΠ΅ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°):

2. Π“ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ список со снэппингом

Для описания этого Ρ‚ΠΈΠΏΠ° списков отталкиваСмся ΠΎΡ‚ списка со свободной ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΎΠΉ. Π‘Π½Π°Ρ‡Π°Π»Π° сообщаСм списку, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ:

.list {
  scroll-snap-type: x mandatory;
}

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Π°ΠΌ списка добавляСм ΠΎΠΏΡ†ΠΈΡŽ scroll-snap-align: start. Π§Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Ρ‚ΡŒ подсказку, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Β«Π²Ρ‹Π³Π»ΡΠ΄Ρ‹Π²Π°Ρ‚ΡŒΒ» ΠΈΠ·-Π·Π° края экрана. Для этого достаточно ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ отступ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ: scroll-padding-inline-start: 20px. Если хочСтся ΡΠ²Π°ΠΉΠΏΠ½ΡƒΡ‚ΡŒ ΠΎΠ΄Π½ΠΈΠΌ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ΠΌ нСсколько элСмСнтов, ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ scroll-snap-stop: always ΠΊ элСмСнтам списка, Π½ΠΎ Π½Π΅ всС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ ΠΏΠΎΠΊΠ° Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚.

Код ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π»ΠΎΠΆΠ΅Π½ Π½Π° Codesandbox:

3. ГалСрСя Π² стилС Instagram

Если ΠΌΡ‹ сдСлаСм наш ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ список Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΡˆΠΈΡ€ΠΎΠΊΠΈΠΌ, ΠΊΠ°ΠΊ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ, ΠΈ ΡƒΠ΄Π°Π»ΠΈΠΌ отступы, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΈ вСсти сСбя ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ галСрСя Instagram. Π—Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠ°Π»Π΅Π½ΡŒΠΊΠΈΡ… Ρ‚ΠΎΡ‡Π΅ΠΊ. Π‘Π΅Π· Ρ‚ΠΎΡ‡Π΅ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Но ΠΊΠ°ΠΊ ΠΌΡ‹ поясняли Π² тСорСтичСской части, эти малСнькиС Ρ‚ΠΎΡ‡ΠΊΠΈ – ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ графичСский ΠΏΡ€ΠΈΡ‘ΠΌ. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· элСмСнтов списка сСйчас Π²ΠΈΠ΄Π΅Π½. НаиболСС простой способ – ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ IntersectionObserver.

Боставим список Ρ‚ΠΎΡ‡Π΅ΠΊ, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… соотвСтствуСт ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ. Когда ΠΎΠ½Π° пролистываСтся Π² спискС, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ индСкс элСмСнта ΠΈ устанавливаСм ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ индСксом Π² Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ это Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ:

// ссылки Π½Π° элСмСнты DOM
const list = document.querySelector('.list');
const items = Array.from(document.querySelectorAll('.item'));
const indicators = Array.from(document.querySelectorAll('.indicator'));

// созданиС Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Ρ
const observer = new IntersectionObserver(onIntersectionObserved, {
  root: list,
  threshold: 0.6
});

// наблюдаСм Π·Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ элСмСнтом
items.forEach(item => {
  observer.observe(item);
});

// ΠΊΠΎΠ³Π΄Π° observer ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ записи
// (ΠΏΡƒΠ½ΠΊΡ‚, входящий Π² список)
// ΠΈ эта запись пСрСсСкаСтся,
// ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ индСкс ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‰Π΅Π³ΠΎΡΡ элСмСнта
// устанавливаСм Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π² Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
function onIntersectionObserved(entries) {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const intersectingIndex = items.indexOf(entry.target);
      activateIndicator(intersectingIndex);
    }
  });
}

function activateIndicator(index) {
  indicators.forEach((indicator, i) => {
    indicator.classList.toggle('active', i === index);
  });
}

ΠŸΠΎΠ»Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ доступСн Π² сэндбоксС:

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
ΠœΡ‹ установили ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0.6. Π’ΠΎ Π΅ΡΡ‚ΡŒ Ссли 60% элСмСнта находится Π² ΠΏΠΎΠ»Π΅ зрСния, Ρ‚ΠΎ ΠΌΡ‹ считаСм Π΅Π³ΠΎ Β«ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‰ΠΈΠΌΡΡΒ». Если установим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½Ρ‹ΠΌ 1, Ρ‚ΠΎ пСрСсСкаСмым Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΉ элСмСнт.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠœΡ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈ нСсколько Π²Π°Ρ€ΠΈΠ°Ρ†ΠΈΠΉ построСния Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… списков ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Π£ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π΅ΡΡ‚ΡŒ ΠΈ свои нСдостатки, ΠΈ прСимущСства. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ нативная ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠ°, Π½Π΅Ρ‚ возмоТности Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ способ двиТСния, ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Β«Π»ΠΈΠΏΠΊΠΎΡΡ‚ΡŒΒ» ΠΏΠΎΠ»Π·ΡƒΠ½ΠΊΠ° (Π² этом случаС ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π΅Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° JavaScript). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² нашСм Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΠΌΡ‹ использовали Π½Π΅ самыС стандартныС ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ Π² CSS. Однако ΠΎΠ±ΡŠΡ‘ΠΌ ΠΊΠΎΠ΄Π° Π½Π΅Π²Π΅Π»ΠΈΠΊ, ΠΈ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΄Π°ΠΆΠ΅ Π² старых Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ….

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста
06 фСвраля 2017

15 прСкрасных ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² для Sublime Text

ВстрСчайтС список ΠΏΠ΅Ρ€Π²ΠΎΠΉ нСобходимости – 15 самых Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² для Subli...