Добрый день! Есть такая конструкция:
<div class="block1">
<div class="block1__element i-bem" data-bem='{"block1__element":{"id":1}}'>содержимое первого элемента</div>
<div class="block1__element i-bem" data-bem='{"block1__element":{"id":2}}'>содержимое второго элемента</div>
<div class="block1__element i-bem" data-bem='{"block1__element":{"id":3}}'>содержимое третьего элемента</div>
</div>
Возникла проблема получить параметр id у элемента достигнувшего верхней границы.На события скролла у родительского блока подписался.
Видится мне это так, но не уверен:
подписаться у родительского блока на изменение модификатора элемента, который можно присваивать к примеру по достижении элементом верхней границы,
определить высоту активного элемента(будем считать что модификатор ему присвоили как активный те он достиг верхней границы)
получить
params.id
только для элемента с активным модификатором.
Алгоритм звучит нормально, какая именно помощь нужна?
@tadatuta Определить, что присвоить модификатор нужно только одному элементу который достиг границы. Элементов может быть не 3, а к примеру 10 и они динамические. Пока получается при скролле только присваивать либо всем, либо только первому модификатор
В самом простом случае это будет выглядеть примерно так:
Но нужно понимать, что дергать такую математику на каждое срабатывание скролла дорого и стоит применить throttle.
И еще момент. Заметил, что в примере в js-параметрах элементов используется поле
id
. Вi-bem.js
оно имеет специальное значение для связывания разных DOM-узлов в единую сущность (см. https://ru.bem.info/platform/i-bem/html-binding/#Один-js-блок-на-нескольких-html-элементах). Если такое поведение не требуется, следует выбрать другое название для поля.С нулем не сработало, немного изменил и все отлично работает, насколько правильно по методологии? Про функцию прочитал в уже боевом проекте применю
можно чуть сократить:
ну и если высоты элементов не меняются, то лучше их отдельно закешировать, чтобы не дергать DOM на скролл лишний раз.
Высота остается неизменной при первой постройке DOM.
За состоянием элемента слежу так:
в консоль прилетает значение только для первого элемента
test
, или нужно реализовать так же перебор?достаточно просто
ну или даже просто дергать
_onCurSection
там же, где выставляется модификаторtop
.Если следить за установкой модификатора, то в
_onCurSection
прилетает только значение для первого элемента, пробовал отфильтровать, но не получилось, а нужно получить значениеparams.name
на лету именно в_onCurSection
«виноватый» элемент должен лежать в
e.bemTarget
, т.е. имя должно быть доступно поe.bemTarget.params.name
Ну конечно, так же я уже делал в меню только по клику. Спасибо!
Упрощенный отчет по завершению блока. Задача, при скролле элементов блока изменять состояние ссылки меню навигации по блоку на активное.
1-создал простую конструкцию
Элементам переды параметры в
js
name
иlink
, через них и будет работать связка пункт меню и активный скролл.2-Описание работы
А зачем throttle, если он не используется (хотя, по-хорошему, его лучше использовать)?