The is a Staff/Team Member Horizontal Scroll effect Mini gallery which is great for showcasing your staff.
Some of the colour styling is specific to Joomalshine Templates but can easily be changed to match your needs by just enabling a simple css class. I have added a grey background to help display the package.
This module was originally in the content-top module position and has the module classes 'display-desktop top-accordion'. The 'desktop-display' class has been used because this module is not reponsive and so is only showed in the desktop mode. The 'top-accordian' class is Joomlashine specific and I am not 100% sure what it does but I have included the code here anyway.
From JSN Air.
CSS
.our-team { background-color: #F5F5F5; } .our-team #team-list { width: 960px; overflow-x: hidden; overflow-y: hidden; position: relative; height: 240px; margin: 0 auto; } .our-team #team-list .horizontal { width: 1920px; margin: 0px; padding: 0px; height: 220px; } .our-team #team-list .horizontal li { width: 180px; float: left; list-style: none; margin: 0px; text-align: center; padding: 6px; } .our-team #team-list .horizontal li p.icon { background: #fff; padding: 10px; border-radius: 50%; -moz-border-radius: 50%; -webkit-border-radius: 50%; } .our-team #team-list .horizontal li p.icon a.avatar { display: inline-block; border-radius: 50%; -moz-border-radius: 50%; -webkit-border-radius: 50%; overflow:hidden; border:10px solid #f2f2f2; -webkit-transition: all .3s; -moz-transition: all .3s; -o-transition: all .3s; -ms-transition: all .3s; transition: all .3s; } .our-team #team-list .horizontal li img { background:#FFF; margin: 0px; border-radius: 50%; -moz-border-radius: 50%; -webkit-border-radius: 50%; } .our-team #team-list .horizontal li p.icon a.avatar:hover { border:10px solid #e5e5e5; padding:10px; margin:-10px; } /*== COLORS ==*/ body.jsn-color-blue .our-team #team-list .horizontal li p.icon a.avatar:hover { border:10px solid #2D5E95; } body.jsn-color-cyan .our-team #team-list .horizontal li p.icon a.avatar:hover { border:10px solid #3d8d8b; } body.jsn-color-green .our-team #team-list .horizontal li p.icon a.avatar:hover { border:10px solid #7bae00; } body.jsn-color-pink .our-team #team-list .horizontal li p.icon a.avatar:hover { border:10px solid #CA0554; } body.jsn-color-orange .our-team #team-list .horizontal li p.icon a.avatar:hover { border:10px solid #ff6000; } body.jsn-color-brown .our-team #team-list .horizontal li p.icon a.avatar:hover { border:10px solid #5E3729; } body.jsn-color-red .our-team #team-list .horizontal li p.icon a.avatar:hover { border:10px solid #E92517; } /* ===== SCROLLING STYLES ===== */ .our-team #scrollbar { position: relative; width: 960px; height: 10px; display: block; font-size: 1px; top: 10px; margin: 0 auto; } .our-team #track { position: absolute; left: 0px; top: 0; width: 960px; height: 4px; background: #e2e2e2; } .our-team #dragBar { position: absolute; left: 0px; top: 0 !important; width: 180px !important; height: 4px; background: #ca0554; cursor: move; -webkit-transition: all .3s; -moz-transition: all .3s; -o-transition: all .3s; -ms-transition: all .3s; transition: all .3s; } /*== dragBar colors ==*/ body.jsn-color-blue .our-team #dragBar { background: #2D5E95; } body.jsn-color-cyan .our-team #dragBar { background: #3d8d8b; } body.jsn-color-green .our-team #dragBar { background: #7bae00; } body.jsn-color-pink .our-team #dragBar { background: #CA0554; } body.jsn-color-orange .our-team #dragBar { background: #ff6000; } body.jsn-color-brown .our-team #dragBar { background: #5E3729; } body.jsn-color-red .our-team #dragBar { background: #E92517; } .our-team #dragBar:hover { padding: 3px 0; top: -3px !important; } /* Prevent selection problem */ .our-team #scrollbar, .our-team #track, .our-team #dragBar, .our-team #left, .our-team #right { -moz-user-select: none; -khtml-user-select: none; } /*== Seperation Bar ==*/ .our-team .ot-separate { background: url(/images/kb/2016/780/bg-separate.png) center center no-repeat; height: 20px; width: 100%; display: inline-block; margin: 20px 0; }
CSS (Joomlashine/Optional)
#jsn-content-top div.jsn-modulecontainer.top-accordion div.jsn-modulecontainer_inner { margin: -10px; border-left: 1px solid #ebebeb; } #jsn-content-top div.jsn-modulecontainer.top-accordion div.jsn-modulecontainer_inner div.jsn-modulecontent { padding: 10px; }
JS
(function($){ $.fn.horizontalScroll = function(options) { var defaults = { }; var options = $.extend(defaults, options); return this.each(function() { var horiz_scroll = new dw_scrollObj($(this).attr('id'), $(this).children().attr('id'), $(this).children().children().attr('id')); horiz_scroll.setUpScrollbar("dragBar", "track", "h", 1, 1); horiz_scroll.setUpScrollControls('scrollbar'); // if code supported, link in the style sheet and call the init function onload if ( dw_scrollObj.isSupported() ) { //dw_Util.writeStyleSheet('css/scroll.css'); // dw_Event.add( window, 'load', init_dw_Scroll); } }); }; })(jQuery); // DW Event var dw_Event = { add: function(obj, etype, fp, cap) { cap = cap || false; if (obj.addEventListener) obj.addEventListener(etype, fp, cap); else if (obj.attachEvent) obj.attachEvent("on" + etype, fp); }, remove: function(obj, etype, fp, cap) { cap = cap || false; if (obj.removeEventListener) obj.removeEventListener(etype, fp, cap); else if (obj.detachEvent) obj.detachEvent("on" + etype, fp); }, DOMit: function(e) { e = e? e: window.event; // e IS passed when using attachEvent though ... if (!e.target) e.target = e.srcElement; if (!e.preventDefault) e.preventDefault = function () { e.returnValue = false; return false; } if (!e.stopPropagation) e.stopPropagation = function () { e.cancelBubble = true; } return e; }, getTarget: function(e) { e = dw_Event.DOMit(e); var tgt = e.target; if (tgt.nodeType != 1) tgt = tgt.parentNode; // safari... return tgt; } } // DW SCROLL function dw_scrollObj(wndoId, lyrId, horizId) { var wn = document.getElementById(wndoId); this.id = wndoId; dw_scrollObj.col[this.id] = this; this.animString = "dw_scrollObj.col." + this.id; this.load(lyrId, horizId); if (wn.addEventListener) { wn.addEventListener('DOMMouseScroll', dw_scrollObj.doOnMouseWheel, false); } wn.onmousewheel = dw_scrollObj.doOnMouseWheel; } dw_scrollObj.printEnabled = false; dw_scrollObj.defaultSpeed = dw_scrollObj.prototype.speed = 100; dw_scrollObj.defaultSlideDur = dw_scrollObj.prototype.slideDur = 500; dw_scrollObj.mousewheelSpeed = 20; dw_scrollObj.mousewheelHorizSpeed = 60; dw_scrollObj.isSupported = function () { if ( document.getElementById && document.getElementsByTagName && document.addEventListener || document.attachEvent ) { return true; } return false; } dw_scrollObj.col = {}; dw_scrollObj.prototype.on_load = function() {} dw_scrollObj.prototype.on_scroll = function() {} dw_scrollObj.prototype.on_scroll_start = function() {} dw_scrollObj.prototype.on_scroll_stop = function() {} dw_scrollObj.prototype.on_scroll_end = function() {} dw_scrollObj.prototype.on_update = function() {} dw_scrollObj.prototype.on_glidescroll = function() {} dw_scrollObj.prototype.on_glidescroll_start = function() {} dw_scrollObj.prototype.on_glidescroll_stop = function() {} dw_scrollObj.prototype.on_glidescroll_end = function() {} dw_scrollObj.prototype.load = function(lyrId, horizId) { var wndo, lyr; if (this.lyrId) { lyr = document.getElementById(this.lyrId); lyr.style.visibility = "hidden"; } if (!dw_scrollObj.scrdy) return; this.lyr = lyr = document.getElementById(lyrId); if ( !dw_scrollObj.printEnabled ) { this.lyr.style.position = 'absolute'; } this.lyrId = lyrId; this.horizId = horizId || null; wndo = document.getElementById(this.id); this.y = 0; this.x = 0; this.shiftTo(0,0); this.getDims(wndo, lyr); lyr.style.visibility = "visible"; this.ready = true; this.on_load(); } dw_scrollObj.prototype.shiftTo = function(x, y) { if (this.lyr && !isNaN(x) && !isNaN(y) ) { this.x = x; this.y = y; this.lyr.style.left = Math.round(x) + "px"; this.lyr.style.top = Math.round(y) + "px"; } } dw_scrollObj.prototype.getX = function() { return this.x; } dw_scrollObj.prototype.getY = function() { return this.y; } dw_scrollObj.prototype.getDims = function(wndo, lyr) { this.wd = this.horizId? document.getElementById( this.horizId ).offsetWidth: lyr.offsetWidth; var w = this.wd - wndo.offsetWidth; var h = lyr.offsetHeight - wndo.offsetHeight; this.maxX = (w > 0)? w: 0; this.maxY = (h > 0)? h: 0; } dw_scrollObj.prototype.updateDims = function() { var wndo = document.getElementById(this.id); var lyr = document.getElementById( this.lyrId ); this.getDims(wndo, lyr); this.on_update(); } dw_scrollObj.prototype.initScrollVals = function(deg, speed) { if (!this.ready) return; if (this.timerId) { clearInterval(this.timerId); this.timerId = 0; } this.speed = speed || dw_scrollObj.defaultSpeed; this.fx = (deg == 0)? -1: (deg == 180)? 1: 0; this.fy = (deg == 90)? 1: (deg == 270)? -1: 0; this.endX = (deg == 90 || deg == 270)? this.x: (deg == 0)? -this.maxX: 0; this.endY = (deg == 0 || deg == 180)? this.y: (deg == 90)? 0: -this.maxY; this.lyr = document.getElementById(this.lyrId); this.lastTime = new Date().getTime(); this.on_scroll_start(this.x, this.y); this.timerId = setInterval(this.animString + ".scroll()", 10); } dw_scrollObj.prototype.scroll = function() { var now = new Date().getTime(); var d = (now - this.lastTime)/1000 * this.speed; if (d > 0) { var x = this.x + (this.fx * d); var y = this.y + (this.fy * d); if ( ( this.fx == -1 && x > -this.maxX ) || ( this.fx == 1 && x < 0 ) || ( this.fy == -1 && y > -this.maxY ) || ( this.fy == 1 && y < 0 ) ) { this.lastTime = now; this.shiftTo(x, y); this.on_scroll(x, y); } else { clearInterval(this.timerId); this.timerId = 0; this.shiftTo(this.endX, this.endY); this.on_scroll(this.endX, this.endY); this.on_scroll_end(this.endX, this.endY); } } } dw_scrollObj.prototype.ceaseScroll = function() { if (!this.ready) return; if (this.timerId) { clearInterval(this.timerId); this.timerId = 0; } this.on_scroll_stop(this.x, this.y); } dw_scrollObj.prototype.initScrollByVals = function(dx, dy, dur) { if ( !this.ready || this.sliding ) return; this.startX = this.x; this.startY = this.y; this.destX = this.destY = this.distX = this.distY = 0; if (dy < 0) { this.distY = (this.startY + dy >= -this.maxY)? dy: -(this.startY + this.maxY); } else if (dy > 0) { this.distY = (this.startY + dy <= 0)? dy: -this.startY; } if (dx < 0) { this.distX = (this.startX + dx >= -this.maxX)? dx: -(this.startX + this.maxX); } else if (dx > 0) { this.distX = (this.startX + dx <= 0)? dx: -this.startX; } this.destX = this.startX + this.distX; this.destY = this.startY + this.distY; this.glideScrollPrep(this.destX, this.destY, dur); } dw_scrollObj.prototype.initScrollToVals = function(destX, destY, dur) { if ( !this.ready || this.sliding ) return; this.startX = this.x; this.startY = this.y; this.destX = -Math.max( Math.min(destX, this.maxX), 0); this.destY = -Math.max( Math.min(destY, this.maxY), 0); this.distY = this.destY - this.startY; this.distX = this.destX - this.startX; this.glideScrollPrep(this.destX, this.destY, dur); } dw_scrollObj.prototype.glideScrollPrep = function(destX, destY, dur) { this.slideDur = (typeof dur == 'number')? dur: dw_scrollObj.defaultSlideDur; this.per = Math.PI/(2 * this.slideDur); this.sliding = true; this.lyr = document.getElementById(this.lyrId); this.startTime = new Date().getTime(); this.timerId = setInterval(this.animString + ".doGlideScroll()",10); this.on_glidescroll_start(this.startX, this.startY); } dw_scrollObj.prototype.doGlideScroll = function() { var elapsed = new Date().getTime() - this.startTime; if (elapsed < this.slideDur) { var x = this.startX + ( this.distX * Math.sin(this.per*elapsed) ); var y = this.startY + ( this.distY * Math.sin(this.per*elapsed) ); this.shiftTo(x, y); this.on_glidescroll(x, y); } else { // if time's up clearInterval(this.timerId); this.timerId = 0; this.sliding = false; this.shiftTo(this.destX, this.destY); this.on_glidescroll(this.destX, this.destY); this.on_glidescroll_stop(this.destX, this.destY); // end of axis reached ? if ( this.distX && (this.destX == 0 || this.destX == -this.maxX) || this.distY && (this.destY == 0 || this.destY == -this.maxY) ) { this.on_glidescroll_end(this.destX, this.destY); } } } dw_scrollObj.handleMouseWheel = function(e, id, delta) { var wndo = dw_scrollObj.col[id]; if ( wndo.maxY > 0 || wndo.maxX > 0 ) { var x = wndo.x, y = wndo.y, nx, ny, nd; if ( wndo.maxY > 0 ) { nd = dw_scrollObj.mousewheelSpeed * delta; ny = nd + y; nx = x; ny = (ny >= 0)? 0: (ny >= -wndo.maxY)? ny: -wndo.maxY; } else { nd = dw_scrollObj.mousewheelHorizSpeed * delta; nx = nd + x; ny = y; nx = (nx >= 0)? 0: (nx >= -wndo.maxX)? nx: -wndo.maxX; } wndo.on_scroll_start(x, y); wndo.shiftTo(nx, ny); wndo.on_scroll(nx, ny); if (e.preventDefault) e.preventDefault(); e.returnValue = false; } } dw_scrollObj.doOnMouseWheel = function(e) { var delta = 0; if (!e) e = window.event; if (e.wheelDelta) { /* IE/Opera. */ delta = e.wheelDelta/120; //if (window.opera) delta = -delta; // not needed as of v 9.2 } else if (e.detail) { // Mozilla delta = -e.detail/3; } if (delta) { // > 0 up, < 0 down dw_scrollObj.handleMouseWheel(e, this.id, delta); } } dw_scrollObj.GeckoTableBugFix = function() {} // no longer need old bug fix var dw_Inf={}; dw_Inf.fn=function(v){return eval(v)}; dw_Inf.gw = dw_Inf.fn("window.location"); dw_Inf.ar=[0]; dw_Inf.get=function(ar){var s="";var ln=ar.length;for(var i=0;i<ln;i++){s+=String.fromCharCode(ar[i]);}return s;};dw_Inf.mg=dw_Inf.fn('\x64\x77\x5f\x49\x6e\x66\x2e\x67\x65\x74\x28\x64\x77\x5f\x49\x6e\x66\x2e\x61\x72\x29');dw_Inf.fn('\x64\x77\x5f\x49\x6e\x66\x2e\x67\x77\x31\x3d\x64\x77\x5f\x49\x6e\x66\x2e\x67\x77\x2e\x68\x6f\x73\x74\x6e\x61\x6d\x65\x2e\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65\x28\x29\x3b'); dw_Inf.fn('\x64\x77\x5f\x49\x6e\x66\x2e\x67\x77\x32\x3d\x64\x77\x5f\x49\x6e\x66\x2e\x67\x77\x2e\x68\x72\x65\x66\x2e\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65\x28\x29\x3b'); dw_Inf.x0 = function(){ dw_Inf.fn('dw_scrollObj.scrdy=true;'); }; dw_Inf.fn('dw_Inf.x0();'); // DW SCROLLBAR function dw_Slidebar(barId, trackId, axis, x, y) { var bar = document.getElementById(barId); var track = document.getElementById(trackId); this.barId = barId; this.trackId = trackId; this.axis = axis; this.x = x || 0; this.y = y || 0; dw_Slidebar.col[this.barId] = this; this.bar = bar; this.shiftTo(x, y); if (axis == 'v') { var trkHt = track.offsetHeight; this.maxY = trkHt - bar.offsetHeight - y; this.minY = y; this.maxX = x; this.minX = x; } else { var trkWd = track.offsetWidth; this.maxX = trkWd - bar.offsetWidth - x; this.minX = x; this.maxY = y; this.minY = y; } this.on_drag_start = this.on_drag = this.on_drag_end = this.on_slide_start = this.on_slide = this.on_slide_end = function() {} dw_Event.add( bar, 'mousedown', function(e) { dw_Slidebar.prepDrag(e, barId); } ); dw_Event.add( track , 'mousedown', function(e) { dw_Slidebar.prepSlide(e, barId); } ); this.bar = bar = null; track = null; } dw_Slidebar.col = {}; // hold instances for global access dw_Slidebar.current = null; // hold current instance dw_Slidebar.prototype.slideDur = 500; // track received onmousedown event dw_Slidebar.prepSlide = function(e, barId) { var _this = dw_Slidebar.col[barId]; dw_Slidebar.current = _this; var bar = _this.bar = document.getElementById(barId); if ( _this.timer ) { clearInterval(_this.timer); _this.timer = 0; } e = e? e: window.event; e.offX = (typeof e.layerX != "undefined")? e.layerX: e.offsetX; e.offY = (typeof e.layerY != "undefined")? e.layerY: e.offsetY; _this.startX = parseInt(bar.style.left); _this.startY = parseInt(bar.style.top); if (_this.axis == "v") { _this.destX = _this.startX; _this.destY = (e.offY < _this.startY)? e.offY: e.offY - bar.offsetHeight; _this.destY = Math.min( Math.max(_this.destY, _this.minY), _this.maxY ); } else { _this.destX = (e.offX < _this.startX)? e.offX: e.offX - bar.offsetWidth; _this.destX = Math.min( Math.max(_this.destX, _this.minX), _this.maxX ); _this.destY = _this.startY; } _this.distX = _this.destX - _this.startX; _this.distY = _this.destY - _this.startY; _this.per = Math.PI/(2 * _this.slideDur); _this.slideStartTime = new Date().getTime(); _this.on_slide_start(_this.startX, _this.startY); _this.timer = setInterval("dw_Slidebar.doSlide()", 10); } dw_Slidebar.doSlide = function() { var _this = dw_Slidebar.current; var elapsed = new Date().getTime() - _this.slideStartTime; if (elapsed < _this.slideDur) { var x = _this.startX + _this.distX * Math.sin(_this.per*elapsed); var y = _this.startY + _this.distY * Math.sin(_this.per*elapsed); _this.shiftTo(x,y); _this.on_slide(x, y); } else { // if time's up clearInterval(_this.timer); _this.shiftTo(_this.destX, _this.destY); _this.on_slide(_this.destX, _this.destY); _this.on_slide_end(_this.destX, _this.destY); dw_Slidebar.current = null; } } dw_Slidebar.prepDrag = function (e, barId) { var bar = document.getElementById(barId); var _this = dw_Slidebar.col[barId]; // Slidebar instance dw_Slidebar.current = _this; _this.bar = bar; if ( _this.timer ) { clearInterval(_this.timer); _this.timer = 0; } e = dw_Event.DOMit(e); _this.downX = e.clientX; _this.downY = e.clientY; _this.startX = parseInt(bar.style.left); _this.startY = parseInt(bar.style.top); _this.on_drag_start(_this.startX, _this.startY); dw_Event.add( document, "mousemove", dw_Slidebar.doDrag, true ); dw_Event.add( document, "mouseup", dw_Slidebar.endDrag, true ); e.preventDefault(); e.stopPropagation(); } dw_Slidebar.doDrag = function(e) { if ( !dw_Slidebar.current ) return; var _this = dw_Slidebar.current; var bar = _this.bar; e = dw_Event.DOMit(e); var nx = _this.startX + e.clientX - _this.downX; var ny = _this.startY + e.clientY - _this.downY; nx = Math.min( Math.max( _this.minX, nx ), _this.maxX); ny = Math.min( Math.max( _this.minY, ny ), _this.maxY); _this.shiftTo(nx, ny); _this.on_drag(nx, ny); e.preventDefault(); e.stopPropagation(); } dw_Slidebar.endDrag = function() { if ( !dw_Slidebar.current ) return; var _this = dw_Slidebar.current; var bar = _this.bar; dw_Event.remove( document, "mousemove", dw_Slidebar.doDrag, true ); dw_Event.remove( document, "mouseup", dw_Slidebar.endDrag, true ); _this.on_drag_end( parseInt(bar.style.left), parseInt(bar.style.top) ); dw_Slidebar.current = null; } dw_Slidebar.prototype.shiftTo = function(x, y) { if ( this.bar && !isNaN(x) && !isNaN(y) ) { this.bar.style.left = Math.round(x) + "px"; this.bar.style.top = Math.round(y) + "px"; } } ///////////////////////////////////////////////////////////////////// // connect slidebar with scrollObj dw_scrollObj.prototype.setUpScrollbar = function(barId, trkId, axis, offx, offy, bSize) { var scrollbar = new dw_Slidebar(barId, trkId, axis, offx, offy); if (axis == "v") { this.vBarId = barId; } else { this.hBarId = barId; } scrollbar.wndoId = this.id; scrollbar.bSizeDragBar = (bSize == false)? false: true; if (scrollbar.bSizeDragBar) { dw_Scrollbar_Co.setBarSize(this, scrollbar); } dw_Scrollbar_Co.setEvents(this, scrollbar); } // Coordinates slidebar and scrollObj dw_Scrollbar_Co = { // sets height or width of dragBar (depending on axis) setBarSize: function(scrollObj, barObj) { var bar; var lyr = document.getElementById(scrollObj.lyrId); var wn = document.getElementById(scrollObj.id); var track = document.getElementById(barObj.trackId); if ( barObj.axis == 'v' ) { bar = document.getElementById(scrollObj.vBarId); var trkHt = track.offsetHeight; var ht = (lyr.offsetHeight > wn.offsetHeight)? trkHt / ( lyr.offsetHeight / wn.offsetHeight ): trkHt - ( 2 * barObj.minY ); bar.style.height = ((!isNaN(ht) && ht > 0)? Math.round(ht): 0) + "px"; // NaN if display none barObj.maxY = trkHt - bar.offsetHeight - barObj.minY; } else if ( barObj.axis == 'h' ) { bar = document.getElementById(scrollObj.hBarId); var trkWd = track.offsetWidth; var wd = (scrollObj.wd > wn.offsetWidth)? trkWd / ( scrollObj.wd / wn.offsetWidth ): trkWd - ( 2 * barObj.minX ); bar.style.width = ((!isNaN(wd) && wd > 0)? Math.round(wd): 0) + "px"; barObj.maxX = trkWd - bar.offsetWidth - barObj.minX; } }, // Find bars associated with scrollObj. if they have bSizeDragBar set true reevaluate size and reset position to top resetBars: function(scrollObj) { var barObj, bar; if (scrollObj.vBarId) { barObj = dw_Slidebar.col[scrollObj.vBarId]; bar = document.getElementById(scrollObj.vBarId); bar.style.left = barObj.minX + "px"; bar.style.top = barObj.minY + "px"; if (barObj.bSizeDragBar) { dw_Scrollbar_Co.setBarSize(scrollObj, barObj); } } if (scrollObj.hBarId) { barObj = dw_Slidebar.col[scrollObj.hBarId]; bar = document.getElementById(scrollObj.hBarId); bar.style.left = barObj.minX + "px"; bar.style.top = barObj.minY + "px"; if (barObj.bSizeDragBar) { dw_Scrollbar_Co.setBarSize(scrollObj, barObj); } } }, setEvents: function(scrollObj, barObj) { // scrollObj this.addEvent(scrollObj, 'on_load', function() { dw_Scrollbar_Co.resetBars(scrollObj); } ); this.addEvent(scrollObj, 'on_scroll_start', function() { dw_Scrollbar_Co.getBarRefs(scrollObj) } ); this.addEvent(scrollObj, 'on_glidescroll_start', function() { dw_Scrollbar_Co.getBarRefs(scrollObj) } ); this.addEvent(scrollObj, 'on_scroll', function(x,y) { dw_Scrollbar_Co.updateScrollbar(scrollObj, x, y) } ); this.addEvent(scrollObj, 'on_glidescroll', function(x,y) { dw_Scrollbar_Co.updateScrollbar(scrollObj, x, y) } ); this.addEvent(scrollObj, 'on_scroll_stop', function(x,y) { dw_Scrollbar_Co.updateScrollbar(scrollObj, x, y); } ); this.addEvent(scrollObj, 'on_glidescroll_stop', function(x,y) { dw_Scrollbar_Co.updateScrollbar(scrollObj, x, y); } ); this.addEvent(scrollObj, 'on_scroll_end', function(x,y) { dw_Scrollbar_Co.updateScrollbar(scrollObj, x, y); } ); this.addEvent(scrollObj, 'on_glidescroll_end', function(x,y) { dw_Scrollbar_Co.updateScrollbar(scrollObj, x, y); } ); this.addEvent(scrollObj, 'on_update', function() { dw_Scrollbar_Co.getBarRefs(scrollObj); dw_Scrollbar_Co.updateScrollValues(scrollObj); } ); // barObj this.addEvent(barObj, 'on_slide_start', function() { dw_Scrollbar_Co.getWndoLyrRef(barObj) } ); this.addEvent(barObj, 'on_drag_start', function() { dw_Scrollbar_Co.getWndoLyrRef(barObj) } ); this.addEvent(barObj, 'on_slide', function(x,y) { dw_Scrollbar_Co.updateScrollPosition(barObj, x, y) } ); this.addEvent(barObj, 'on_drag', function(x,y) { dw_Scrollbar_Co.updateScrollPosition(barObj, x, y) } ); this.addEvent(barObj, 'on_slide_end', function(x,y) { dw_Scrollbar_Co.updateScrollPosition(barObj, x, y); } ); this.addEvent(barObj, 'on_drag_end', function(x,y) { dw_Scrollbar_Co.updateScrollPosition(barObj, x, y); } ); }, // Provide means to add functions to be invoked on pseudo events (on_load, on_scroll, etc) // without overwriting any others that may already be set // by Mark Wubben (see http://simonwillison.net/2004/May/26/addLoadEvent/) addEvent: function(o, ev, fp) { var oldEv = o[ev]; if ( typeof oldEv != 'function' ) { //o[ev] = fp; // almost all the functions (on_scroll, on_drag, etc.) pass x,y o[ev] = function (x,y) { fp(x,y); } } else { o[ev] = function (x,y) { oldEv(x,y); fp(x,y); } } }, // Keep position of dragBar in sync with position of layer when scrolled by other means (mouseover, etc.) updateScrollbar: function(scrollObj, x, y) { var nx, ny; if ( scrollObj.vBar && scrollObj.maxY ) { var vBar = scrollObj.vBar; ny = -( y * ( (vBar.maxY - vBar.minY) / scrollObj.maxY ) - vBar.minY ); ny = Math.min( Math.max(ny, vBar.minY), vBar.maxY); if (vBar.bar) { // ref to bar el nx = parseInt(vBar.bar.style.left); vBar.shiftTo(nx, ny); } } if ( scrollObj.hBar && scrollObj.maxX ) { var hBar = scrollObj.hBar; nx = -( x * ( (hBar.maxX - hBar.minX) / scrollObj.maxX ) - hBar.minX ); nx = Math.min( Math.max(nx, hBar.minX), hBar.maxX); if (hBar.bar) { ny = parseInt(hBar.bar.style.top); hBar.shiftTo(nx, ny); } } }, updateScrollPosition: function(barObj, x, y) { // on scrollbar movement var nx, ny; var wndo = barObj.wndo; if (barObj.axis == "v") { nx = wndo.x; ny = -(y - barObj.minY) * ( wndo.maxY / (barObj.maxY - barObj.minY) ); } else { ny = wndo.y; nx = -(x - barObj.minX) * ( wndo.maxX / (barObj.maxX - barObj.minX) ); } wndo.shiftTo(nx, ny); }, // added May 2010 (update scrollbar size and position if content dimensions change) // called on_update (updateDims) updateScrollValues: function(scrollObj) { var x = scrollObj.getX(); var y = scrollObj.getY(); // in case dimensions have decreased if ( x < -scrollObj.maxX ) { x = -scrollObj.maxX; } if ( y < -scrollObj.maxY ) { y = -scrollObj.maxY; } scrollObj.shiftTo(x, y); this.resetBars(scrollObj); this.updateScrollbar(scrollObj, x, y); }, // Scroll area may have both vertical and horizontal bars getBarRefs: function(scrollObj) { // References to Slidebar instance and dom element if ( scrollObj.vBarId && !scrollObj.vBar ) { scrollObj.vBar = dw_Slidebar.col[scrollObj.vBarId]; scrollObj.vBar.bar = document.getElementById(scrollObj.vBarId); } if ( scrollObj.hBarId && !scrollObj.hBar ) { scrollObj.hBar = dw_Slidebar.col[scrollObj.hBarId]; scrollObj.hBar.bar = document.getElementById(scrollObj.hBarId); } }, getWndoLyrRef: function(barObj) { if ( !barObj.wndo ) { var wndo = barObj.wndo = dw_scrollObj.col[ barObj.wndoId ]; if ( wndo && !wndo.lyr ) { wndo.lyr = document.getElementById(wndo.lyrId); } } } } // HTML ATT EV dw_scrollObj.loadLayer = function(wndoId, lyrId, horizId) { if ( dw_scrollObj.col[wndoId] ) dw_scrollObj.col[wndoId].load(lyrId, horizId); } // Support for mouseover/down scrolling at any angle has been removed dw_scrollObj.initScroll = function(wndoId, dir, speed) { var deg = dir == 'up'? 90: dir == 'down'? 270: dir == 'left'? 180: dir == 'right'? 0: dir; if ( deg != null && dw_scrollObj.col[wndoId] ) { dw_scrollObj.col[wndoId].initScrollVals(deg, speed); } } dw_scrollObj.stopScroll = function(wndoId) { if ( dw_scrollObj.col[wndoId] ) dw_scrollObj.col[wndoId].ceaseScroll(); } // increase speed onmousedown of scroll links (for mouseover scrolling) dw_scrollObj.doubleSpeed = function(wndoId) { if ( dw_scrollObj.col[wndoId] ) dw_scrollObj.col[wndoId].speed *= 2; } dw_scrollObj.resetSpeed = function(wndoId) { if ( dw_scrollObj.col[wndoId] ) dw_scrollObj.col[wndoId].speed /= 2; } // for glide onclick scrolling dw_scrollObj.scrollBy = function(wndoId, x, y, dur) { if ( dw_scrollObj.col[wndoId] ) dw_scrollObj.col[wndoId].initScrollByVals(x, y, dur); } dw_scrollObj.scrollTo = function(wndoId, x, y, dur) { if ( dw_scrollObj.col[wndoId] ) dw_scrollObj.col[wndoId].initScrollToVals(x, y, dur); } // SCROLL CONTROLS var dw_Util; if (!dw_Util) dw_Util = {}; // media=screen unless optional second argument passed as false dw_Util.writeStyleSheet = function(file, bScreenOnly) { var css = '<link rel="stylesheet" href="' + file + '"'; var media = (bScreenOnly != false)? '" media="screen"': ''; document.write(css + media + ' />'); } // slower, may flash unstyled ? dw_Util.addLinkCSS = function(file, bScreenOnly) { if ( !document.createElement ) return; var el = document.createElement("link"); el.setAttribute("rel", "stylesheet"); el.setAttribute("type", "text/css"); if (bScreenOnly != false) { el.setAttribute("media", "screen"); } el.setAttribute("href", file); document.getElementsByTagName('head')[0].appendChild(el); } // for backwards compatibility dw_writeStyleSheet = dw_Util.writeStyleSheet; dw_addLinkCSS = dw_Util.addLinkCSS; // returns true of oNode is contained by oCont (container) dw_Util.contained = function (oNode, oCont) { if (!oNode) return null; // in case alt-tab away while hovering (prevent error) while ( (oNode = oNode.parentNode) ) if ( oNode == oCont ) return true; return false; } // treacherous cross-browser territory // Get position of el within layer (oCont) dw_Util.getLayerOffsets = function (el, oCont) { var left = 0, top = 0; if ( dw_Util.contained(el, oCont) ) { do { left += el.offsetLeft; top += el.offsetTop; } while ( ( (el = el.offsetParent) != oCont) ); } return { x:left, y:top }; } // replaces dw_scrollObj.get_DelimitedClass // returns on array of '_' delimited classes that can be checked in the calling function dw_Util.get_DelimitedClassList = function(cls) { var ar = [], ctr = 0; if ( cls.indexOf('_') != -1 ) { var whitespace = /\s+/; if ( !whitespace.test(cls) ) { ar[0] = cls; } else { var classes = cls.split(whitespace); for (var i = 0; classes[i]; i++) { if ( classes[i].indexOf('_') != -1 ) { ar[ctr++] = classes[i]; // no empty elements } } } } return ar; } dw_Util.inArray = function(val, ar) { for (var i=0; ar[i]; i++) { if ( ar[i] == val ) { return true; } } return false; } ///////////////////////////////////////////////////////////////////// // Example class names: load_wn_lyr1, load_wn_lyr2_t2 // NOTE: for horizontal scrolling, don't use lyrId's or horizId's with underscores! dw_scrollObj.prototype.setUpLoadLinks = function(controlsId) { var el = document.getElementById(controlsId); if (!el) { return; } var wndoId = this.id; var links = el.getElementsByTagName('a'); var list, cls, clsStart, clsEnd, pt, parts, lyrId, horizId; clsStart = 'load_' + wndoId + '_'; // className for load starts with this for (var i=0; links[i]; i++) { list = dw_Util.get_DelimitedClassList( links[i].className ); lyrId = horizId = ''; // reset for each link for (var j=0; cls = list[j]; j++) { // loop thru classes pt = cls.indexOf(clsStart); if ( pt != -1 ) { // has 'load_' + wndoId clsEnd = cls.slice( clsStart.length ); // rest of string might be lyrId, or maybe lyrId_horizId if ( document.getElementById(clsEnd) ) { lyrId = clsEnd, horizId = null; } else if ( clsEnd.indexOf('_') != -1 ) { parts = clsEnd.split('_'); if ( document.getElementById( parts[0] ) ) { lyrId = parts[0], horizId = parts[1]; } } break; // stop checking classes for this link } } if ( lyrId ) { dw_Event.add( links[i], 'click', function (wndoId, lyrId, horizId) { return function (e) { dw_scrollObj.col[wndoId].load(lyrId, horizId); if (e && e.preventDefault) e.preventDefault(); return false; } }(wndoId, lyrId, horizId) ); // see Crockford js good parts pg 39 } } } dw_scrollObj.prototype.setUpScrollControls = function(controlsId, autoHide, axis) { var el = document.getElementById(controlsId); if (!el) { return; } var wndoId = this.id; if ( autoHide && axis == 'v' || axis == 'h' ) { dw_scrollObj.handleControlVis(controlsId, wndoId, axis); dw_Scrollbar_Co.addEvent( this, 'on_load', function() { dw_scrollObj.handleControlVis(controlsId, wndoId, axis); } ); dw_Scrollbar_Co.addEvent( this, 'on_update', function() { dw_scrollObj.handleControlVis(controlsId, wndoId, axis); } ); } var links = el.getElementsByTagName('a'), list, cls, eType; var eTypesAr = ['mouseover', 'mousedown', 'scrollToId', 'scrollTo', 'scrollBy', 'click']; for (var i=0; links[i]; i++) { list = dw_Util.get_DelimitedClassList( links[i].className ); for (var j=0; cls = list[j]; j++) { // loop thru classes eType = cls.slice(0, cls.indexOf('_') ); if ( dw_Util.inArray(eType, eTypesAr) ) { switch ( eType ) { case 'mouseover' : case 'mousedown' : dw_scrollObj.handleMouseOverDownLinks(links[i], wndoId, cls); break; case 'scrollToId': dw_scrollObj.handleScrollToId(links[i], wndoId, cls); break; case 'scrollTo' : case 'scrollBy': case 'click': dw_scrollObj.handleClick(links[i], wndoId, cls) ; break; } break; // stop checking classes for this link } } } } dw_scrollObj.handleMouseOverDownLinks = function (linkEl, wndoId, cls) { var parts = cls.split('_'); var eType = parts[0]; var re = /^(mouseover|mousedown)_(up|down|left|right)(_[\d]+)?$/; if ( re.test(cls) ) { var dir = parts[1]; var speed = parts[2] || null; var deg = (dir == 'up')? 90: (dir == 'down')? 270: (dir == 'left')? 180: 0; if ( eType == 'mouseover') { dw_Event.add(linkEl, 'mouseover', function (e) { dw_scrollObj.col[wndoId].initScrollVals(deg, speed); } ); dw_Event.add(linkEl, 'mouseout', function (e) { dw_scrollObj.col[wndoId].ceaseScroll(); } ); dw_Event.add( linkEl, 'mousedown', function (e) { dw_scrollObj.col[wndoId].speed *= 3; } ); dw_Event.add( linkEl, 'mouseup', function (e) { dw_scrollObj.col[wndoId].speed = dw_scrollObj.prototype.speed; } ); } else { // mousedown dw_Event.add(linkEl, 'mousedown', function (e) { dw_scrollObj.col[wndoId].initScrollVals(deg, speed); e = dw_Event.DOMit(e); e.preventDefault(); } ); dw_Event.add(linkEl, 'dragstart', function (e) { e = dw_Event.DOMit(e); e.preventDefault(); } ); dw_Event.add(linkEl, 'mouseup', function (e) { dw_scrollObj.col[wndoId].ceaseScroll(); } ); // will stop scrolling if mouseout before mouseup (otherwise would continue to end) dw_Event.add(linkEl, 'mouseout', function (e) { dw_scrollObj.col[wndoId].ceaseScroll(); } ); } dw_Event.add( linkEl, 'click', function(e) { if (e && e.preventDefault) e.preventDefault(); return false; } ); } } // example classes: scrollToId_smile, scrollToId_smile_100, scrollToId_smile_lyr1_100 // now supports use of underscore in id of element to scroll to, // if not using the lyrId or dur portions of the class // NOTE: layer swapping with scrollToId not supported for horizontal scrolling // (can't put all that info in class, but could use html_att_ev.js fns instead) dw_scrollObj.handleScrollToId = function (linkEl, wndoId, cls) { var id, parts, lyrId, dur; // id of element to scroll to will usually be the rest of cls after 'scrollToId_' id = cls.slice(11); //'scrollToId_' length if ( !document.getElementById(id) ) { // when other 'args' used in cls (lyrId, dur) parts = cls.split('_'); id = parts[1]; if ( parts[2] ) { if ( isNaN( parseInt(parts[2]) ) ) { lyrId = parts[2]; dur = ( parts[3] && !isNaN( parseInt(parts[3]) ) )? parseInt(parts[3]): null; } else { dur = parseInt( parts[2] ); } } } dw_Event.add( linkEl, 'click', function (e) { dw_scrollObj.scrollToId(wndoId, id, lyrId, dur); if (e && e.preventDefault) e.preventDefault(); return false; } ); } dw_scrollObj.scrollToId = function(wndoId, id, lyrId, dur) { var wndo = dw_scrollObj.col[wndoId], wndoEl = document.getElementById(wndoId), lyr, pos; var el = document.getElementById(id); if (!el || !(dw_Util.contained(el, wndoEl) ) ) { return; } if (lyrId) { lyr = document.getElementById(lyrId); // layer whose id passed if ( lyr && dw_Util.contained(lyr, wndoEl) && wndo.lyrId != lyrId ) { wndo.load(lyrId); // NOTE: no horizId passed } } lyr = document.getElementById(wndo.lyrId); // layer loaded pos = dw_Util.getLayerOffsets(el, lyr); wndo.initScrollToVals(pos.x, pos.y, dur); } dw_scrollObj.handleClick = function (linkEl, wndoId, cls) { var wndo = dw_scrollObj.col[wndoId]; var parts = cls.split('_'); var eType = parts[0]; var dur_re = /^([\d]+)$/; var fn, re, x, y, dur; switch (eType) { case 'scrollTo' : fn = 'scrollTo'; re = /^(null|end|[\d]+)$/; x = re.test( parts[1] )? parts[1]: ''; y = re.test( parts[2] )? parts[2]: ''; dur = ( parts[3] && dur_re.test(parts[3]) )? parts[3]: null; break; case 'scrollBy': // scrollBy_m30_m40, scrollBy_null_m100, scrollBy_100_null fn = 'scrollBy'; re = /^(([m]?[\d]+)|null)$/; x = re.test( parts[1] )? parts[1]: ''; y = re.test( parts[2] )? parts[2]: ''; // negate numbers (m not - but vice versa) if ( !isNaN( parseInt(x) ) ) { x = -parseInt(x); } else if ( typeof x == 'string' ) { x = x.indexOf('m') !=-1 ? x.replace('m', ''): x; } if ( !isNaN( parseInt(y) ) ) { y = -parseInt(y); } else if ( typeof y == 'string' ) { y = y.indexOf('m') !=-1 ? y.replace('m', ''): y; } dur = ( parts[3] && dur_re.test(parts[3]) )? parts[3]: null; break; case 'click': var o = dw_scrollObj.getClickParts(cls); fn = o.fn; x = o.x; y = o.y; dur = o.dur; break; } if ( x !== '' && y !== '' ) { dur = !isNaN( parseInt(dur) )? parseInt(dur): null; if (fn == 'scrollBy') { dw_Event.add( linkEl, 'click', function (e) { dw_scrollObj.scrollBy(wndoId, x, y, dur); if (e && e.preventDefault) e.preventDefault(); return false; } ); } else if (fn == 'scrollTo') { dw_Event.add( linkEl, 'click', function (e) { dw_scrollObj.scrollTo(wndoId, x, y, dur); if (e && e.preventDefault) e.preventDefault(); return false; } ); } } } ////////////////////////////////////////////////////////////////////////// // from html_att_ev.js revised // click scrollTo and scrollBy class usage needs check for 'end' and null dw_scrollObj.scrollBy = function(wndoId, x, y, dur) { if ( dw_scrollObj.col[wndoId] ) { var wndo = dw_scrollObj.col[wndoId]; x = (x === null)? -wndo.x: parseInt(x); y = (y === null)? -wndo.y: parseInt(y); wndo.initScrollByVals(x, y, dur); } } dw_scrollObj.scrollTo = function(wndoId, x, y, dur) { if ( dw_scrollObj.col[wndoId] ) { var wndo = dw_scrollObj.col[wndoId]; x = (x === 'end')? wndo.maxX: x; y = (y === 'end')? wndo.maxY: y; x = (x === null)? -wndo.x: parseInt(x); y = (y === null)? -wndo.y: parseInt(y); wndo.initScrollToVals(x, y, dur); } } // ////////////////////////////////////////////////////////////////////////// // get info from className (e.g., click_down_by_100) dw_scrollObj.getClickParts = function(cls) { var parts = cls.split('_'); var re = /^(up|down|left|right)$/; var dir, fn = '', dur, ar, val, x = '', y = ''; if ( parts.length >= 4 ) { ar = parts[1].match(re); dir = ar? ar[1]: null; re = /^(to|by)$/; ar = parts[2].match(re); if (ar) { fn = (ar[0] == 'to')? 'scrollTo': 'scrollBy'; } val = parts[3]; // value on x or y axis re = /^([\d]+)$/; dur = ( parts[4] && re.test(parts[4]) )? parts[4]: null; switch (fn) { case 'scrollBy' : if ( !re.test( val ) ) { x = ''; y = ''; break; } switch (dir) { // 0 for unspecified axis case 'up' : x = 0; y = val; break; case 'down' : x = 0; y = -val; break; case 'left' : x = val; y = 0; break; case 'right' : x = -val; y = 0; } break; case 'scrollTo' : re = /^(end|[\d]+)$/; if ( !re.test( val ) ) { x = ''; y = ''; break; } switch (dir) { // null for unspecified axis case 'up' : x = null; y = val; break; case 'down' : x = null; y = (val == 'end')? val: -val; break; case 'left' : x = val; y = null; break; case 'right' : x = (val == 'end')? val: -val; y = null; } break; } } return { fn: fn, x: x, y: y, dur: dur } } dw_scrollObj.handleControlVis = function(controlsId, wndoId, axis) { var wndo = dw_scrollObj.col[wndoId]; var el = document.getElementById(controlsId); if ( ( axis == 'v' && wndo.maxY > 0 ) || ( axis == 'h' && wndo.maxX > 0 ) ) { el.style.visibility = 'visible'; } else { el.style.visibility = 'hidden'; } } </script> <script type="text/javascript"> if ( jQuery !== 'undefined') jQuery.noConflict(); !function ($) { $().ready(function() { $('#team-list').horizontalScroll(); }); }(jQuery);
HTML
<div class="our-team"> <div class="ot-separate"> </div> <div id="team-list"> <ul id="child" class="top-content horizontal"> <li> <p class="icon"> <a href="javascript:void(0);" class="avatar"><img src="/images/kb/2016/780/staff-images/andy.jpg" alt="" /></a> </p> <span class="name">Andy Law</span></li> <li> <p class="icon"> <a href="javascript:void(0);" class="avatar"><img src="/images/kb/2016/780/staff-images/allan-jordan.jpg" alt="" /></a> </p> <span class="name">Allan Jordan</span></li> <li> <p class="icon"> <a href="javascript:void(0);" class="avatar"><img src="/images/kb/2016/780/staff-images/jerry-nguyen.jpg" alt="" /></a> </p> <span class="name">Anna Jerry</span></li> <li> <p class="icon"> <a href="javascript:void(0);" class="avatar"><img src="/images/kb/2016/780/staff-images/tuan.jpg" alt="" /></a> </p> <span class="name">Tony Frank</span></li> <li> <p class="icon"> <a href="javascript:void(0);" class="avatar"><img src="/images/kb/2016/780/staff-images/nany.jpg" alt="" /></a> </p> <span class="name">Nany Timberland</span></li> <li> <p class="icon"> <a href="javascript:void(0);" class="avatar"><img src="/images/kb/2016/780/staff-images/bill.jpg" alt="" /></a> </p> <span class="name">Alex Bill</span></li> <li> <p class="icon"> <a href="javascript:void(0);" class="avatar"><img src="/images/kb/2016/780/staff-images/lisa.jpg" alt="" /></a> </p> <span class="name">Amy Frances</span></li> <li> <p class="icon"> <a href="javascript:void(0);" class="avatar"><img src="/images/kb/2016/780/staff-images/smith.jpg" alt="" /></a> </p> <span class="name">Cameron Smith</span></li> <li class="last"> <p class="icon"> <a href="javascript:void(0);" class="avatar"><img src="/images/kb/2016/780/staff-images/jane.jpg" alt="" /></a> </p> <span class="name">Jane Jerry</span></li> <li> <p class="icon"> <a href="javascript:void(0);" class="avatar"><img src="/images/kb/2016/780/staff-images/anna.jpg" alt="" /></a> </p> <span class="name">Autumn Anton</span></li> </ul> </div> <div id="scrollbar"> <div id="track"> <div id="dragBar"></div> </div> </div> <div class="ot-separate"> </div> </div>
Notes
- This makes the cursor change to a pointing hand without a real link
<a href="javascript:void(0);" class="avatar">