📄 highslide.js
字号:
/******************************************************************************
Version 2.2.8 (January 10 2007)
Author: Torstein H?nsi
Support: http://vikjavev.no/highslide/forum
Email: See http://vikjavev.no/megsjol
******************************************************************************/
var hs = {
// Apply your own settings here, or override them in the html file.
graphicsDir : 'highslide/graphics/',
restoreCursor : "zoomout.cur", // necessary for preload
fullExpandIcon : 'fullexpand.gif',
expandSteps : 10, // number of steps in zoom. Each step lasts for duration/step milliseconds.
expandDuration : 250, // milliseconds
restoreSteps : 10,
restoreDuration : 250,
captionSlideSpeed : 1, // set to 0 to disable slide in effect
numberOfImagesToPreload : 5, // set to 0 for no preload
marginLeft : 10,
marginRight : 35, // leave room for scrollbars + outline
marginTop : 10,
marginBottom : 35, // leave room for scrollbars + outline
zIndexCounter : 1001, // adjust to other absolutely positioned elements
slideInOutline : true, // whether the outline should appear at once or slide in
fullExpandTitle : '查看实际大小',//Expand to actual size
restoreTitle : '',//点击可返回
focusTitle : '',//Click to bring to front
loadingText : 'Loading...',
loadingTitle : '',//点击返回
loadingOpacity : 0.75,
showCredits : true, // you can set this to false if you want
creditsText : 'Powered by <i>xuon</i>',
creditsHref : 'http://ofcn.cn',
creditsTitle : '访问 xuon 的网站',
//以下不必设置,请到本页最后可选择放大时的风格
// These settings can also be overridden inline for each image
anchor : 'auto', // where the image expands from
align : 'auto', // position in the client (overrides anchor)
captionId : null,
slideshowGroup : '', // defines groups for next/previous links and keystrokes
enableKeyListener : true,
spaceForCaption : 30, // leaves space below images with captions
minWidth: 200,
minHeight: 200,
allowSizeReduction: true, // allow the image to reduce to fit client size. If false, this overrides minWidth and minHeight
outlineType : 'drop-shadow', // set null to disable outlines
wrapperClassName : null, // for enhanced css-control
// END OF YOUR SETTINGS
// declare internal properties
preloadTheseImages : new Array(),
continuePreloading: true,
expandedImagesCounter : 0,
expanders : new Array(),
overrides : new Array(
'anchor',
'align',
'outlineType',
'spaceForCaption',
'wrapperClassName',
'minWidth',
'minHeight',
'captionId',
'allowSizeReduction',
'slideshowGroup',
'enableKeyListener'
),
overlays : new Array(),
toggleImagesGroup : null,
// drag functionality
ie : (document.all && !window.opera),
nn6 : document.getElementById && !document.all,
safari : navigator.userAgent.indexOf("Safari") != -1,
hasFocused : false,
isDrag : false,
$ : function (id) {
return document.getElementById(id);
},
createElement : function (tag, attribs, styles, parent) {
var el = document.createElement(tag);
if (attribs) hs.setAttribs(el, attribs);
if (styles) hs.setStyles(el, styles);
if (parent) parent.appendChild(el);
return el;
},
setAttribs : function (el, attribs) {
for (var x in attribs) {
el[x] = attribs[x];
}
},
setStyles : function (el, styles) {
for (var x in styles) {
el.style[x] = styles[x];
}
},
ieVersion : function () {
arr = navigator.appVersion.split("MSIE");
return parseFloat(arr[1]);
},
//--- Find client width and height
clientInfo : function () {
var iebody = (document.compatMode && document.compatMode != "BackCompat")
? document.documentElement : document.body;
this.width = hs.ie ? iebody.clientWidth : self.innerWidth;
this.height = hs.ie ? iebody.clientHeight : self.innerHeight;
this.scrollLeft = hs.ie ? iebody.scrollLeft : pageXOffset;
this.scrollTop = hs.ie ? iebody.scrollTop : pageYOffset;
} ,
//--- Finds the position of an element
position : function(el) {
var parent = el;
var p = Array();
p.x = parent.offsetLeft;
p.y = parent.offsetTop;
while (parent.offsetParent) {
parent = parent.offsetParent;
p.x += parent.offsetLeft;
p.y += parent.offsetTop;
}
return p;
},
expand : function(a, params, contentType) {
try {
new HsExpander(a, params, contentType);
return false;
} catch(e) {
return true;
}
},
//--- Focus the topmost image after restore
focusTopmost : function() {
var topZ = 0;
var topmostKey = -1;
for (i = 0; i < hs.expanders.length; i++) {
if (hs.expanders[i]) {
if (hs.expanders[i].wrapper.style.zIndex && hs.expanders[i].wrapper.style.zIndex > topZ) {
topZ = hs.expanders[i].wrapper.style.zIndex;
topmostKey = i;
}
}
}
if (topmostKey == -1) hs.focusKey = -1;
else hs.expanders[topmostKey].focus();
},
closeId : function(elId) { // for text links
for (i = 0; i < hs.expanders.length; i++) {
if (hs.expanders[i] && (hs.expanders[i].thumb.id == elId || hs.expanders[i].a.id == elId)) {
hs.expanders[i].doClose();
return;
}
}
},
close : function(el) {
var key = hs.getWrapperKey(el);
if (hs.expanders[key]) hs.expanders[key].doClose();
return false;
},
toggleImages : function(closeId, expandEl) {
if (closeId) hs.closeId(closeId);
if (hs.ie) expandEl.href = expandEl.href.replace('about:(blank)?', ''); // mysterious IE thing
hs.toggleImagesExpandEl = expandEl;
return false;
},
getAdjacentAnchor : function(key, op) {
var aAr = document.getElementsByTagName('A');
var hsAr = new Array;
for (i = 0; i < aAr.length; i++) {
if (hs.isHsAnchor(aAr[i])) {
hsAr.push(aAr[i]);
}
}
var activeI = -1;
for (i = 0; i < hsAr.length; i++) {
if (hs.expanders[key] && hsAr[i] == hs.expanders[key].a) {
activeI = i;
break;
}
}
return hsAr[activeI + op];
},
getSrc : function (a) {
return a.rel.replace(/_slash_/g, '/') || a.href;
},
previousOrNext : function (el, op) {
if (typeof el == 'object') var activeKey = hs.getWrapperKey(el);
else if (typeof el == 'number') var activeKey = el;
if (hs.expanders[activeKey]) {
hs.toggleImagesExpandEl = hs.getAdjacentAnchor(activeKey, op);
hs.toggleImagesGroup = hs.expanders[activeKey].slideshowGroup;
hs.expanders[activeKey].doClose();showhidediv('picback');
}
return false;
},
previous : function (el) {
return hs.previousOrNext(el, -1);
},
next : function (el) {
return hs.previousOrNext(el, 1);
},
keyHandler : function(e) {
if (!e) e = window.event;
if (!e.target) e.target = e.srcElement; // ie
if (e.target.form) return; // form element has focus
var op = null;
switch (e.keyCode) {
case 34: // Page Down
case 39: // Arrow right
case 40: // Arrow left
op = 1;
break;
case 33: // Page Up
case 37: // Arrow left
case 38: // Arrow down
op = -1;
break;
case 27: // Escape
case 13: // Enter
if (hs.expanders[hs.focusKey]) hs.expanders[hs.focusKey].doClose();showhidediv('picback');
return false;
}
if (op != null) {
hs.removeEventListener(document, 'keydown', hs.keyHandler);
if (hs.expanders[hs.focusKey] && hs.expanders[hs.focusKey].enableKeyListener == false) return true;
return hs.previousOrNext(hs.focusKey, op);
}
else return true;
},
registerOverlay : function (overlay) {
hs.overlays.push(overlay);
},
getWrapperKey : function (el) {
var key = -1;
while (el.parentNode) {
el = el.parentNode;
if (el.id && el.id.match(/^highslide-wrapper-[0-9]+$/)) {
key = el.id.replace(/^highslide-wrapper-([0-9]+)$/, "$1");
break;
}
}
return key;
},
cleanUp : function () {
if (hs.toggleImagesExpandEl) {
hs.toggleImagesExpandEl.onclick();
hs.toggleImagesExpandEl = null;
} else {
for (i = 0; i < hs.expanders.length; i++) {
if (hs.expanders[i] && hs.expanders[i].isExpanded) hs.focusTopmost();
}
}
},
mouseDownHandler : function(e)
{
if (!e) e = window.event;
if (e.button > 1) return true;
if (!e.target) e.target = e.srcElement;
var fobj = e.target;
// loop out
while (!fobj.tagName.match(/(HTML|BODY)/) && !fobj.className.match(/highslide-(image|move|html)/))
{
fobj = hs.nn6 ? fobj.parentNode : fobj.parentElement;
}
if (fobj.tagName.match(/(HTML|BODY)/)) return;
hs.dragKey = hs.getWrapperKey(fobj);
if (fobj.className.match(/highslide-(image|move)/)) // drag or focus
{
hs.isDrag = true;
hs.dragObj = hs.expanders[hs.dragKey].content;
if (fobj.className.match('highslide-image')) hs.dragObj.style.cursor = 'move';
tx = parseInt(hs.expanders[hs.dragKey].wrapper.style.left);
ty = parseInt(hs.expanders[hs.dragKey].wrapper.style.top);
hs.leftBeforeDrag = tx;
hs.topBeforeDrag = ty;
hs.dragX = hs.nn6 ? e.clientX : event.clientX;
hs.dragY = hs.nn6 ? e.clientY : event.clientY;
hs.addEventListener(document, 'mousemove', hs.mouseMoveHandler);
if (e.preventDefault) e.preventDefault();
if (hs.dragObj.className.match(/highslide-(image|html)-blur/)) {
hs.expanders[hs.dragKey].focus();
hs.hasFocused = true;
}
return false;
}
else if (fobj.className.match(/highslide-html/)) { // just focus
hs.expanders[hs.dragKey].focus();
hs.expanders[hs.dragKey].redoShowHide();
hs.hasFocused = false; // why??
}
},
mouseMoveHandler : function(e)
{
if (hs.isDrag) {
if (!hs.expanders[hs.dragKey] || !hs.expanders[hs.dragKey].wrapper) return;
var wrapper = hs.expanders[hs.dragKey].wrapper;
var left = hs.nn6 ? tx + e.clientX - hs.dragX : tx + event.clientX - hs.dragX;
wrapper.style.left = left +'px';
var top = hs.nn6 ? ty + e.clientY - hs.dragY : ty + event.clientY - hs.dragY;
wrapper.style.top = top +'px';
return false;
}
},
mouseUpHandler : function(e) {
if (!e) e = window.event;
if (e.button > 1) return true;
if (!e.target) e.target = e.srcElement;
hs.isDrag = false;
var fobj = e.target;
while (!fobj.tagName.match(/(HTML|BODY)/) && !fobj.className.match(/highslide-(image|move)/))
{
fobj = fobj.parentNode;
}
if (fobj.className.match(/highslide-(image|move)/) && hs.expanders[hs.dragKey]) {
if (fobj.className.match('highslide-image')) {
fobj.style.cursor = hs.styleRestoreCursor;
hs.removeEventListener(document, 'mousemove', hs.mouseMoveHandler);
}
var left = parseInt(hs.expanders[hs.dragKey].wrapper.style.left);
var top = parseInt(hs.expanders[hs.dragKey].wrapper.style.top);
var hasMoved = left != hs.leftBeforeDrag || top != hs.topBeforeDrag;
if (!hasMoved && !hs.hasFocused) {
hs.expanders[hs.dragKey].doClose();showhidediv('picback');
} else if (hasMoved || (!hasMoved && hs.hasHtmlExpanders)) {
hs.expanders[hs.dragKey].redoShowHide();
}
hs.hasFocused = false;
} else if (fobj.className.match('highslide-image-blur')) {
fobj.style.cursor = hs.styleRestoreCursor;
}
},
addEventListener : function (el, event, func) {
if (document.addEventListener) el.addEventListener(event, func, false);
else if (document.attachEvent) el.attachEvent('on'+ event, func);
else el[event] = func;
},
removeEventListener : function (el, event, func) {
if (document.removeEventListener) el.removeEventListener(event, func, false);
else if (document.detachEvent) el.detachEvent('on'+ event, func);
else el[event] = null;
},
isHsAnchor : function (a) {
return (a.className && (a.className.match("highslide$") || a.className.match("highslide ")));
},
preloadFullImage : function (i) {
if (hs.continuePreloading && hs.preloadTheseImages[i] && hs.preloadTheseImages[i] != 'undefined') {
var img = document.createElement('img');
img.onload = function() { hs.preloadFullImage(i + 1); };
img.src = hs.preloadTheseImages[i];
}
},
preloadImages : function (number) {
if (number) this.numberOfImagesToPreload = number;
var j = 0;
var aTags = document.getElementsByTagName('A');
for (i = 0; i < aTags.length; i++) {
a = aTags[i];
if (hs.isHsAnchor(a)) {
if (j < this.numberOfImagesToPreload) {
hs.preloadTheseImages[j] = hs.getSrc(a);
j++;
}
}
}
hs.preloadFullImage(0); // starts recursive process
// preload cursor
var cur = document.createElement('img');
cur.src = hs.graphicsDir + hs.restoreCursor;
// preload outlines
if (hs.outlineType) {
for (i = 1; i <= 8; i++) {
var img = document.createElement('img');
img.src = hs.graphicsDir + "outlines/"+ hs.outlineType +"/"+ i +".png";
}
}
}
}; // end hs object
//-----------------------------------------------------------------------------
// The expander object
HsExpander = function(a, params, contentType) {
try {
hs.continuePreloading = false;
hs.container = hs.$('highslide-container');
/*if (!hs.container) {
hs.container = hs.createElement('div',
null,
{ position: 'absolute', left: 0, top: 0, width: '100%', zIndex: hs.zIndexCounter },
document.body
);
}*/
if (params && params.thumbnailId) {
var el = hs.$(params.thumbnailId);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -