#yui #scrollview #mousewheel #yui3
#yui #scrollview #колесо мыши #yui3
Вопрос:
Я начинаю работать только с YUI3. Я включил компонент ScrollView, но у него не сработало событие mousewheel, в настройках я не нашел, как его включить. Я был бы признателен за любую помощь.
var scrollView = new Y.ScrollView({
id: "scrollview",
srcNode: '.scrollview-item',
height: 375,
flick: {
minDistance: 10,
minVelocity: 0.3,
axis: "y"
}
});
scrollView.render();
Ответ №1:
Я также наткнулся на это, после некоторых проб и ошибок мне удалось заставить это работать (обратите внимание, что это просто прокрутка, без ослабления).
var DOM_MOUSE_SCROLL = 'DOMMouseScroll',
fixArgs = function(args) {
var a = Y.Array(args, 0, true), target;
if (Y.UA.gecko) {
a[0] = DOM_MOUSE_SCROLL;
// target = Y.config.win;
} else {
// target = Y.config.doc;
}
if (a.length < 3) {
// a[2] = target;
} else {
// a.splice(2, 0, target);
}
return a;
};
Y.Env.evt.plugins.mousewheel = {
on: function() {
return Y.Event._attach(fixArgs(arguments));
},
detach: function() {
return Y.Event.detach.apply(Y.Event, fixArgs(arguments));
}
};
Это событие YUI mousewheel, но оно немного изменилось. Самая большая проблема заключалась в том, что изначально либо элементы window, либо document, что не имеет смысла (например, при наведении курсора мыши на #myelement вы хотите, чтобы это было возвращаемой целью ..)
Ниже приведен код, используемый для инициализации ScrollView и функции, которая обрабатывает событие колеса мыши:
// ScrollView
var scrollView = new Y.ScrollView({
id: "scrollview",
srcNode: '#mycontainer',
height: 490,
flick: {
minDistance:10,
minVelocity:0.3,
axis: "y"
}
});
scrollView.render();
var content = scrollView.get("contentBox");
var scroll_modifier = 10; // 10px per Delta
var current_scroll_y, scroll_to;
content.on("mousewheel", function(e) {
// check whether this is the scrollview container
if ( e.currentTarget.hasClass('container') ) {
current_scroll_y = scrollView.get('scrollY');
scroll_to = current_scroll_y - ( scroll_modifier * e.wheelDelta );
// trying to scroll above top of the container - scroll to start
if ( scroll_to <= scrollView._minScrollY ) {
// in my case, this made the scrollbars plugin to move, but I'm quite sure it's important for other stuff as well :)
scrollView._uiDimensionsChange();
scrollView.scrollTo(0, scrollView._minScrollY);
} else if ( scroll_to >= scrollView._maxScrollY ) { // trying to scroll beneath the end of the container - scroll to end
scrollView._uiDimensionsChange();
scrollView.scrollTo(0, scrollView._maxScrollY);
} else { // otherwise just scroll to the calculated Y
scrollView._uiDimensionsChange();
scrollView.scrollTo(0, scroll_to);
};
// if we have scrollbars plugin, flash the scrollbar
if ( scrollView.scrollbars ) {
scrollView.scrollbars.flash();
};
// prevent browser default behavior on mouse scroll
e.preventDefault();
};
});
В общем, так мне это удалось, но моя следующая задача — заставить полосу прокрутки работать как обычную полосу прокрутки (когда вы перетаскиваете ее, контейнер должен соответственно перемещаться …)
Надеюсь, это кому-нибудь поможет 🙂
Комментарии:
1. О, да, я забыл одну вещь — при использовании колеса прокрутки контейнер нормально перемещается в FF и Opera, но немного медленно в Chrome / Safari / IE (возможно, дельта там другая, но я не удосужился проверить это ^^ ). Чтобы исправить это, вы могли бы поиграть с
scroll_modifier
, проверивwheelDelta
браузер или что угодно, что вы решите