放大滚动javascript时放大图像

时间:2019-03-26 06:01:16

标签: javascript html

我创建了带有图像的选项卡。当我在图像上滚动时,它将放大和缩小。但是我面临的问题是,在第一个选项卡中它只能使用放大和缩小功能(滚动时)。我没有弄错我在做什么。

index.html

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>zoom</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
  <style type="text/css">
    ul li{
        padding: 10px;
    }
  </style>
</head>
<body>
    <div class="container">
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <div class="panel panel-primary">
                <div class="panel-heading">
                    <h3 class="panel-title">Panel title</h3>
                    <span class="pull-right">
                        <!-- Tabs -->
                        <ul class="nav panel-tabs">
                            <li class="active"><a href="#tab1" data-toggle="tab">Tab 1</a></li>
                            <li><a href="#tab2" data-toggle="tab">Tab 2</a></li>
                            <li><a href="#tab3" data-toggle="tab">Tab 3</a></li>
                            <li><a href="#tab4" data-toggle="tab">Tab 4</a></li>
                        </ul>
                    </span>
                </div>
                <div class="panel-body">
                    <br />
                    <br />
                    <div class="tab-content">
                        <div class="tab-pane active" id="tab1">
                            <div class="container">
                                    <div class="slide">
                                        <img class='zoom' src='daisy.jpg' alt='Daisy!' width='555' height='320'/>
                                    </div>
                                </div>
                                <br />
                                <!-- <input type="button" value="click me"> -->
                        </div>
                        <div class="tab-pane" id="tab2">
                            <div class="container">
                                    <div class="slide">
                                       <img class='zoom' src='abc.jpg' alt='abc' width='555' height='320'/>
                                    </div>
                                </div>
                                <br />
                                <!-- <input type="button" value="click me"> -->
                        </div>
                         <div class="tab-pane" id="tab3">
                            <div class="container">
                                    <div class="slide">
                                       <img class='zoom' src='xy.jpg' alt='xy' width='555' height='320'/>
                                    </div>
                                </div>
                                <br />
                                <!-- <input type="button" value="click me"> -->
                        </div>
                         <div class="tab-pane" id="tab4">
                            <div class="container">
                                    <div class="slide">
                                       <img class='zoom' src='rec.png' alt='rec' width='555' height='320'/>
                                    </div>
                                </div>
                                <br />
                                <!-- <input type="button" value="click me"> -->
                        </div>

                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
    <!-- <img class='zoom' src='daisy.jpg' alt='Daisy!' width='555' height='320'/>
    <br />
    <img class='zoom' src='daisy.jpg' alt='Daisy!' width='555' height='320'/> -->
    <script src="wheelzoom.js"></script>
    <script>
        wheelzoom(document.querySelector('img.zoom'));
    </script>
</body>
</html>

wheelzoom.js

window.wheelzoom = (function(){
    var defaults = {
        zoom: 0.10,
        maxZoom: false,
        initialZoom: 1,
    };

    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.backgroundRepeat = 'no-repeat';
            img.style.backgroundImage = 'url("'+img.src+'")';
            cachedDataUrl = 'data:image/svg+xml;base64,'+window.btoa('<svg xmlns="http://www.w3.org/2000/svg" width="'+img.naturalWidth+'" height="'+img.naturalHeight+'"></svg>');
            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;
            }

            if (settings.maxZoom) {
                bgWidth = Math.min(width*settings.maxZoom, bgWidth);
                bgHeight = Math.min(height*settings.maxZoom, bgHeight);
            }

            // 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() {
            var initial = Math.max(settings.initialZoom, 1);

            if (img.src === cachedDataUrl) return;

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

            width = parseInt(computedStyle.width, 10);
            height = parseInt(computedStyle.height, 10);
            bgWidth = width * initial;
            bgHeight = height * initial;
            bgPosX = -(bgWidth - width)/2;
            bgPosY = -(bgHeight - height)/2;;

            setSrcToBackground(img);

            img.style.backgroundSize = bgWidth+'px '+bgHeight+'px';
            img.style.backgroundPosition = bgPosX+'px '+bgPosY+'px';
            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 IE9 or below
    if (typeof window.btoa !== '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;
        };
    }
}());

当我滚动时是放大和缩小,但仅在第一个选项卡中。我做错了,我听不懂。请帮助我。

1 个答案:

答案 0 :(得分:1)

我进行了很好的工作,发现您正在使用此代码中的wheelzoom(document.querySelector('img.zoom'));,而您正在使用querySelector,其中此代码将仅返回一个元素,而不是所有元素,而不是您需要的所有代码使用wheelzoom(document.querySelectorAll('img.zoom'));,那么您的示例将起作用。我已经尝试过并且可以正常工作