GreenSock TimelineMax для элементов пути, не работающих в Safari и Firefox

Я пытаюсь анимировать несколько элементов пути, которые я создаю и добавляю в JavaScript/jQuery. Затем я использую временную шкалу, чтобы анимировать эти элементы один за другим (с разными значениями, поэтому я не могу использовать пошаговый режим). В конце я не хочу играть полную шкалу времени, а только процент от нее.

Это прекрасно работает в Chrome, но не в Safari и Firefox, и я не могу понять, почему.

Вот CodePen: http://codepen.io/elisabeth_hamel/pen/kXqOmw

РЕДАКТИРОВАТЬ: CodePen был обновлен и теперь работает.

И вот код:

HTML

<svg xmlns='http://www.w3.org/2000/svg' width='20' height='10' viewBox='0 0 2 1' preserveAspectRatio='xMinYMid meet'></svg>

CSS

svg{
    width: 100%;
    position: absolute;
    top: 0;
    bottom: 0;
    left: 60px;
    margin: auto;
    overflow: visible;
    z-index: 1;
    .up{
        -webkit-transform: translate3d(0, 40px, 0);
        transform: translate3d(0, 40px, 0);
    }
    .down{
        -webkit-transform: translate3d(0, 40px, 0);
        transform: translate3d(0, -40px, 0);
    }
}

JS

$(function(){
    var trianglesTimeline = new TimelineMax({paused: true, smoothChildTiming: true});

    function setAnimations(){
        var nbTriangles, i = 0, svg = '', random = 1, thisPath;

        nbTriangles = ($(window).width() - 60)/9 | 0;
        for(i; i<nbTriangles; i++){
            random = (Math.random()*(2.5-0.5) + 0.5).toFixed(1);
            if(i%2 === 0){
                svg += "<path fill='#000' d='M0 0H2 L1 1Z' class='down' data-op='"+random+"' data-x='"+i+"' style='opacity:0'/>";
            }else{
                svg += "<path fill='#000' d='M0 1H2 L1 0Z' class='up' data-op='"+random+"' data-x='"+i+"' style='opacity:0'/>";
            }
        }
        $('svg').html(svg);

        i = 0;
        for(i; i<nbTriangles; i++){
            thisPath = $('path').eq(i);
            TweenMax.set(thisPath, {x: thisPath.data('x')}, 0);
            trianglesTimeline.to(thisPath, 0.3, {opacity: thisPath.data('op'), y: '0px', delay: 0.04*i}, 0);
        }
        trianglesTimeline.tweenTo( trianglesTimeline.duration() * 0.1 );
    }

    setAnimations();
});

Любая помощь будет оценена!

1 ответ

Решение

Итак, получается, что правило преобразования правила CSS переопределяет преобразование, установленное TweenMax для элементов пути. Я не имею понятия почему!

Поэтому я заменил классы встроенными преобразованиями. Вот новый рабочий код, если кому-то интересно:

CSS

svg{
    width: 100%;
    position: absolute;
    top: 0;
    bottom: 0;
    left: 60px;
    margin: auto;
    overflow: visible;
    z-index: 1;
}

JS

$(function(){

    var trianglesTimeline = new TimelineMax({paused: true, smoothChildTiming: true});

    function setAnimations(){
        var nbTriangles, i = 0, svg = '', random = 1, thisPath;

        nbTriangles = ($(window).width() - 60)/9 | 0;
        for(i; i<nbTriangles; i++){
            random = (Math.random()*(2.5-0.5) + 0.5).toFixed(1);
            if(i%2 === 0){
                svg += "<path fill='#000' d='M0 0H2 L1 1Z' transform='translate("+i+", 40)' data-op='"+random+"' style='opacity:0'/>";
            }else{
                svg += "<path fill='#000' d='M0 1H2 L1 0Z' transform='translate("+i+", -40)' data-op='"+random+"' style='opacity:0'/>";
            }
        }
        $('svg').html(svg);

        i = 0;
        for(i; i<nbTriangles; i++){
            thisPath = $('path').eq(i);
            trianglesTimeline.to(thisPath, 0.3, {opacity: thisPath.data('op'), y: '0px', delay: 0.04*i}, 0);
        }
        trianglesTimeline.tweenTo( trianglesTimeline.duration() * 0.1 );
    }

    setAnimations();
 });

РЕДАКТИРОВАТЬ

Чтобы он работал в IE, я сделал несколько других модификаций:

$(function(){
    function makeSVG(tag, attrs){
        var el = document.createElementNS('http://www.w3.org/2000/svg', tag), k;
        for(k in attrs){
            el.setAttribute(k, attrs[k]);
        }
        return el;
    }

    var trianglesTimeline = new TimelineMax({paused: true, smoothChildTiming: true});

    function setAnimations(){
        var nbTriangles, i = 0, svg = '', random = 1, thisPath, y, d;

        nbTriangles = ($(window).width() - 60)/9 | 0;
        for(i; i<nbTriangles; i++){
            random = (Math.random()*(2.5-0.5) + 0.5).toFixed(1);
            if(i%2 === 0){
                y = 40;
                d = 'M0 0H2 L1 1Z';
            }else{
                y = -40;
                d = 'M0 1H2 L1 0Z';
            }
            svg = makeSVG('path', {fill: '#000', d: d, transform:'translate('+i+', '+y+')', 'data-op': random, style: 'opacity:0'});
            $('svg').append(svg);
        }

        i = 0;
        for(i; i<nbTriangles; i++){
            thisPath = $('path').eq(i);
            trianglesTimeline.to(thisPath, 0.3, {opacity: thisPath.data('op'), y: '0px', delay: 0.04*i}, 0);
        }
        trianglesTimeline.tweenTo( trianglesTimeline.duration() * 0.1 );
    }

    setAnimations();
});    
Другие вопросы по тегам