2

我正在使用imageFlow制作图像滑块。我已经为图像添加了点击翻转功能。我的问题是我想在图像周围添加一个 div 以显示描述,但是当我在图像周围添加 div 时,它变得不可见。我不知道如何更新 js 文件。

请建议,

/* ImageFlow constructor */

函数图像流(){

/* Setting option defaults */
this.defaults =
{
    animationSpeed:     100,             /* Animation speed in ms */
    aspectRatio:        1.964,          /* Aspect ratio of the ImageFlow container (width divided by height) */
    buttons:            false,          /* Toggle navigation buttons */
    captions:           false,           /* Toggle captions */
    circular:           true,          /* Toggle circular rotation */
    imageCursor:        'default',      /* Cursor type for all images - default is 'default' */
    ImageFlowID:        'imageflow',    /* Default id of the ImageFlow container */
    imageFocusM:        1.0,            /* Multiplicator for the focussed image size in percent */
    imageFocusMax:      3,              /* Max number of images on each side of the focussed one */
    imagePath:          '',             /* Path to the images relative to the reflect_.php script */
    imageScaling:       true,           /* Toggle image scaling */ 
    imagesHeight:       0.67,           /* Height of the images div container in percent */
    imagesM:            1.0,            /* Multiplicator for all images in percent */
    onClick:            function() { /*document.location = this.url;*/ flipIt(this) },   /* Onclick behaviour */
    opacity:            true,          /* Toggle image opacity */
    opacityArray:       [10,8,6,4],   /* Image opacity (range: 0 to 10) first value is for the focussed image */
    percentLandscape:   118,            /* Scale landscape format */
    percentOther:       100,            /* Scale portrait and square format */
    preloadImages:      false,           /* Toggles loading bar (false: requires img attributes height and width) */
    reflections:        false,           /* Toggle reflections */
    reflectionGET:      '',             /* Pass variables via the GET method to the reflect_.php script */
    reflectionP:        0.5,            /* Height of the reflection in percent of the source image */
    reflectionPNG:      false,          /* Toggle reflect2.php or reflect3.php */
    reflectPath:        '',             /* Path to the reflect_.php script */
    scrollbarP:         0.6,            /* Width of the scrollbar in percent */
    slider:             false,           /* Toggle slider */
    sliderCursor:       'e-resize',     /* Slider cursor type - default is 'default' */
    sliderWidth:        17,             /* Width of the slider in px */
    slideshow:          false,          /* Toggle slideshow */
    slideshowSpeed:     1500,           /* Time between slides in ms */
    slideshowAutoplay:  false,          /* Toggle automatic slideshow play on startup */
    startID:            1,              /* Image ID to begin with */
    glideToStartID:     true,           /* Toggle glide animation to start ID */
    startAnimation:     false,          /* Animate images moving in from the right on startup */
    xStep:              180             /* Step width on the x-axis in px */
};


/* Closure for this */
var my = this;
//console.log(my)

/* Initiate ImageFlow */
this.init = function (options)
{
    /* Evaluate options */
    for(var name in my.defaults) 
    {
        this[name] = (options !== undefined && options[name] !== undefined) ? options[name] : my.defaults[name];
    }

    /* Try to get ImageFlow div element */
    var ImageFlowDiv = document.getElementById(my.ImageFlowID);
    if(ImageFlowDiv)
    {
        /* Set it global within the ImageFlow scope */
        ImageFlowDiv.style.visibility = 'visible';
        this.ImageFlowDiv = ImageFlowDiv;

        /* Try to create XHTML structure */
        if(this.createStructure())
        {
            this.imagesDiv = document.getElementById(my.ImageFlowID+'_images');
            this.captionDiv = document.getElementById(my.ImageFlowID+'_caption');
            this.navigationDiv = document.getElementById(my.ImageFlowID+'_navigation');
            this.scrollbarDiv = document.getElementById(my.ImageFlowID+'_scrollbar');
            this.sliderDiv = document.getElementById(my.ImageFlowID+'_slider');
            this.buttonNextDiv = document.getElementById(my.ImageFlowID+'_next');
            this.buttonPreviousDiv = document.getElementById(my.ImageFlowID+'_previous');
            this.buttonSlideshow = document.getElementById(my.ImageFlowID+'_slideshow');

            this.indexArray = [];
            this.current = 0;
            this.imageID = 0;
            this.target = 0;
            this.memTarget = 0;
            this.firstRefresh = true;
            this.firstCheck = true;
            this.busy = false;

            /* Set height of the ImageFlow container and center the loading bar */
            var width = this.ImageFlowDiv.offsetWidth;
            var height = Math.round(width / my.aspectRatio);
            document.getElementById(my.ImageFlowID+'_loading_txt').style.paddingTop = ((height * 0.5) -22) + 'px';
            ImageFlowDiv.style.height = height + 'px';

            /* Init loading progress */
            this.loadingProgress();
        }
    }
};


/* Create HTML Structure */
this.createStructure = function()
{
    /* Create images div container */
    var imagesDiv = my.Helper.createDocumentElement('div','images');

    /* Shift all images into the images div */
    var node, version, src, imageNode;
    var max = my.ImageFlowDiv.childNodes.length;
    for(var index = 0; index < max; index++)
    {
        node = my.ImageFlowDiv.childNodes[index];
        if (node && node.nodeType == 1 && node.nodeName == 'IMG')
        {
            /* Add 'reflect.php?img=' */
            if(my.reflections === true)
            {
                version = (my.reflectionPNG) ? '3' : '2';
                src = my.imagePath+node.getAttribute('src',2);
                src = my.reflectPath+'reflect'+version+'.php?img='+src+my.reflectionGET;
                node.setAttribute('src',src);
            }

            /* Clone image nodes and append them to the images div */
            imageNode = node.cloneNode(true);
            imagesDiv.appendChild(imageNode);
        }
    }

    /* Clone some more images to make a circular animation possible */
    if(my.circular)
    {
        /* Create temporary elements to hold the cloned images */
        var first = my.Helper.createDocumentElement('div','images');
        var last = my.Helper.createDocumentElement('div','images');

        /* Make sure, that there are enough images to use circular mode */
        max = imagesDiv.childNodes.length;
        if(max < my.imageFocusMax)
        {
            my.imageFocusMax = max;
        }

        /* Do not clone anything if there is only one image */
        if(max > 1)
        {
            /* Clone the first and last images */
            var i;
            for(i = 0; i < max; i++)
            {
                /* Number of clones on each side equals the imageFocusMax */
                node = imagesDiv.childNodes[i];
                if(i < my.imageFocusMax)
                {
                    imageNode = node.cloneNode(true);
                    first.appendChild(imageNode);
                }
                if(max-i < my.imageFocusMax+1)
                {
                    imageNode = node.cloneNode(true);
                    last.appendChild(imageNode);
                }
            }

            /* Sort the image nodes in the following order: last | originals | first */
            for(i = 0; i < max; i++)
            {
                node = imagesDiv.childNodes[i];
                imageNode = node.cloneNode(true);
                last.appendChild(imageNode);
            }



            for(i = 0; i < my.imageFocusMax; i++)
            {
                node = first.childNodes[i];
                imageNode = node.cloneNode(true);
                last.appendChild(imageNode);
            }

            /* Overwrite the imagesDiv with the new order */
            imagesDiv = last;

        }


    }

    /* Create slideshow button div and append it to the images div */
    if(my.slideshow)
    {
        var slideshowButton = my.Helper.createDocumentElement('div','slideshow');
        imagesDiv.appendChild(slideshowButton);
    }

    /* Create loading text container */
    var loadingP = my.Helper.createDocumentElement('p','loading_txt');
    var loadingText = document.createTextNode(' ');
    loadingP.appendChild(loadingText);

    /* Create loading div container */
    var loadingDiv = my.Helper.createDocumentElement('div','loading');

    /* Create loading bar div container inside the loading div */
    var loadingBarDiv = my.Helper.createDocumentElement('div','loading_bar');
    loadingDiv.appendChild(loadingBarDiv);

    /* Create captions div container */
    var captionDiv = my.Helper.createDocumentElement('div','caption');

    /* Create slider and button div container inside the scrollbar div */
    var scrollbarDiv = my.Helper.createDocumentElement('div','scrollbar');
    var sliderDiv = my.Helper.createDocumentElement('div','slider');
    scrollbarDiv.appendChild(sliderDiv);
    if(my.buttons)
    {
        var buttonPreviousDiv = my.Helper.createDocumentElement('div','previous', 'button');
        var buttonNextDiv = my.Helper.createDocumentElement('div','next', 'button');
        scrollbarDiv.appendChild(buttonPreviousDiv);
        scrollbarDiv.appendChild(buttonNextDiv);
    }

    /* Create navigation div container beneath images div */
    var navigationDiv = my.Helper.createDocumentElement('div','navigation');
    navigationDiv.appendChild(captionDiv);
    navigationDiv.appendChild(scrollbarDiv);

    /* Update document structure and return true on success */
    var success = false;
    if (my.ImageFlowDiv.appendChild(imagesDiv) &&
        my.ImageFlowDiv.appendChild(loadingP) &&
        my.ImageFlowDiv.appendChild(loadingDiv) &&
        my.ImageFlowDiv.appendChild(navigationDiv))
    {
        /* Remove image nodes outside the images div */
        max = my.ImageFlowDiv.childNodes.length;
        for(index = 0; index < max; index++)
        {
            node = my.ImageFlowDiv.childNodes[index];
            if (node && node.nodeType == 1 && node.nodeName == 'IMG')
            {
                my.ImageFlowDiv.removeChild(node);
            }
        }
        success = true;
    }
    return success;
};


/* Manage loading progress and call the refresh function */
this.loadingProgress = function()
{
    var p = my.loadingStatus();
    if((p < 100 || my.firstCheck) && my.preloadImages)
    {
        /* Insert a short delay if the browser loads rapidly from its cache */
        if(my.firstCheck && p == 100)
        {
            my.firstCheck = false;
            window.setTimeout(my.loadingProgress, 100);
        }
        else
        {
            window.setTimeout(my.loadingProgress, 40);
        }
    }
    else
    {
        /* Hide loading elements */
        document.getElementById(my.ImageFlowID+'_loading_txt').style.display = 'none';
        document.getElementById(my.ImageFlowID+'_loading').style.display = 'none';

        /* Refresh ImageFlow on window resize - delay adding this event for the IE */
        window.setTimeout(my.Helper.addResizeEvent, 1000);

        /* Call refresh once on startup to display images */
        my.refresh();

        /* Only initialize navigation elements if there is more than one image */
        if(my.max > 1)
        {
            /* Initialize mouse, touch and key support */
            //my.MouseWheel.init();
            //my.MouseDrag.init();
            my.Touch.init();
            my.Key.init();

            /* Toggle slideshow */
            if(my.slideshow)
            {
                my.Slideshow.init();
            }

            /* Toggle scrollbar visibility */
            if(my.slider)
            {
                my.scrollbarDiv.style.visibility = 'visible';
            }
        }
    }
};


/* Return loaded images in percent, set loading bar width and loading text */
this.loadingStatus = function()
{
    var max = my.imagesDiv.childNodes.length;
    var i = 0, completed = 0;
    var image = null;
    for(var index = 0; index < max; index++)
    {
        image = my.imagesDiv.childNodes[index];
        if(image && image.nodeType == 1 && image.nodeName == 'IMG')
        {
            if(image.complete)
            {
                completed++;
            }
            i++;
        }
    }

    var finished = Math.round((completed/i)*100);
    var loadingBar = document.getElementById(my.ImageFlowID+'_loading_bar');
    loadingBar.style.width = finished+'%';

    /* Do not count the cloned images */
    if(my.circular)
    {
        i = i - (my.imageFocusMax*2);
        completed = (finished < 1) ? 0 : Math.round((i/100)*finished);
    }

    var loadingP = document.getElementById(my.ImageFlowID+'_loading_txt');
    var loadingTxt = document.createTextNode('loading images '+completed+'/'+i);
    loadingP.replaceChild(loadingTxt,loadingP.firstChild);
    return finished;
};


/* Cache EVERYTHING that only changes on refresh or resize of the window */
this.refresh = function()
{
    /* Cache global variables */
    this.imagesDivWidth = my.imagesDiv.offsetWidth+my.imagesDiv.offsetLeft;
    this.maxHeight = Math.round(my.imagesDivWidth / my.aspectRatio);
    this.maxFocus = my.imageFocusMax * my.xStep;
    this.size = my.imagesDivWidth * 0.5;
    this.sliderWidth = my.sliderWidth * 0.5;
    this.scrollbarWidth = (my.imagesDivWidth - ( Math.round(my.sliderWidth) * 2)) * my.scrollbarP;
    this.imagesDivHeight = Math.round(my.maxHeight * my.imagesHeight);

    /* Change imageflow div properties */
    my.ImageFlowDiv.style.height = my.maxHeight + 'px';

    /* Change images div properties */
    my.imagesDiv.style.height =  my.imagesDivHeight + 'px'; 

    /* Change images div properties */
    my.navigationDiv.style.height =  (my.maxHeight - my.imagesDivHeight) + 'px'; 

    /* Change captions div properties */
    my.captionDiv.style.width = my.imagesDivWidth + 'px';
    my.captionDiv.style.paddingTop = Math.round(my.imagesDivWidth * 0.02) + 'px';

    /* Change scrollbar div properties */
    my.scrollbarDiv.style.width = my.scrollbarWidth + 'px';
    my.scrollbarDiv.style.marginTop = Math.round(my.imagesDivWidth * 0.02) + 'px';
    my.scrollbarDiv.style.marginLeft = Math.round(my.sliderWidth + ((my.imagesDivWidth - my.scrollbarWidth)/2)) + 'px';

    /* Set slider attributes */
    my.sliderDiv.style.cursor = my.sliderCursor;
    my.sliderDiv.onmousedown = function () { my.MouseDrag.start(this); return false;};

    if(my.buttons)
    {
        my.buttonPreviousDiv.onclick = function () { my.MouseWheel.handle(1); };
        my.buttonNextDiv.onclick = function () { my.MouseWheel.handle(-1); };
    }

    /* Set the reflection multiplicator */
    var multi = (my.reflections === true) ? my.reflectionP + 1 : 1;

    /* Set image attributes */
    var max = my.imagesDiv.childNodes.length;
    var i = 0;
    var image = null;
    for (var index = 0; index < max; index++)
    {
        image = my.imagesDiv.childNodes[index];
        if(image !== null && image.nodeType == 1 && image.nodeName == 'IMG')
        {
            this.indexArray[i] = index;

            /* Set image attributes to store values */
            image.url = image.getAttribute('longdesc');
            image.xPosition = (-i * my.xStep);
            image.i = i;

            /* Add width and height as attributes only once */
            if(my.firstRefresh)
            {
                if(image.getAttribute('width') !== null && image.getAttribute('height') !== null)
                {
                    image.w = image.getAttribute('width');
                    image.h = image.getAttribute('height') * multi;
                }
                else{
                    image.w = image.width;
                    image.h = image.height;
                }
            }

            /* Check source image format. Get image height minus reflection height! */
            if((image.w) > (image.h / (my.reflectionP + 1)))
            {
                /* Landscape format */
                image.pc = my.percentLandscape;
                image.pcMem = my.percentLandscape;
            }
            else
            {
                /* Portrait and square format */
                image.pc = my.percentOther;
                image.pcMem = my.percentOther;
            }

            /* Change image positioning */
            if(my.imageScaling === false)
            {
                image.style.position = 'relative';
                image.style.display = 'inline';
            }

            /* Set image cursor type */
            image.style.cursor = my.imageCursor;
            i++;
        }
    }
    this.max = my.indexArray.length;

    /* Override dynamic sizes based on the first image */
    if(my.imageScaling === false)
    {
        image = my.imagesDiv.childNodes[my.indexArray[0]];

        /* Set left padding for the first image */
        this.totalImagesWidth = image.w * my.max;
        image.style.paddingLeft = (my.imagesDivWidth/2) + (image.w/2) + 'px';

        /* Override images and navigation div height */
        my.imagesDiv.style.height =  image.h + 'px';
        my.navigationDiv.style.height =  (my.maxHeight - image.h) + 'px'; 
    }

    /* Handle startID on the first refresh */
    if(my.firstRefresh)
    {
        /* Reset variable */
        my.firstRefresh = false;

        /* Set imageID to the startID */
        my.imageID = my.startID-1;
        if (my.imageID < 0 )
        {
            my.imageID = 0;
        }

        /* Map image id range in cicular mode (ignore the cloned images) */
        if(my.circular)
        {   
            my.imageID = my.imageID + my.imageFocusMax;
        }

        /* Make sure, that the id is smaller than the image count  */
        maxId = (my.circular) ?  (my.max-(my.imageFocusMax))-1 : my.max-1;
        if (my.imageID > maxId)
        {
            my.imageID = maxId;
        }

        /* Toggle glide animation to start ID */
        if(my.glideToStartID === false)
        {
            my.moveTo(-my.imageID * my.xStep);
        }

        /* Animate images moving in from the right */
        if(my.startAnimation)
        {
            my.moveTo(5000);
        }
    }

    /* Only animate if there is more than one image */
    if(my.max > 1)
    {
        my.glideTo(my.imageID);
    }

    /* Display images in current order */
    my.moveTo(my.current);
};


/* Main animation function */
this.moveTo = function(x)
{
    //alert(x)
    this.current = x;
    this.zIndex = my.max;


    /* Main loop */
    for (var index = 0; index < my.max; index++)
    {
        var image = my.imagesDiv.childNodes[my.indexArray[index]];
        var currentImage = index * -my.xStep;

        /* Enabled image scaling */
        if(my.imageScaling)
        {
            /* Don't display images that are not conf_focussed */

            if ((currentImage + my.maxFocus) < my.memTarget || (currentImage - my.maxFocus) > my.memTarget)
            {
                image.style.visibility = 'hidden';
                image.style.display = 'none';
            }
            else
            {
                var z = (Math.sqrt(10000 + x * x) + 100) * my.imagesM;
                //var z = (Math.sqrt(10000) + 500) * my.imagesM;
                var xs = x / z * my.size + my.size;

                /* Still hide images until they are processed, but set display style to block */
                image.style.display = 'block';

                /* Process new image height and width */
                var newImageH = (image.h / image.w * image.pc) / z * my.size;
                var newImageW = 0;
                switch (newImageH > my.maxHeight)
                {
                    case false:
                        newImageW = image.pc / z * my.size;
                        break;

                    default:
                        newImageH = my.maxHeight;
                        newImageW = image.w * newImageH / image.h;
                        break;
                }

                var newImageTop = (my.imagesDivHeight - newImageH) + ((newImageH / (my.reflectionP + 1)) * my.reflectionP);

                /* Set new image properties */
                image.style.left = xs - (image.pc / 2) / z * my.size + 'px';
                if(newImageW && newImageH)
                {
                    image.style.height = newImageH + 'px';
                    image.style.width = newImageW + 'px';
                    image.style.top = newImageTop + 'px';
                    /*
                     newImageTop="100.239";
                     newImageH="250";
                     newImageW="210";
                     image.style.height = newImageH + 'px';
                     image.style.width = newImageW + 'px';
                     image.style.top = newImageTop + 'px'; */
                }
                image.style.visibility = 'visible';

                //console.log("LEFT  == " +image.style.left);
                //console.log("TOP   ==" + newImageTop)


                /* Set image layer through zIndex */
                switch ( x < 0 )
                {
                    case true:
                        this.zIndex++;
                        break;

                    default:
                        this.zIndex = my.zIndex - 1;
                        break;
                }

                /* Change zIndex and onclick function of the focussed image */
                switch ( image.i == my.imageID )
                {
                    case false:
                        image.onclick = function() {  my.glideTo(this.i);};
                        break;

                    default:
                        this.zIndex = my.zIndex + 1;
                        if(image.url !== '')
                        {
                            image.onclick = my.onClick;
                        }
                        break;
                }
                image.style.zIndex = my.zIndex;
            }
        }

        /* Disabled image scaling */
        else
        {
            if ((currentImage + my.maxFocus) < my.memTarget || (currentImage - my.maxFocus) > my.memTarget)
            {
                image.style.visibility = 'hidden';
            }
            else
            {
                image.style.visibility = 'visible';

                /* Change onclick function of the focussed image */
                switch ( image.i == my.imageID )
                {
                    case false:
                        image.onclick = function() { my.glideTo(this.i);};
                        break;

                    default:
                        if(image.url !== '')
                        {
                            image.onclick = my.onClick;
                        }
                        break;
                }
            }   
            my.imagesDiv.style.marginLeft = (x - my.totalImagesWidth) + 'px';
        }

        x += my.xStep;
    }
};
4

1 回答 1

0

如果没有看到您正在生成的代码,很难确切地说出发生了什么,但我猜想在图像周围添加 div 会破坏 ImageFlow 在布置图像时寻找的格式。

你的描述长吗?如果没有,您可以将它们作为 alt 标签添加到图像中,然后在 ImageFlow 选项中启用标题。然后,alt 标签描述将显示为图像上的标题。

于 2013-05-20T10:39:54.253 回答