カスタムスクロールバー:メインストリームブラウザとIE 8+の互換性
12770 ワード
mCustomScrollbar.js( jQuery、jquery-mousewheel): IE, ie8 。
zUi; demo, 。
zUI.js ( jQuery)
,overflow:hidden; 。 zui panel();
(function ($) {
$.zUI = $.zUI || {}
$.zUI.emptyFn = function () {
};
$.zUI.asWidget = [];
/*
* core ,
*/
$.zUI.addWidget = function (sName, oSefDef) {
// sFlagName、sEventName、sOptsName
$.zUI.asWidget.push(sName);
var w = $.zUI[sName] = $.zUI[sName] || {};
var sPrefix = "zUI" + sName
w.sFlagName = sPrefix;
w.sEventName = sPrefix + "Event";
w.sOptsName = sPrefix + "Opts";
w.__creator = $.zUI.emptyFn;
w.__destroyer = $.zUI.emptyFn;
$.extend(w, oSefDef);
w.fn = function (ele, opts) {
var jqEle = $(ele);
jqEle.data(w.sOptsName, $.extend({}, w.defaults, opts));
// , ,
if (jqEle.data(w.sFlagName)) {
return;
}
jqEle.data(w.sFlagName, true);
w.__creator(ele);
jqEle.on(jqEle.data(w.sEventName));
};
w.unfn = function (ele) {
w.__destroyer(ele);
var jqEle = $(ele);//
if (jqEle.data(w.sFlagName)) {
jqEle.off(jqEle.data(w.sEventName));
jqEle.data(w.sFlagName, false);
}
}
}
/*
* draggable
* :obj{
* bOffsetParentBoundary: ,
* oBoundary: left top , {iMinLeft:...,iMaxLeft:...,iMinTop:...,iMaxTop:...},
* fnComputePosition: , {left:...,top:...}
* }
* :
* "draggable.start":drag , down
* "draggable.move":drag
* "draggable.stop":drag , up
*/
// draggable
$.zUI.addWidget("draggable", {
defaults: {
bOffsetParentBoundary: false,//
oBoundary: null,//
fnComputePosition: null//
},
__creator: function (ele) {
var jqEle = $(ele);
jqEle.data($.zUI.draggable.sEventName, {
mousedown: function (ev) {
var jqThis = $(this);
var opts = jqThis.data($.zUI.draggable.sOptsName);
jqThis.trigger("draggable.start");
var iOffsetX = ev.pageX - this.offsetLeft;
var iOffsetY = ev.pageY - this.offsetTop;
function fnMouseMove(ev) {
var oPos = {};
if (opts.fnComputePosition) {
oPos = opts.fnComputePosition(ev, iOffsetX, iOffsetY);
} else {
oPos.iLeft = ev.pageX - iOffsetX;
oPos.iTop = ev.pageY - iOffsetY;
}
var oBoundary = opts.oBoundary;
if (opts.bOffsetParentBoundary) {// offsetParent
var eParent = jqThis.offsetParent()[0];
oBoundary = {};
oBoundary.iMinLeft = 0;
oBoundary.iMinTop = 0;
oBoundary.iMaxLeft = eParent.clientWidth - jqThis.outerWidth();
oBoundary.iMaxTop = eParent.clientHeight - jqThis.outerHeight();
}
if (oBoundary) {// oBoundary, oBoundary
oPos.iLeft = oPos.iLeft < oBoundary.iMinLeft ? oBoundary.iMinLeft : oPos.iLeft;
oPos.iLeft = oPos.iLeft > oBoundary.iMaxLeft ? oBoundary.iMaxLeft : oPos.iLeft;
oPos.iTop = oPos.iTop < oBoundary.iMinTop ? oBoundary.iMinTop : oPos.iTop;
oPos.iTop = oPos.iTop > oBoundary.iMaxTop ? oBoundary.iMaxTop : oPos.iTop;
}
jqThis.css({left: oPos.iLeft, top: oPos.iTop});
ev.preventDefault();
jqThis.trigger("draggable.move");
}
var oEvent = {
mousemove: fnMouseMove,
mouseup: function () {
$(document).off(oEvent);
jqThis.trigger("draggable.stop");
}
};
$(document).on(oEvent);
}
});
}
});
/*
* panel
* :obj{
* iWheelStep:
* sBoxClassName:
* sBarClassName:
* }
*/
$.zUI.addWidget("panel", {
defaults: {
iWheelStep: 16,
sBoxClassName: "zUIpanelScrollBox",
sBarClassName: "zUIpanelScrollBar"
},
__creator: function (ele) {
var jqThis = $(ele);
// static , relative
if (jqThis.css("position") === "static") {
jqThis.css("position", "relative");
}
jqThis.css("overflow", "hidden");
// ,
var jqChild = jqThis.children(":first");
if (jqChild.length) {
jqChild.css({top: 0, position: "absolute"});
} else {
return;
}
var opts = jqThis.data($.zUI.panel.sOptsName);
//
var jqScrollBox = $("
:
panel
$(function(){
$("#demo").panel({iWheelStep:32});
});
2
3
4
5