Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.05.2016, 09:48
Аватар для dmk
dmk dmk вне форума
Интересующийся
Отправить личное сообщение для dmk Посмотреть профиль Найти все сообщения от dmk
 
Регистрация: 21.03.2015
Сообщений: 13

Функция обработчик коллекции элементов. Как правильно?
Пытаюсь сделать портфолио с сеткой превьюшками, в которых при наведении мыши просматривается скриншот вёрстки.

Пример на странице (1-й блок) - http://dmink.link/ok

Если блок-ппевью один, работает такой код:

window.onload = addIndentPreview;
window.onresize = addIndentPreview;

var projectWrapper = document.querySelector(".js-preview-wrapper"),
    projectImg = document.querySelector(".js-preview-img"),
    wrapperHeight, imgHeight, imgMargin,
    i;

 function addIndentPreview() {
     wrapperHeight = projectWrapper.clientHeight;
     imgHeight = projectImg.clientHeight;
     imgMargin = -(imgHeight - wrapperHeight) + "px";

     projectWrapper.onmouseover = function () {
        projectImg.style.marginTop = imgMargin;
     };
     projectWrapper.onmouseout = function () {
        projectImg.style.marginTop = 0 + "px";
    };
 };


Дальше пытаюсь сделать рабочими все превьюшки, для этого добавляю цикл for в функцию. Но работает криво - при наведении мыши на 1-ю крутиться 3-я.

window.onload = addIndentPreview;
window.onresize = addIndentPreview;

var projectWrapper = document.querySelector(".js-preview-wrapper"),
    projectImg = document.querySelectorAll(".js-preview-img"),
    wrapperHeight, imgHeight, imgMargin,
    i, img;

function addIndentPreview() {
    wrapperHeight = projectWrapper.clientHeight;

    for (i = 0; i < projectImg.length; i++) {
        img = projectImg[i];
        imgHeight = img.clientHeight;
        imgMargin = -(imgHeight - wrapperHeight) + "px";

        projectWrapper.onmouseover = function () {
            img.style.marginTop = imgMargin;
        };
        projectWrapper.onmouseout = function () {
            img.style.marginTop = 0;
        };
    }
}


Страница с кривой работой - http://dmink.link/

В чём ошибка, что нужно поправить?
Ответить с цитированием
  #2 (permalink)  
Старый 23.05.2016, 11:29
Кандидат Javascript-наук
Отправить личное сообщение для aklis Посмотреть профиль Найти все сообщения от aklis
 
Регистрация: 27.04.2015
Сообщений: 99

Ошибка в цикле for, щас статейку поищу, дам линк по этому забавному эффекту
Ответить с цитированием
  #3 (permalink)  
Старый 23.05.2016, 11:32
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

dmk, img в цикле всегда будет выдавать значение из последней итерации. Поэтому в самой функции использовать this.
Ответить с цитированием
  #4 (permalink)  
Старый 23.05.2016, 11:32
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

dmk,
window.onload = window.onresize = addIndentPreview;

function addIndentPreview() {
	var img, imgs = document.querySelectorAll('.js-preview-img'), i = imgs.length;
	while (i--) {
		img = imgs[i];
		img.indent = img.parentNode.clientHeight - img.clientHeight;
		img.onmouseenter = img.onmouseleave = function () {
			this.style.marginTop = (parseInt(this.style.marginTop)) ? '0px' : this.indent + 'px';
		};
	}
}
Ответить с цитированием
  #5 (permalink)  
Старый 23.05.2016, 11:36
Кандидат Javascript-наук
Отправить личное сообщение для aklis Посмотреть профиль Найти все сообщения от aklis
 
Регистрация: 27.04.2015
Сообщений: 99

http://javascript.ru/basic/closure#p...-ispolzovaniya вот собственно подробно об этом
Ответить с цитированием
  #6 (permalink)  
Старый 23.05.2016, 13:36
Аватар для dmk
dmk dmk вне форума
Интересующийся
Отправить личное сообщение для dmk Посмотреть профиль Найти все сообщения от dmk
 
Регистрация: 21.03.2015
Сообщений: 13

Всем спасибо. Сейчас буду читать, разбираться
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Json и как его правильно кушать (Help plz!) JohnyVoo Angular.js 2 04.05.2016 19:55
как правильно обращаться к свойствам объект внутри самого объекта ? mitiya Общие вопросы Javascript 12 25.04.2015 21:18
Как правильно скрыть элементы для экономии ресурсов на прорисовку? Randomizer jQuery 0 16.10.2012 13:59
Как правильно очистить maxlength в input? Маэстро Events/DOM/Window 10 22.06.2011 18:14
как правильно установить обработчик onclick? Yurik AJAX и COMET 6 14.04.2009 21:04