在 FF 和 IE7/8/9 上工作时,带有淡入淡出的 Javascript slider 在 chrome 上失败

标签 javascript html css google-chrome transparency

我遇到了这个 javascript 代码的问题。它每 6 秒在背景和前景 div 之间淡入淡出,以创建一个 slider 。它在 Firefox 9 和可能在较低版本中完美运行,我已经测试它在 IE7、IE8 和 IE9 中确实有效。

但在 chrome 中它只是先淡化,然后图像保持静止。这是javascript代码:

function start_slider () {
    var imgArr = new Array( // relative paths of images
        '/solteros/img/slider/barrancos.png',
        '/solteros/img/slider/karts.png',
        '/solteros/img/slider/parque.png',
        '/solteros/img/slider/canoaraft.png',
        '/solteros/img/slider/paintball.png',
        '/solteros/img/slider/quads.png',
        '/solteros/img/slider/rafting.png'
    );

    var preloadArr = new Array();
    var i;

    /* preload images */
    for(i=0; i < imgArr.length; i++){
        preloadArr[i] = new Image();
        preloadArr[i].src = imgArr[i];
    }

    var currImg = 0;
    var intID = setInterval(changeImg, 3000);
    var hs = document.getElementById ( 'header_slider' );    
    var hsb = document.getElementById ( 'header_slider_bkg' );
    if ( hs.style.opacity != 1 ) {
         hs.style.opacity = 1; 
    }

    var foInt = null;
    var fiInt = null;
    var imgUrl = "";

    function changeImg () {
        clearInterval ( intID );
        currImg = ( currImg < preloadArr.length-1 ) ? currImg+1 : 0;
        imgUrl = preloadArr[currImg].src;
        hsb.style.background = 'url('+imgUrl+') top center no-repeat';
        foInt = setInterval ( fadeOut, 50 );
    }

    function fadeOut () {
        if ( hs.style.opacity <= 0 ) {
            clearInterval ( foInt );
            hs.style.background = 'url('+imgUrl+') top center no-repeat';
            hs.style.opacity = 1;
            hs.style.filter = 'alpha(opacity=100);'; /* Para IE8 y anteriores */
            intID = setInterval (changeImg, 6000);
        } else {
            hs.style.opacity -= 0.05;
            hs.style.filter = 'alpha(opacity='+(Math.round(hs.style.opacity * 100))+');'; /* Para IE8 y anteriores */
        }
    }
}

现在,涉及的 CSS:

#header_slider_bkg {
    width: 1000px;
    height: 410px;
    min-height: 410px;
    margin: 0;
    padding: 0;
    float: left;
    background: url('/solteros/img/slider/rafting.png');
}

#header_slider {
    width: 1000px;
    height: 410px;
    min-height: 410px;
    margin: 0;
    padding: 0;
    float: left;
    background: url('/solteros/img/slider/rafting.png');
}

因此,HTML:

    <div id="header_slider_bkg">
        <div id="header_slider">
        </div>
    </div>
    <script type="text/javascript">
        start_slider ();
    </script>

问题很明显,为什么这在 Chrome 上失败,而在所有其他主流浏览器上都可以???

TIA

最佳答案

安装 Chrome 开发人员工具并进行一些调试后,我发现这对我来说似乎是 Chrome javascript 引擎上的一个错误。

属性 hs.style.opacity 以 1 开头。第一次出现时:

hs.style.opacity -= 0.05

它的期望值为 0.95。但是第二次它得到 0.899999999999999 而不是预期的 0.90。循环一直持续到它获得 0.4999...9684 的值,然后它似乎拒绝减去 0.05,因此 fadeOut 间隔永远不清楚,因为 hs.style.opacity 永远不会达到 0 或以下的值。

快速修复似乎正在改变:

if ( hs.style.opacity <= 0 )

通过

if ( hs.style.opacity < 0.5 )

但这表明最后一次更改时图像之间的差距更大,因此更好的解决方案可能是在减法后将值四舍五入到小数点后两位,所以我尝试了一种效果很好的新方法:

改变:

hs.style.opacity -= 0.5;

通过:

aux = Math.round(hs.style.opacity * 100);
aux -= 5;
hs.style.opacity = aux / 100;

所以这已经解决了。

关于在 FF 和 IE7/8/9 上工作时,带有淡入淡出的 Javascript slider 在 chrome 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9094571/

相关文章:

javascript - jquery appendTo 元素不遵守 css

javascript - 我如何监控特定 ID 何时出现在带有 javascript 突变的屏幕上?

javascript - 谷歌地图标记不起作用

javascript - 如何包含 gl-matrix?

javascript - Internet Explorer 预加载(500 多张图片)

html - 表 TD 未正确对齐

html - 如何让边框的左右两侧更靠近文字

javascript - Bootstrap 3 弹出窗口显示一个并隐藏其他不起作用

javascript - 如何放大CSS按钮的可点击?

Javascript play() 方法在 Firefox、Safari 或 IE 11 中不起作用