2016-04-06 3 views
0

Ich schrieb den HTML-Code unten, um Vollbild anzuzeigen. Da meine Bilder manchmal sehr groß sind, wollte ich zoomen und die Details sehen können. Ich habe diesen JavaScript-Code hier gefunden http://www.jacklmoore.com/wheelzoom/. Es funktioniert sehr gut, aber ich möchte unbegrenztes Vergrößern verhindern. Ich muss es durch die Größe des Bildes begrenzt werden. Wie kann ich den Code ändern, um dies zu tun? Vielen Dank.Wie Sie diesen JavaScript-Code ändern, um unbegrenzten Zoom zu verhindern

HTML

<!doctype html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>Zoom</title> 
<style> 
html, body { 
    background:#333333; 
    height: 100%; 
    margin: 0; 
    padding: 0; 
} 
#image { 
    padding: 0; 
    display: block; 
    margin: 0 auto; 
    max-height: 100%; 
    max-width: 100%; 
} 
</style> 
</head> 
<body> 
    <img class='zoom' src='MyImage.jpg' id='image'/> 
    <script src="wheelzoom.js"></script> 
    <script> 
    wheelzoom(document.querySelector('img.zoom')); 
    </script> 
</body> 
</html> 

JavaScript

/*! 
    Wheelzoom 3.0.4 
    license: MIT 
    http://www.jacklmoore.com/wheelzoom 
*/ 
window.wheelzoom = (function(){ 
    var defaults = { 
     zoom: 0.10 
    }; 

    var canvas = document.createElement('canvas'); 

    var main = function(img, options){ 
     if (!img || !img.nodeName || img.nodeName !== 'IMG') { return; } 

     var settings = {}; 
     var width; 
     var height; 
     var bgWidth; 
     var bgHeight; 
     var bgPosX; 
     var bgPosY; 
     var previousEvent; 
     var cachedDataUrl; 

     function setSrcToBackground(img) { 
      img.style.backgroundImage = 'url("'+img.src+'")'; 
      img.style.backgroundRepeat = 'no-repeat'; 
      canvas.width = img.naturalWidth; 
      canvas.height = img.naturalHeight; 
      cachedDataUrl = canvas.toDataURL(); 
      img.src = cachedDataUrl; 
     } 

     function updateBgStyle() { 
      if (bgPosX > 0) { 
       bgPosX = 0; 
      } else if (bgPosX < width - bgWidth) { 
       bgPosX = width - bgWidth; 
      } 

      if (bgPosY > 0) { 
       bgPosY = 0; 
      } else if (bgPosY < height - bgHeight) { 
       bgPosY = height - bgHeight; 
      } 

      img.style.backgroundSize = bgWidth+'px '+bgHeight+'px'; 
      img.style.backgroundPosition = bgPosX+'px '+bgPosY+'px'; 
     } 

     function reset() { 
      bgWidth = width; 
      bgHeight = height; 
      bgPosX = bgPosY = 0; 
      updateBgStyle(); 
     } 

     function onwheel(e) { 
      var deltaY = 0; 

      e.preventDefault(); 

      if (e.deltaY) { // FireFox 17+ (IE9+, Chrome 31+?) 
       deltaY = e.deltaY; 
      } else if (e.wheelDelta) { 
       deltaY = -e.wheelDelta; 
      } 

      // As far as I know, there is no good cross-browser way to get the cursor position relative to the event target. 
      // We have to calculate the target element's position relative to the document, and subtrack that from the 
      // cursor's position relative to the document. 
      var rect = img.getBoundingClientRect(); 
      var offsetX = e.pageX - rect.left - window.pageXOffset; 
      var offsetY = e.pageY - rect.top - window.pageYOffset; 

      // Record the offset between the bg edge and cursor: 
      var bgCursorX = offsetX - bgPosX; 
      var bgCursorY = offsetY - bgPosY; 

      // Use the previous offset to get the percent offset between the bg edge and cursor: 
      var bgRatioX = bgCursorX/bgWidth; 
      var bgRatioY = bgCursorY/bgHeight; 

      // Update the bg size: 
      if (deltaY < 0) { 
       bgWidth += bgWidth*settings.zoom; 
       bgHeight += bgHeight*settings.zoom; 
      } else { 
       bgWidth -= bgWidth*settings.zoom; 
       bgHeight -= bgHeight*settings.zoom; 
      } 

      // Take the percent offset and apply it to the new size: 
      bgPosX = offsetX - (bgWidth * bgRatioX); 
      bgPosY = offsetY - (bgHeight * bgRatioY); 

      // Prevent zooming out beyond the starting size 
      if (bgWidth <= width || bgHeight <= height) { 
       reset(); 
      } else { 
       updateBgStyle(); 
      } 
     } 

     function drag(e) { 
      e.preventDefault(); 
      bgPosX += (e.pageX - previousEvent.pageX); 
      bgPosY += (e.pageY - previousEvent.pageY); 
      previousEvent = e; 
      updateBgStyle(); 
     } 

     function removeDrag() { 
      document.removeEventListener('mouseup', removeDrag); 
      document.removeEventListener('mousemove', drag); 
     } 

     // Make the background draggable 
     function draggable(e) { 
      e.preventDefault(); 
      previousEvent = e; 
      document.addEventListener('mousemove', drag); 
      document.addEventListener('mouseup', removeDrag); 
     } 

     function load() { 
      if (img.src === cachedDataUrl) return; 

      var computedStyle = window.getComputedStyle(img, null); 

      width = parseInt(computedStyle.width, 10); 
      height = parseInt(computedStyle.height, 10); 
      bgWidth = width; 
      bgHeight = height; 
      bgPosX = 0; 
      bgPosY = 0; 

      setSrcToBackground(img); 

      img.style.backgroundSize = width+'px '+height+'px'; 
      img.style.backgroundPosition = '0 0'; 
      img.addEventListener('wheelzoom.reset', reset); 

      img.addEventListener('wheel', onwheel); 
      img.addEventListener('mousedown', draggable); 
     } 

     var destroy = function (originalProperties) { 
      img.removeEventListener('wheelzoom.destroy', destroy); 
      img.removeEventListener('wheelzoom.reset', reset); 
      img.removeEventListener('load', load); 
      img.removeEventListener('mouseup', removeDrag); 
      img.removeEventListener('mousemove', drag); 
      img.removeEventListener('mousedown', draggable); 
      img.removeEventListener('wheel', onwheel); 

      img.style.backgroundImage = originalProperties.backgroundImage; 
      img.style.backgroundRepeat = originalProperties.backgroundRepeat; 
      img.src = originalProperties.src; 
     }.bind(null, { 
      backgroundImage: img.style.backgroundImage, 
      backgroundRepeat: img.style.backgroundRepeat, 
      src: img.src 
     }); 

     img.addEventListener('wheelzoom.destroy', destroy); 

     options = options || {}; 

     Object.keys(defaults).forEach(function(key){ 
      settings[key] = options[key] !== undefined ? options[key] : defaults[key]; 
     }); 

     if (img.complete) { 
      load(); 
     } 

     img.addEventListener('load', load); 
    }; 

    // Do nothing in IE8 
    if (typeof window.getComputedStyle !== 'function') { 
     return function(elements) { 
      return elements; 
     }; 
    } else { 
     return function(elements, options) { 
      if (elements && elements.length) { 
       Array.prototype.forEach.call(elements, main, options); 
      } else if (elements && elements.nodeName) { 
       main(elements, options); 
      } 
      return elements; 
     }; 
    } 
}()); 
+0

schwer zu sagen, nur aus, während wir einen Blick, warum nicht den Kerl, der es gemacht? Ziemlich coole kleine Lib dort – JordanHendrix

Antwort

1

sucht

if (deltaY < 0) { 
    bgWidth += bgWidth*settings.zoom; 
    bgHeight += bgHeight*settings.zoom; 

und

ändern
if (deltaY < 0) { 
    if(bgWidth < canvas.width){ 
     bgWidth += bgWidth*settings.zoom; 
     bgHeight += bgHeight*settings.zoom;} 

auch sollten Sie die JavaScript-Datei in der HTML-Kopf-Tag

+0

Dank @Swayze, arbeitete Ihr Code, um die Menge an Zoom zu begrenzen, und ich könnte damit arbeiten. Aber was ich wirklich brauche ist, dass der Zoom-Betrag durch die Abmessungen des Bildes begrenzt wird. Wie kann ich verhindern, dass das Bild mehr als 100% seiner Breite/Höhe vergrößert? Meine Bilder sind in verschiedenen Größen erhältlich. Ich denke, was ich brauche, ist - bei der maximalen Zoomstufe sollte 1 Bildpixel 1 Monitor/Gerätepixel entsprechen. – tanbox

+0

vergessen in diesem Fall über 'maxZoom' Sie können das vollständig entfernen .. ändern Sie einfach die if-Anweisung .. Das Javascript hat bereits eine Variable' canvas.width' für die ursprüngliche Breite ... Ich werde meine Antwort bearbeiten – Swayze

+0

etwas didn arbeite nicht für mich. Ich habe maxZoom entfernt und den bearbeiteten Code kopiert. Jetzt kann ich nicht mehr reinzoomen. – tanbox

Verwandte Themen