首页 > 解决方案 > I want to achieve a relative image size

问题描述

I wanted to ensure that the picture is always displayed at its full height and the width is calculated in relation to it, as long as it is not zoomed. However, I would like to be able to zoom in and change the size of the window.

I tried to enter the image size relatively in the css code, but the zoom code can't handle it, and the rest by far exceeds my knowledge of HTML / CSS / JS.

Please only use the zoom buttons on the embedded code!

<!doctype html>

<html id="html" lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>My PDF Viewer</title>
        <style>

#documentViewer {
    display: inline-block;
    margin-top: 0;
    padding-top: 0;
    text-align: center;
    position: relative;
}

#body{
    padding: 0;
    margin: 0;
    position: absolute;
    
}

#html{
    text-align: center;
    height:65vw;
    position: absolute;
    top: -0.2vh;
    left: -0.4vw;
    right: -0.2vw;
    margin: 0;
    padding: 0;
}
#tools {
    display: inline-block;
    width: 100%;
    background-color: #035869;
    vertical-align: middle;
    text-align: center;
}
#toolbarDoc{
    display: inline-block;
    padding-top: 1vh;
    padding-bottom: 1vh;
    height: 4vh;
    background-color: #035869;
    vertical-align: middle;
    border: 0.2vw solid black;
    margin-left: 0.2vw;
    text-align: center;
    position: absolute;
    top: -0.2vh;
    left: -0.4vw;
    right: -0.2vw;
}

#current_page, #current_doc, #zoom  {
    position: relative;
    float: left;
    font-size: 2vh;
    font-weight: 500;
    font-family: Verdana;
    color: #fff;
    white-space: nowrap;
    padding: 0.2vw;
    background-color: #357987;
    margin-left: 1.5vw; 
    width: 8.5vw;
    height: 3vh;
    text-align: center;
}
#document_controls{
    float: left;
    padding-left: 7.8vw;
}

#page_controls{
    float: left;
    padding-left: 1.5vw;
}

#zoom_controls{
    float: left;
    padding-left: 1.5vw;
}

#html{
    margin-left: -0.2vw;
    padding: 0;
    display: inline-block;
}

#documentBody{
    display: inline-table;
    text-align: center;
}

#zoomin, #zoomout, #go_previous, #go_next, #go_previous_doc, #go_next_doc  {
    position: relative;
    float: left;
    font-size: 2vh;
    font-family: Verdana;
    font-weight: 500;
    background-color: #357987;
    color: white;
    text-align: center;
    cursor: pointer;
    height: 3.8vh;
    width: 11vw;
    margin-left: 1.5vw; 
    outline: none;
    border: 0.2vw solid white;
}
#zoom-img {
    display: inline-block;  
    cursor: move;
    position: relative;
    width: 700px;
    height: 920px;
    box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
}

#zoom-container {
    display: inline-block;
    position: relative;
    top: 8.5vh;
    overflow: hidden;
    background: #ffffff;
    height: 90vh;
    width: 100vw;
    padding-right: 0.2vw;
    text-align: center;
}

  </style>
    </head>
    <body id="documentBody">
        <div id="documentViewer"></div>
        <div id="toolbarDoc">
            <div id="tools">
                <div id="document_controls">
                    <button id="go_previous_doc">Doc -</button>
                    <!--<input id="current_doc" value="1" type="number" />-->
                    <button id="go_next_doc">Doc +</button>
                </div>
                <div id="page_controls">    
                    <button id="go_previous">Page -</button>
                    <input id="current_page" value="1" type="string" />
                    <button id="go_next">Page +</button>
                </div>
                <div id="zoom_controls">
                    <button id="zoomout" value="Zoom out">Zoom -</button>
                    <!--<input id="zoom" value="1.5" type="number" />-->
                    <button id="zoomin" value="Zoom in">Zoom +</button>
                </div>
            </div>
        </div>
            <div id="zoom-container">
                <img ondragstart="return false" id="zoom-img" src="https://homepages.cae.wisc.edu/~ece533/images/serrano.png" />
            </div>
    </body>
        <script>
        var myState = {
            currentDoc: 1,
            totalDoc: 0,
            currentImg: 1,
            totalImg: 10,
            zoom: 1
        }
        var folders = [];
        folders.length = 0;
        var port = 0815;
        var iTimer = 0;
        var firstload = true;
        window.addEventListener("DOMContentLoaded", function () {
            if (localStorage.getItem("portSave") != null){
                port = Number(localStorage.getItem("portSave"));
                document.getElementById('portInput').value = port;
                console.log(port);
            }
            delete folders;
            console.log(folders);
            src='';
            getFiles();

        });
        var img_ele_height = document.getElementById('zoom-img').getBoundingClientRect().height;
        var img_ele_width = document.getElementById('zoom-img').getBoundingClientRect().width;
        var zoomer = (function () {
        var img_ele = null,
        x_cursor = 0,
        y_cursor = 0,
        x_img_ele = 0,
        y_img_ele = 0,
        orig_width = img_ele_width,
        orig_height = img_ele_height,
        current_top = 0,
        current_left = 0,
        zoom_factor = 1.0;

    return {
        zoom: function (zoomincrement) {
            img_ele = document.getElementById('zoom-img');
            zoom_factor = zoom_factor + zoomincrement;
            if (zoom_factor <= 1.0)
            {
                zoom_factor = 1.0;
                img_ele.style.top =  '0px';    
                img_ele.style.left = '0px';
            }
            var pre_width = orig_width, pre_height = orig_height;
            console.log('prewidth='+img_ele.getBoundingClientRect().width+'; pre_height ='+img_ele.getBoundingClientRect().height);
            var new_width = (orig_width * zoom_factor);
            var new_heigth = (orig_height * zoom_factor);

                console.log('postwidth='+img_ele.style.width+'; postheight ='+img_ele.style.height);

            if (current_left < (orig_width - new_width))
            {
                current_left = (orig_width - new_width);
            }
            if (current_top < (orig_height - new_heigth))
            {
                current_top = (orig_height - new_heigth);
            }
            img_ele.style.left = current_left + 'px';
            img_ele.style.top = current_top + 'px';
            img_ele.style.width = new_width + 'px';
            img_ele.style.height = new_heigth + 'px';

            img_ele = null;
        },

        start_drag: function () {
          if (zoom_factor <= 1.0)
          {
             return;
          }
          img_ele = this;
          x_img_ele = window.event.clientX - document.getElementById('zoom-img').offsetLeft;
          y_img_ele = window.event.clientY - document.getElementById('zoom-img').offsetTop;
          console.log('img='+img_ele.toString()+'; x_img_ele='+x_img_ele+'; y_img_ele='+y_img_ele+';')
          console.log('offLeft='+document.getElementById('zoom-img').offsetLeft+'; offTop='+document.getElementById('zoom-img').offsetTop)
        },

        stop_drag: function () {
          if (img_ele !== null) {
            if (zoom_factor <= 1.0)
            {
              img_ele.style.left = '0px';
              img_ele.style.top =  '0px';      
            }
            console.log(img_ele.style.left+' - '+img_ele.style.top);
            }
          img_ele = null;
        },

        while_drag: function () {
            if (img_ele !== null)
            {
                var x_cursor = window.event.clientX;
                var y_cursor = window.event.clientY;
                var new_left = (x_cursor - x_img_ele);
                if (new_left > 0)
                {
                    new_left = 0;
                }
                if (new_left < (orig_width - img_ele.width))
                {
                    new_left = (orig_width - img_ele.width);
                }
                var new_top = ( y_cursor - y_img_ele);
                if (new_top > 0)
                {
                    new_top = 0;
                }
                if (new_top < (orig_height - img_ele.height))
                {
                    new_top = (orig_height - img_ele.height);
                }
                current_left = new_left;
                img_ele.style.left = new_left + 'px';
                current_top = new_top;
                img_ele.style.top = new_top + 'px';
            }
        }
    };
} ());

document.getElementById('zoomout').addEventListener('click', function() {
  zoomer.zoom(-0.25);
});
document.getElementById('zoomin').addEventListener('click', function() {
  zoomer.zoom(0.25);
});

document.getElementById('zoom-img').addEventListener('mousedown', zoomer.start_drag);
document.getElementById('zoom-container').addEventListener('mousemove', zoomer.while_drag);
document.getElementById('zoom-container').addEventListener('mouseup', zoomer.stop_drag);
document.getElementById('zoom-container').addEventListener('mouseout', zoomer.stop_drag);



        // Get document and image infos

        // Get Documents

        function getFiles(){
            iTimer++;
            var path = '/images';
            var xmlhttp = new XMLHttpRequest();
            var list="";
            myState.totalDoc = 0;
            src='files.php';
            xmlhttp.onreadystatechange = function() {
                if (xmlhttp.readyState == XMLHttpRequest.DONE) {   // XMLHttpRequest.DONE == 4
                    if (xmlhttp.status == 200) {                
                        list = xmlhttp.responseText;
                        var arrStr = list.split(/[""][""]/);
                        var arrayLength = arrStr.length;
                        var foldersList = [];
                        arrStr.forEach(function (item) {
                            filename = item.replace('"', '')
                            //console.log(filename);
                            foldersList.push(filename);
                        });
                        
                        var foldersList2 = [];
                        foldersList.forEach(function (item) {
                            var index = item.lastIndexOf("_");
                            var result = item.substring(0, index);  
                            //console.log(result);
                            foldersList2.push(result);
                        });

                        const foldersFormated = new Map();
                        foldersList.forEach(folder => {
                            var index = folder.lastIndexOf("_");
                            var char = folder.substring(0, index);  
                            !foldersFormated.has(char) ? foldersFormated.set(char, 1) : foldersFormated.set(char, foldersFormated.get(char) + 1);
                        })

                        for (const [key, value] of foldersFormated.entries()) {
                            //console.log(`${key}~${value}`);
                            folders.push(`${key}~${value}`);
                            myState.totalDoc++;
                        }
                        if (firstload == true){
                            loadfirstDoc();
                            firstload = false;
                        }
                        //console.log("TotalDocuments= " + myState.totalDoc);
                    }

                    else if (xmlhttp.status == 400) {
                        alert('There was an error 400');
                    }
                    else {
                        alert('something else other than 200 was returned');
                    }
                }
            };
            xmlhttp.open("GET", "filelist.txt", true);
            xmlhttp.send();
            src='';
        }

        function loadfirstDoc(){
            getFiles();
            myState.currentImg = 1;
            var currentDoc =  folders[(myState.currentDoc-1)];
            var doc = currentDoc.split('~');
            var name = doc[0];
            var number = doc[1];
            myState.totalImg = number;
            console.log(name, 1);
            render(name, 1);
        }
        // Toolbar functions
        function changePort(){
            port = Number(document.getElementById('portInput').value);
            localStorage.setItem("portSave", String(port));
        }

        function render(name, number) {
            console.log('./images/' + name + '/' + name +'_' + number + '.jpg');
            document.getElementById('zoom-img').src ='./images/' + name + '/' + name +'_' + number + '.jpg';
        }

        document.getElementById('go_previous_doc').addEventListener('click', (e) => {
            if (myState.currentDoc == 1)
                return;
            myState.currentDoc -= 1;            
            getFiles();
            myState.currentImg = 1;
            var currentDoc =  folders[(myState.currentDoc-1)];
            var doc = currentDoc.split('~');
            var name = doc[0];
            var number = doc[1];
            myState.totalImg = number;
            console.log(myState.totalImg);
            //console.log('../images/'+ name + '/' + name + '_' + number + '.jpg');
            console.log(name, 1);
            render(name, 1);
        });

        document.getElementById('go_next_doc').addEventListener('click', (e) => {   
            if(myState.currentDoc >= myState.totalDoc)
                return; 
            myState.currentDoc += 1;
            getFiles();
            myState.currentImg = 1;
            var currentDoc =  folders[(myState.currentDoc-1)];
            var doc = currentDoc.split('~');
            var name = doc[0];
            var number = doc[1];
            myState.totalImg = number;
            console.log(myState.totalImg);
            //console.log('../images/'+ name + '/' + name + '_' + number + '.jpg');
            console.log(name, 1);
            render(name, 1);
        });

        document.getElementById('go_previous').addEventListener('click', (e) => {
            if(myState.currentImg == 1) 
                return;
            myState.currentImg-= 1;
            var currentDoc =  folders[(myState.currentDoc-1)];
            var doc = currentDoc.split('~');
            var name = doc[0];
            var number = myState.currentImg;
            console.log("Current Image = " + myState.currentImg);
            render(name, number);
        });

        document.getElementById('go_next').addEventListener('click', (e) => {
            if(myState.currentImg >= myState.totalImg)
                return;
            myState.currentImg += 1;
            var currentDoc =  folders[(myState.currentDoc-1)];
            var doc = currentDoc.split('~');
            var name = doc[0];
            var number = myState.currentImg;
            console.log("Current Image = " + myState.currentImg);
            render(name, number);
        });

        document.getElementById('current_page').addEventListener('keypress', (e) => {
            // Get key code
            var code = (e.keyCode ? e.keyCode : e.which);
            // If key code matches that of the Enter key
            if(code == 13) {
                var desiredPage = document.getElementById('current_page').valueAsNumber;
                                 
                if(desiredPage >= 1 && desiredPage <= myState.totalImg) {
                    myState.currentImg = desiredPage;
                    document.getElementById("current_page").value = desiredPage + '/' + myState.totalImg;
                    render();
                }
            }
        });
    </script>
    </body>
</html>

标签: javascripthtmlcss

解决方案


推荐阅读