Полоса прокрутки Canvas не работает в режиме увеличения - PullRequest
0 голосов
/ 17 апреля 2020

То, что я хочу, это когда пользователь делает выбор, выбранная часть увеличивается, но не может прокрутить изображение влево. Есть ли способ достичь этого?

Это код на данный момент:

        <html>
        <head>
        <title></title>
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
            <script type="text/javascript" src="lib/jquery-ui.min.js"></script>
            <script type="text/javascript" src="lib/jquery.mousewheel.js"></script>
            <script type="text/javascript" src="lib/hammer.min.js"></script>
            <script type="text/javascript" src="lib/jquery.hammer.js"></script>
            <script type="text/javascript" src="lib/imgViewer.js"></script>
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=yes" />
        <style>
        /*CONTAINER-------------------*/
        #container {
            width: 234px;
            height: 199px;
            margin-left: auto;
            margin-right: auto;
        }

        /*ZOOMBOX=====================*/
        /*IMAGE-----------------------*/
        .zoombox {
            position: relative;
            width: 100%;
            height: 100%;
            border: 2px solid #AAAAAA;
            background-color: #666666;
            overflow: hidden;
        }

        .zoombox img {
            position: relative;
        }

        .zoombox img.drag {
            cursor: move;
        }

        .zoombox .selector {
            display: none;
            position: absolute;
            border: 1px solid #999999;
            background-color: rgba(255, 255, 255, 0.3);
        }
        /*CONTROL---------------------*/
        .reset {
            float: left;
        }

        .info {
            float: right;
        }
        </style>
        <script>
                    $(window).on("load",function() {

                    $(document).ready(function() {
                        var $img = $("#canvas").imgViewer();
                    });
                      //VARS===================================================
                      var zoom = {
                        zoomboxLeft:null, zoomboxTop:null, //zoombox
                        cursorStartX:null, cursorStartY:null, //cursor
                        imgStartLeft:null, imgStartTop:null, //image
                        minDragLeft:null,maxDragLeft:null, minDragTop:null,maxDragTop:null
                      };

                      //document.getElementById("canvas").addEventListener("wheel", mouseWheelFun);


                      //KEY-HANDLERS===========================================
                      $(document).keydown(function(e) {
                        if (e.which==32) {e.preventDefault(); if (!$(".zoombox img").hasClass("moving")) {$(".zoombox img").addClass("drag");}} //SPACE
                      });
                      $(document).keyup(function(e) {
                        if (e.which==32) {if (!$(".zoombox img").hasClass("moving")) {$(".zoombox img").removeClass("drag");}} //SPACE
                      });

                      //RESET IMAGE SIZE=======================================
                      $(".reset").on("click",function() {
                        var zoombox = "#"+$(this).parent().attr("id")+" .zoombox";
                        $(zoombox+" img").css({"left":0, "top":0, "width":$(zoombox).width(), "height":$(zoombox).height()});
                      }).click();

                      //ZOOM&DRAG-EVENTS=======================================
                      //MOUSEDOWN----------------------------------------------
                      $(".zoombox img").mousedown(function(e) {
                        e.preventDefault();
                        $(".zoombox img").addClass("moving");
                        var selector = $(this).next();
                        var zoombox = $(this).parent();
                        $(zoombox).addClass("active");

                        //store zoombox left&top
                        zoom.zoomboxLeft = $(zoombox).offset().left + parseInt($(zoombox).css("border-left-width").replace(/\D+/,""));
                        zoom.zoomboxTop = $(zoombox).offset().top + parseInt($(zoombox).css("border-top-width").replace(/\D+/,""));

                        //store starting positions of cursor (relative to zoombox)
                        zoom.cursorStartX = e.pageX - zoom.zoomboxLeft;
                        zoom.cursorStartY = e.pageY - zoom.zoomboxTop;

                        if ($(".zoombox img").hasClass("drag")) {
                          //store starting positions of image (relative to zoombox)
                          zoom.imgStartLeft = $(this).position().left;
                          zoom.imgStartTop = $(this).position().top;

                          //set drag boundaries (relative to zoombox)
                          zoom.minDragLeft = $(zoombox).width() - $(this).width();
                          zoom.maxDragLeft = 0;
                          zoom.minDragTop = $(zoombox).height() - $(this).height();
                          zoom.maxDragTop = 0;
                        } else {
                          //set drag boundaries (relative to zoombox)
                          zoom.minDragLeft = 0;
                          zoom.maxDragLeft = $(zoombox).width();
                          zoom.minDragTop = 0;
                          zoom.maxDragTop = $(zoombox).height();

                          //activate zoom-selector
                          $(selector).css({"display":"block", "width":0, "height":0, "left":zoom.cursorStartX, "top":zoom.cursorStartY});
                        }
                      });

                      //MOUSEMOVE----------------------------------------------
                      $(document).mousemove(function(e) {
                        if ($(".zoombox img").hasClass("moving")) {
                          if ($(".zoombox img").hasClass("drag")) {
                            var img = $(".zoombox.active img")[0];

                            //update image position (relative to zoombox)
                            $(img).css({
                              "left": zoom.imgStartLeft + (e.pageX-zoom.zoomboxLeft)-zoom.cursorStartX,
                              "top": zoom.imgStartTop + (e.pageY-zoom.zoomboxTop)-zoom.cursorStartY
                            });
                            //prevent dragging in prohibited areas (relative to zoombox)
                            if ($(img).position().left <= zoom.minDragLeft) {$(img).css("left",zoom.minDragLeft);} else 
                            if ($(img).position().left >= zoom.maxDragLeft) {$(img).css("left",zoom.maxDragLeft);}
                            if ($(img).position().top <= zoom.minDragTop) {$(img).css("top",zoom.minDragTop);} else 
                            if ($(img).position().top >= zoom.maxDragTop) {$(img).css("top",zoom.maxDragTop);}
                          } else {
                            //calculate selector width and height (relative to zoombox)
                            var width = (e.pageX-zoom.zoomboxLeft)-zoom.cursorStartX;
                            var height = (e.pageY-zoom.zoomboxTop)-zoom.cursorStartY;

                            //prevent dragging in prohibited areas (relative to zoombox)
                            if (e.pageX-zoom.zoomboxLeft <= zoom.minDragLeft) {width = zoom.minDragLeft - zoom.cursorStartX;} else 
                            if (e.pageX-zoom.zoomboxLeft >= zoom.maxDragLeft) {width = zoom.maxDragLeft - zoom.cursorStartX;}
                            if (e.pageY-zoom.zoomboxTop <= zoom.minDragTop) {height = zoom.minDragTop - zoom.cursorStartY;} else 
                            if (e.pageY-zoom.zoomboxTop >= zoom.maxDragTop) {height = zoom.maxDragTop - zoom.cursorStartY;}

                            //update zoom-selector
                            var selector = $(".zoombox.active .selector")[0];
                            $(selector).css({"width":Math.abs(width), "height":Math.abs(height)});
                            if (width<0) {$(selector).css("left",zoom.cursorStartX-Math.abs(width));}
                            if (height<0) {$(selector).css("top",zoom.cursorStartY-Math.abs(height));}
                          }
                        }
                      });

                      //MOUSEUP------------------------------------------------
                      $(document).mouseup(function() {
                        if ($(".zoombox img").hasClass("moving")) {
                          if (!$(".zoombox img").hasClass("drag")) {
                            var img = $(".zoombox.active img")[0];
                            var selector = $(".zoombox.active .selector")[0];

                            if ($(selector).width()>0 && $(selector).height()>0) {
                              //resize zoom-selector and image
                              var magnification = ($(selector).width()<$(selector).height() ? $(selector).parent().width()/$(selector).width() : $(selector).parent().height()/$(selector).height()); //go for the highest magnification
                              var hFactor = $(img).width() / ($(selector).position().left-$(img).position().left);
                              var vFactor = $(img).height() / ($(selector).position().top-$(img).position().top);
                              $(selector).css({"width":$(selector).width()*magnification, "height":$(selector).height()*magnification});
                              $(img).css({"width":$(img).width()*magnification, "height":$(img).height()*magnification});
                              //correct for misalignment during magnification, caused by size-factor
                              $(img).css({
                                "left": $(selector).position().left - ($(img).width()/hFactor),
                                "top": $(selector).position().top - ($(img).height()/vFactor)
                              });

                              //reposition zoom-selector and image (relative to zoombox)
                              var selectorLeft = ($(selector).parent().width()/2) - ($(selector).width()/2);
                              var selectorTop = ($(selector).parent().height()/2) - ($(selector).height()/2);
                              var selectorDeltaLeft = selectorLeft - $(selector).position().left;
                              var selectorDeltaTop = selectorTop - $(selector).position().top;
                              $(selector).css({"left":selectorLeft, "top":selectorTop});
                              $(img).css({"left":"+="+selectorDeltaLeft, "top":"+="+selectorDeltaTop});
                            }
                            //deactivate zoom-selector
                            $(selector).css({"display":"none", "width":0, "height":0, "left":0, "top":0});
                          } else {$(".zoombox img").removeClass("drag");}
                          $(".zoombox img").removeClass("moving");
                          $(".zoombox.active").removeClass("active");
                        }
                      });
                    });

                    function mouseWheelFun(e) {
                        var mousex = 0, mousey = 0;
                        var magnification = 10;
                        var img = $(".zoombox.active canvas")[0];
                        var wheel = e.wheelDelta/120;// n or -n
                        if(wheel < 0)
                        {
                            console.log('zoomout');         
                        }else{
                            console.log('zoomin');
                            mousex = event.clientX - canvas.offsetLeft;
                            mousey = event.clientY - canvas.offsetTop;
                        }
                    }

            </script>
        </head>
        <body>
            <div id="container">
                <div class="zoombox">
                    <img src="http://www.w3schools.com/colors/img_colormap.gif" id="canvas" />
                    <div class="selector"></div>
                </div>
                <input type="button" class="reset" value="Reset" /><span class="info">Press
                    SPACE to drag</span>
            </div>
        </body>
        </html>

Результат: полоса прокрутки отображается на холсте, но не может прокрутить ее. Я проверил это на Chrome. Попытка применения функции прокрутки к элементу div работает нормально, но не в состоянии рисовать область прокрутки. Итак, я применил переполнение: функция прокрутки только для внешнего элемента div. Как я могу решить эту проблему с полосой прокрутки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...