Avatar billede cmau Nybegynder
03. januar 2007 - 14:35 Der er 12 kommentarer og
1 løsning

Layeret skal ikke kunne laves større hvis det er i kanten af bill

Hejsa Eksperter

Jeg har lavet nedenstående javascript, det skal bruges til at brugerne på min side kan vælge et billede og lave et profil billede ud fra det valgte billede. Brugerne kan så flytte det gennemsigtige layer rundt, gøre det større og mindre også trykke Hent koordinater. Dette virker også fint i Firefox, men ryk funktionen virker slet ikke i IE (Har tidligere fået hjælp af olebole til dette, men kan ikke rigtig finde de tidligere svar).

Men mit hoved problem er at hvis i prøver scritet, så kan man hører boksen rundt i billedet størrelse, dette virker fint, men hvis man er i bunden eller helt til højre og gøre boksen større så bliver den større ud over billedet. Hvordan kan jeg undgå dette?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
<style type="text/css">
    body {
        margin:0;
        padding:0;
    }
    #layer {
        position:absolute;
        top:0px;
        left:0px;
        width:160px;
        height:160px;
        background-color:#EEEEEE;
        filter:alpha(opacity=30);
        -moz-opacity: 0.3;
        opacity: 0.3;
        text-align:center;
    }
</style>
<script type="text/JavaScript">
    length = 5;
    function gettopleft() {
        left = document.getElementById('layer').offsetLeft;
        top = document.getElementById('layer').offsetTop;
    }
    function getwidthheight() {
        width = document.getElementById('layer').offsetWidth;
        height = document.getElementById('layer').offsetHeight;
    }
    function getimage() {
        imagewidth = document.getElementById('image').offsetWidth;
        imageheight = document.getElementById('image').offsetHeight;
    }
    function move(event) {
        if (event.keyCode == 37) {
            gettopleft();
            if(left != '0') {
                calculate = left - length;
                document.getElementById('layer').style.left = calculate + "px";
            }
        } else if (event.keyCode == 39) {
            gettopleft();
            getimage();
            getwidthheight();
            if((left + width) < imagewidth) {
                calculate = left + length;
                document.getElementById('layer').style.left = calculate + "px";
            }
        } else if (event.keyCode == 38) {
            gettopleft();
            if(top != '0') {
                calculate = top - length;
                document.getElementById('layer').style.top = calculate + "px";
            }
        } else if (event.keyCode == 40) {
            gettopleft();
            getimage();
            getwidthheight();
            if((top + height) < imageheight) {
                calculate = top + length;
                document.getElementById('layer').style.top = calculate + "px";
            }
        }
    }
    function changebox(way) {
        getwidthheight();
        if(way == 'big' && width < 300) {
                calculatewidth = width + 20;
                calculateheight = height + 20;
        } else if(way == 'small' && width > 140) {
                calculatewidth = width - 20;
                calculateheight = height - 20;
        }
        document.getElementById('layer').style.width = calculatewidth + "px";
        document.getElementById('layer').style.height = calculateheight + "px";
    }
    function makeit() {
        gettopleft();
        getwidthheight();
        leftcalculate = left + width;
        topcalculate = top + height;
        alert("Billedets koordinater\nVenstre top: (" + left + "," + top + ")\nVenstre bund: (" + left + "," + topcalculate + ")\nHøjre top: (" + leftcalculate + "," + top + ")\nHøjre bund: (" + leftcalculate + "," + topcalculate + ")\n");
    }
</script>
</head>

<body onload="getimage();" onkeydown="move(event);">
<img id="image" src="htx13.JPG" border="0" alt=""><br />
<input type="button" value="Større" onclick="changebox('big');"> <input type="button" value="Mindre" onclick="changebox('small');"><input type="button" value="Hent koordinater" onclick="makeit();"> Brug piltasterne NOOB!
<div id="layer">Preview</div>
</body>
</html>
Avatar billede cmau Nybegynder
03. januar 2007 - 15:19 #1
Nu har jeg faktisk selv ordnet den, så der kun problemer med at intet virker i IE.

Den nye kode er:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
<style type="text/css">
    body {
        margin:0;
        padding:0;
    }
    #layer {
        position:absolute;
        top:0px;
        left:0px;
        width:160px;
        height:160px;
        background-color:#EEEEEE;
        filter:alpha(opacity=30);
        -moz-opacity: 0.3;
        opacity: 0.3;
        text-align:center;
    }
</style>
<script type="text/JavaScript">
    length = 5;
    function gettopleft() {
        left = document.getElementById('layer').offsetLeft;
        top = document.getElementById('layer').offsetTop;
    }
    function getwidthheight() {
        width = document.getElementById('layer').offsetWidth;
        height = document.getElementById('layer').offsetHeight;
    }
    function getimage() {
        imagewidth = document.getElementById('image').offsetWidth;
        imageheight = document.getElementById('image').offsetHeight;
    }
    function move(event) {
        gettopleft();
        if (event.keyCode == 37) {
            if(left != '0') {
                calculate = left - length;
                document.getElementById('layer').style.left = calculate + "px";
            }
        } else if (event.keyCode == 39) {
            getimage();
            getwidthheight();
            if((left + width) < imagewidth) {
                calculate = left + length;
                document.getElementById('layer').style.left = calculate + "px";
            }
        } else if (event.keyCode == 38) {
            if(top != '0') {
                calculate = top - length;
                document.getElementById('layer').style.top = calculate + "px";
            }
        } else if (event.keyCode == 40) {
            getimage();
            getwidthheight();
            if((top + height) < imageheight) {
                calculate = top + length;
                document.getElementById('layer').style.top = calculate + "px";
            }
        }
    }
    function changebox(way) {
        getwidthheight();
        if(way == 'big' && width < 300) {
            gettopleft();
            getimage();
            leftcalculate = left + width;
            topcalculate = top + height;
            if(imagewidth < (leftcalculate + 20) || imageheight < (topcalculate+ 20)) {
                alert("Boksen kan ikke blive større, da den så vil ryge ud over billedets kant.\nRyg evt. kassen lidt mod venstre og op.");
            } else {
                calculatewidth = width + 20;
                calculateheight = height + 20;
            }
        } else if(way == 'small' && width > 140) {
            calculatewidth = width - 20;
            calculateheight = height - 20;
        }
        document.getElementById('layer').style.width = calculatewidth + "px";
        document.getElementById('layer').style.height = calculateheight + "px";
    }
    function makeit() {
        gettopleft();
        getwidthheight();
        getimage();
        leftcalculate = left + width;
        topcalculate = top + height;
        alert("Billedets koordinater\nVenstre top: (" + left + "," + top + ")\nVenstre bund: (" + left + "," + topcalculate + ")\nHøjre top: (" + leftcalculate + "," + top + ")\nHøjre bund: (" + leftcalculate + "," + topcalculate + ")\n");
    }
</script>
</head>

<body onload="getimage();" onkeydown="move(event);">
<img id="image" src="htx13.JPG" border="0" alt=""><br />
<input type="button" value="Større" onclick="changebox('big');"> <input type="button" value="Mindre" onclick="changebox('small');"> <input type="button" value="Hent koordinater" onclick="makeit();"> Brug piltasterne NOOB!
<div id="layer">Preview</div>
</body>
</html>
Avatar billede crazysnap Seniormester
03. januar 2007 - 16:27 #2
Hej cmau!

Så skulle det også virke i IE :). Der manglede bare lige at blive deklareret et par variable (det kræver IE).

Den nye kode som virker både i IE og FF ses nedenfor.



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Untitled Document</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
        <style type="text/css"> body { margin:0; padding:0; }
    #layer { position:absolute; top:0px; left:0px; width:160px; height:160px; background-color:#EEEEEE; filter:alpha(opacity=30); -moz-opacity: 0.3; opacity: 0.3; text-align:center; }
    </style>
        <script type="text/JavaScript">
    var length = 5;
    var top, left, width, height;

    function gettopleft() {
        var obj = document.getElementById('layer');
        left = obj.offsetLeft;
        top = obj.offsetTop;
    }
    function getwidthheight() {
        var obj = document.getElementById('layer');
        width = obj.offsetWidth;
        height = obj.offsetHeight;
    }
    function getimage() {
        var obj = document.getElementById('image');
        imagewidth = obj.offsetWidth;
        imageheight = obj.offsetHeight;
    }
    function move(event) {
        gettopleft();
        if (event.keyCode == 37) {
            if(left != '0') {
                calculate = left - length;
                document.getElementById('layer').style.left = calculate + "px";
            }
        } else if (event.keyCode == 39) {
            getimage();
            getwidthheight();
            if((left + width) < imagewidth) {
                calculate = left + length;
                document.getElementById('layer').style.left = calculate + "px";
            }
        } else if (event.keyCode == 38) {
            if(top != '0') {
                calculate = top - length;
                document.getElementById('layer').style.top = calculate + "px";
            }
        } else if (event.keyCode == 40) {
            getimage();
            getwidthheight();
            if((top + height) < imageheight) {
                calculate = top + length;
                document.getElementById('layer').style.top = calculate + "px";
            }
        }
    }
    function changebox(way) {
        getwidthheight();
        if(way == 'big' && width < 300) {
            gettopleft();
            getimage();
            leftcalculate = left + width;
            topcalculate = top + height;
            if(imagewidth < (leftcalculate + 20) || imageheight < (topcalculate+ 20)) {
                alert("Boksen kan ikke blive større, da den så vil ryge ud over billedets kant.\nRyg evt. kassen lidt mod venstre og op.");
            } else {
                calculatewidth = width + 20;
                calculateheight = height + 20;
            }
        } else if(way == 'small' && width > 140) {
            calculatewidth = width - 20;
            calculateheight = height - 20;
        }
        document.getElementById('layer').style.width = calculatewidth + "px";
        document.getElementById('layer').style.height = calculateheight + "px";
    }
    function makeit() {
        gettopleft();
        getwidthheight();
        getimage();
        leftcalculate = left + width;
        topcalculate = top + height;
        alert("Billedets koordinater\nVenstre top: (" + left + "," + top + ")\nVenstre bund: (" + left + "," + topcalculate + ")\nHøjre top: (" + leftcalculate + "," + top + ")\nHøjre bund: (" + leftcalculate + "," + topcalculate + ")\n");
    }
        </script>
    </head>
    <body onload="getimage();" onkeydown="move(event);">
        <img id="image" src="htx13.JPG" border="0" alt=""><br>
        <input type="button" value="Større" onclick="changebox('big');" ID="Button1" NAME="Button1">
        <input type="button" value="Mindre" onclick="changebox('small');" ID="Button2" NAME="Button2">
        <input type="button" value="Hent koordinater" onclick="makeit();" ID="Button3" NAME="Button3">
        Brug piltasterne NOOB!
        <div id="layer">Preview</div>
    </body>
</html>



- Snap
Avatar billede cmau Nybegynder
03. januar 2007 - 16:34 #3
Nu har jeg selv selvfølgelig ændret i koden, så kan ikke bare kopirer din, men kan det passe at det eneste der er ændret i er:

    var length = 5;
    var top, left, width, height;

    function gettopleft() {
        var obj = document.getElementById('layer');
        left = obj.offsetLeft;
        top = obj.offsetTop;
    }
    function getwidthheight() {
        var obj = document.getElementById('layer');
        width = obj.offsetWidth;
        height = obj.offsetHeight;
    }
    function getimage() {
        var obj = document.getElementById('image');
        imagewidth = obj.offsetWidth;
        imageheight = obj.offsetHeight;
    }

Så ville jeg også hører om man kunne gøre sådan at den kørte mere jævnt. Evt om der findes en der tjekker hvilke taster der holdes nede?
Avatar billede crazysnap Seniormester
03. januar 2007 - 16:46 #4
Ja det var mine umiddelbart ændringer. Du burde også deklarere imagewidth og imageheight inden du bruger dem (det overså jeg i første om gang):

tilføje:

var imagewidth, imageheight;

efter:

var length = 5;
var top, left, width, height;


Jeg ved ikke helt hvad du mener med jævnt? Mener du at firkanten skal rykke skråt når to pil-taster holdes nede? For det kan f.eks. snildt gøres ved en kombination af onkeypress og onkeyup events.

- Snap
Avatar billede cmau Nybegynder
03. januar 2007 - 16:49 #5
Ja, det nemlig skrå jeg mener.
Avatar billede cmau Nybegynder
03. januar 2007 - 16:51 #6
Men hvis det er onkeyup vil den jo rygge to gange.
Avatar billede crazysnap Seniormester
03. januar 2007 - 17:08 #7
Det er korrekt og kræver derfor en udvidelse af koden der holder styr på hvilke knapper der er nede og rykker firkanten herefter. Jeg er på vej fra arbejde nu ;), så kan desværre ikke give et eksempel nu (før mente jeg selvfølgelig ved en kobination af onkeydown (ikke onkeypress) og onkeyup).

Jeg vil dog lige (frækt) pointere at det næsten ville være ligeså nemt at styre firkanten med musen (drag'e den rundt når der klikkes på den) og samtidigt måske mere brugervenligt. Men det er selvfølgelig en smags sag, ville bare lige nævne det for dig hvis du ikke havde overvejet muligheden! :)

- Snap
Avatar billede cmau Nybegynder
03. januar 2007 - 17:39 #8
Ja, men det med musen, vi har simpelt prøvet og prøvet og har sågar en person siddende og prøver nu, kan du evt vise os hvordan?
Avatar billede crazysnap Seniormester
03. januar 2007 - 20:50 #9
Hej cmau,

Så er jeg kommet hjem og har lige bikset et hurtigt eksempel sammen til jer (videre-brygget fra jeres). Det er selvfølgelig kun lige basis tingene og man kunne snildt udvide det så boxen kan resizes med musen også, men det må vist snart være jeres opgave! ;)

Har også skrevet et par kommentare i koden, dog på engelsk (en vane).

Håber det kan hjælpe:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Untitled Document</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
        <style type="text/css"> body { margin:0; padding:0; }
    #layer { position:absolute; top:0px; left:0px; width:160px; height:160px; background-color:#EEEEEE; filter:alpha(opacity=30); -moz-opacity: 0.3; opacity: 0.3; text-align:center; }
    </style>
        <script type="text/JavaScript">
    var top, left, width, height, imagewidth, imageheight;
    var leftcalculate, topcalculate;
    var dwin;
   
    var intStartX;
    var intStartY;
   
    var move = false;

    function gettopleft()
    {
        var obj = document.getElementById('layer');
        left = obj.offsetLeft;
        top = obj.offsetTop;
    }
    function getwidthheight()
    {
        var obj = document.getElementById('layer');
        width = obj.offsetWidth;
        height = obj.offsetHeight;
    }
    function getimage()
    {
        var obj = document.getElementById('image');
        imagewidth = obj.offsetWidth;
        imageheight = obj.offsetHeight;
    }
   
    function mousedown(event)
    {
        //If left button is pressed
        if(document.all) //IE buttons
        {
            if(event.button == 1)
                move = true;
        }
        else //FireFox buttons fix (firefox uses button 0 instead of 1)
        {
            if(event.button == 0)
                move = true;
        }
    }
   
   
    function mousemove(event)
    {
        if(move)
        {
            //Move rectangle by diff
            var diffX = event.clientX - intStartX;
            var diffY = event.clientY - intStartY;
           
            //Update start positions (so it wont accelerate)
            intStartX = event.clientX; intStartY = event.clientY;
           
            //Grab rectangle
            var divRect = document.getElementById('layer');
           
            var newOffsetLeft = divRect.offsetLeft + diffX;
            var newOffsetTop = divRect.offsetTop + diffY;
           
            getimage();
           
            //Make sure rectangle is within borders of image
            newOffsetLeft = Math.max(Math.min(newOffsetLeft, imagewidth - divRect.offsetWidth), 0);
            newOffsetTop = Math.max(Math.min(newOffsetTop, imageheight - divRect.offsetHeight), 0);
           
            //Update position
            divRect.style.left = newOffsetLeft + "px";
            divRect.style.top = newOffsetTop + "px";
           
        }     
    }
   
    function mousedownpic(event)
    {
        //Setup start values
        intStartX = event.clientX;
        intStartY = event.clientY;
    }
   
    //Makes sure the move functionality is disabled when the mouse
    //is moved outside the image-border
    function mouseoutpic(event)
    {
        move = false;
    }
   
    function mouseup(event)
    {
        //Left button is pressed
        move = false;
    }
   
    function changebox(way) {
        getwidthheight();
        if(way == 'big' && width < 300) {
            gettopleft();
            getimage();
            leftcalculate = left + width;
            topcalculate = top + height;
            if(imagewidth < (leftcalculate + 20) || imageheight < (topcalculate+ 20)) {
                alert("Boksen kan ikke blive større, da den så vil ryge ud over billedets kant.\nRyg evt. kassen lidt mod venstre og op.");
            } else {
                calculatewidth = width + 20;
                calculateheight = height + 20;
            }
        } else if(way == 'small' && width > 140) {
            calculatewidth = width - 20;
            calculateheight = height - 20;
        }
        document.getElementById('layer').style.width = calculatewidth + "px";
        document.getElementById('layer').style.height = calculateheight + "px";
    }
    function makeit() {
        gettopleft();
        getwidthheight();
        getimage();
        leftcalculate = left + width;
        topcalculate = top + height;
        alert("Billedets koordinater\nVenstre top: (" + left + "," + top + ")\nVenstre bund: (" + left + "," + topcalculate + ")\nHøjre top: (" + leftcalculate + "," + top + ")\nHøjre bund: (" + leftcalculate + "," + topcalculate + ")\n");
    }
</script>
    </head>
    <body onload="getimage();" onmousemove="mousemove(event);" onmousedown="mousedownpic(event);" onmouseout="mouseoutpic(event);">
        <img id="image" src="file:///C:\world-map.bmp" border="0" alt=""><br>
        <input type="button" value="Større" onclick="changebox('big');" ID="Button1" NAME="Button1">
        <input type="button" value="Mindre" onclick="changebox('small');" ID="Button2" NAME="Button2">
        <input type="button" value="Hent koordinater" onclick="makeit();" ID="Button3" NAME="Button3">
        Brug mussen nu ;)!
        <div id="layer" onmousedown="mousedown(event);" onmouseup="mouseup(event);">Preview</div>
    </body>
</html>




:)
- Snap
Avatar billede crazysnap Seniormester
03. januar 2007 - 20:52 #10
du skal lige ændre src attributen til img tagen til et validt billede på din computer ;)...


- Snap
Avatar billede cmau Nybegynder
03. januar 2007 - 23:17 #11
Du har godt nok styr på dit kram. Det med de ekstra funktioner behøves vi ikke have. Kan bedst selv lige at vide hvad de forskellige ting gør, så skal lige have mig sat ind i det før jeg overhovedet vil tænke på at videre udviklet det :)

Tusind tak for hjælpen :D
Avatar billede crazysnap Seniormester
03. januar 2007 - 23:27 #12
Hehe, godt så! :)

Glad for jeg kunne hjælpe, håber du får lavet din side og du må endelig skrive hvis der opstår flere problemer ;)


Tak for pointene..


- Snap
Avatar billede cmau Nybegynder
03. januar 2007 - 23:29 #13
Yes, men indtil videre regner jeg ikke med problemer, da jeg faktisk fik bygget den anden hvor det var piltasterne helt færdig, så den også kunne skære billedet ud.

:D Men nu vil jeg sove.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester