Avatar billede davidskp Nybegynder
03. april 2007 - 07:02 Der er 1 kommentar og
1 løsning

Reflection script - tilføje border

Jeg bruger nedenstående script til at lave reflection på mine billeder (kan også findes på http://cow.neondragon.net/stuff/reflection/)

Jeg vil gerne have tilføjet en border på mine billeder som også bliver reflekteret og fader ud. Det skal se sådan her ud: http://www.peecee.dk/resize.php?id=37787 altså med en padding på ca 4px ud til borderen på 1px.

Jeg er ingen haj til js, så det er kun lykkedes mig at få tilføjet border på billeder i firefox og border på reflection i ie...men ingen af delene i begge :(

Løsningen skal virker i alle moderne browsere og gerne tilbage til ie6.

Scriptet ser pt sådan her ud:

/**
* reflection.js v1.6
*
* Contributors: Cow http://cow.neondragon.net
*              Gfx http://www.jroller.com/page/gfx/
*              Sitharus http://www.sitharus.com
*              Andreas Linde http://www.andreaslinde.de
*              Tralala, coder @ http://www.vbulletin.org
*
* Freely distributable under MIT-style license.
*/

/* From prototype.js */
document.getElementsByClassName = function(className) {
    var children = document.getElementsByTagName('*') || document.all;
    var elements = new Array();
 
    for (var i = 0; i < children.length; i++) {
        var child = children[i];
        var classNames = child.className.split(' ');
        for (var j = 0; j < classNames.length; j++) {
            if (classNames[j] == className) {
                elements.push(child);
                break;
            }
        }
    }
    return elements;
}

var Reflection = {
    defaultHeight : 0.5,
    defaultOpacity: 0.5,
   
    add: function(image, options) {
        Reflection.remove(image);
       
        doptions = { "height" : Reflection.defaultHeight, "opacity" : Reflection.defaultOpacity }
        if (options) {
            for (var i in doptions) {
                if (!options[i]) {
                    options[i] = doptions[i];
                }
            }
        } else {
            options = doptions;
        }
   
        try {
            var d = document.createElement('div');
            var p = image;
           
            var classes = p.className.split(' ');
            var newClasses = '';
            for (j=0;j<classes.length;j++) {
                if (classes[j] != "reflect") {
                    if (newClasses) {
                        newClasses += ' '
                    }
                   
                    newClasses += classes[j];
                }
            }

            var reflectionHeight = Math.floor(p.height*options['height']);
            var divHeight = Math.floor(p.height*(1+options['height']));
           
            var reflectionWidth = p.width;
           
            if (document.all && !window.opera) {
                /* Copy original image's classes & styles to div */
                d.className = newClasses;
                p.className = 'reflected';
               
                d.style.cssText = p.style.cssText;
                p.style.cssText = 'vertical-align: bottom';

                var reflection = document.createElement('img');
                reflection.src = p.src;
                reflection.style.width = reflectionWidth+'px';
                reflection.style.margin = '4px 0 0 0';

                reflection.style.marginBottom = "-"+(p.height-reflectionHeight)+'px';
                reflection.style.filter = 'flipv progid:DXImageTransform.Microsoft.Alpha(opacity='+(options['opacity']*100)+', style=1, finishOpacity=0, startx=0, starty=0, finishx=0, finishy='+(options['height']*100)+')';
               
                d.style.width = reflectionWidth+'px';
                d.style.height = divHeight+'px';
                p.parentNode.replaceChild(d, p);
               
                d.appendChild(p);
                d.appendChild(reflection);
            } else {
                var canvas = document.createElement('canvas');
                if (canvas.getContext) {
                    /* Copy original image's classes & styles to div */
                    d.className = newClasses;
                    p.className = 'reflected';
                   
                    d.style.cssText = p.style.cssText;
                    p.style.cssText = 'vertical-align: bottom';
           
                    var context = canvas.getContext("2d");
               
                    canvas.style.height = reflectionHeight+'px';
                    canvas.style.width = reflectionWidth+'px';
                    canvas.style.margin = '4px 0 0 0';
                    canvas.height = reflectionHeight;
                    canvas.width = reflectionWidth;
                   
                    d.style.width = reflectionWidth+'px';
                    d.style.height = divHeight+'px';
                    p.parentNode.replaceChild(d, p);
                   
                    d.appendChild(p);
                    d.appendChild(canvas);
                   
                    context.save();
                   
                    context.translate(0,image.height-1);
                    context.scale(1,-1);
                   
                    context.drawImage(image, 0, 0, reflectionWidth, image.height);
   
                    context.restore();
                   
                    context.globalCompositeOperation = "destination-out";
                    var gradient = context.createLinearGradient(0, 0, 0, reflectionHeight);
                   
                    gradient.addColorStop(1, "rgba(255, 255, 255, 1.0)");
                    gradient.addColorStop(0, "rgba(255, 255, 255, "+(1-options['opacity'])+")");
       
                    context.fillStyle = gradient;
                    if (navigator.appVersion.indexOf('WebKit') != -1) {
                        context.fill();
                    } else {
                        context.fillRect(0, 0, reflectionWidth, reflectionHeight*2);
                    }
                }
            }
        } catch (e) {
        }
    },
   
    remove : function(image) {
        if (image.className == "reflected") {
            image.className = image.parentNode.className;
            image.parentNode.parentNode.replaceChild(image, image.parentNode);
        }
    }
}

function addReflections() {
    var rimages = document.getElementsByClassName('reflect');
    for (i=0;i<rimages.length;i++) {
        var rheight = null;
        var ropacity = null;
       
        var classes = rimages[i].className.split(' ');
        for (j=0;j<classes.length;j++) {
            if (classes[j].indexOf("rheight") == 0) {
                var rheight = classes[j].substring(7)/100;
            } else if (classes[j].indexOf("ropacity") == 0) {
                var ropacity = classes[j].substring(8)/100;
            }
        }
       
        Reflection.add(rimages[i], { height: rheight, opacity : ropacity});
    }
}

var previousOnload = window.onload;
window.onload = function () { if(previousOnload) previousOnload(); addReflections(); }
Avatar billede olebole Juniormester
03. april 2007 - 13:58 #1
<ole>

Nu skriver du, løsningen skal virke i 'alle moderne browsere' - men scriptet er jo skrevet i kode anno 1998. Scriptet er f.eks. ikke kompatibelt med XHTML, da det anvender HTML-elementer og ikke DOM-noder (det samme gælder iøvrigt 'prototype.js', som author'en helt klart har kikket dybt i)  ;o)

/mvh
</bole>
Avatar billede davidskp Nybegynder
30. september 2007 - 00:20 #2
Havde helt glemt den her. Jeg brugte en anden løsning. Lukker.
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