Создание векторных точек мигает с помощью Raphael и Javascript

Я использую библиотеку Raphael JS, и я пытаюсь понять, как сделать точку на экране, а затем исчезнуть.

Я использую цикл for для создания точек, а затем я заставляю их исчезать. Есть ли способ, которым они также могут исчезнуть, и я могу их удалить?

Я очень новичок в Javascript, поэтому не знаю лучшей стратегии для решения этой проблемы. Я не мог понять, как это сделать в документации Рафаэля.

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>blink point</title>        
        <script src="js/raphael.js"></script> 
        <!--<script src="https://github.com/DmitryBaranovskiy/raphael/raw/master/raphael-min.js"></script>-->
        <script type="text/javascript">
        window.onload = function () {

            //Point Array
            pointList = new Array ();

            // Create Canvas
            var r = Raphael(10, 50, 600, 600);            

            // Make a 'group' of points
            for( i=0; i<20; i++){   

                    //Create Point            
                    pointList[i] = r.circle(10*i, 10*i,5);
                    pointList[i].attr({stroke: "none", fill: "#999", opacity: 0});

                    //Fade in   
                    pointList[i].animate({opacity: 1}, 1000 );  

            }

            // Remove points, starting with the first
            for( i=0; i<20; i++){           

                    //Try fading them out
                    //pointList[i].animate({opacity: 0}, 1000 );
            }

        };
        </script>
    </head>

    <body>
        <div id="holder"></div>         
    </body>
</html>

Мне также не удалось получить онлайн-ссылку на библиотеку Raphael для работы, поэтому может потребоваться загрузить библиотеку.

Ответ 1

Здесь вы можете найти рабочий пример http://jsbin.com/uxege4/2/edit
Подробнее:

Проблема с вашей анимацией кода выполняется асинхронно, и это означает, что ваша программа будет закончена до замирания. Поэтому вам нужно настроить функцию обратного вызова, когда анимация будет готова. Вот цитата из документации Рафаэля:

одушевленные

Изменяет атрибут от его текущего значения до его заданного значения в заданное количество миллисекунд.
Параметры изображения

newAttrs object Объект параметров результатов анимации. (Не все атрибуты могут быть анимированными.)
ms number Продолжительность анимации, заданная в миллисекундах.
функция обратного вызова [необязательно]

Последний параметр - это то, что нам нужно. Вам просто нужно назначить функцию для вызова после завершения анимации.

Ответ 2

Я сделал вам это: http://jsbin.com/uxege4/5/edit Вы можете связать все вещи вместе и иметь функцию обратного вызова в .animate(). Вот так:

r.circle(10*i, 10*i, 5).attr({stroke: "none", fill: "#999", opacity: 0}).animate({opacity: 1}, 1000, function(){
                this.animate({opacity: 0}, 1000, function(){
                  this.remove();
                });

          });

Функция обратного вызова вызывается, когда анимация завершена и проходит через объект raphäel.

Ответ 3

Чтобы уточнить -

Рафаэль animate() начнет действовать, как только вы вызовете функцию, и будет продолжаться, пока остальная часть вашего JavaScript будет выполнена.

Я изменил пример кода Eldar, чтобы продемонстрировать это. См.: http://jsbin.com/uxege4/4/edit

Обратите внимание, что желтые круги рисуются в то же время, что и серые, даже если вызов для анимации() их происходит позже в коде.

Нажатие функции обратного вызова после завершения асинхронного пути кода является общим шаблоном в JavaScript, и важно понять его, чтобы быть продуктивным с JS.

В примере Eldar анонимная функция прикрепляется к первому обработчику обратного вызова animate(). По завершении начальной анимации animate() функция вызывается и выполняет затухание.

Я рекомендую Douglas Crockford JavaScript: Хорошие части (что несколько забавно, самая тонкая книга по программированию, которую я когда-либо читал) через JavaScript Koans. Это должно привести вас к правильному пути.

Ответ 4

Я создал бесконечное мигание, если вы выберете через некоторое время... с помощью clousures!

Intro - это некоторый объект raphael, D

Получайте удовольствие от этого!, добрые пожелания Меньше

var createBlink = function(i,that){     
    var fadeIn = function(i){   
        if(i == 100){
            console.log("end fadein");
            return;
        }else{
            console.log("fadein " + i);
            that.animate({ opacity: 0.8 }, 1000, "<" , function(){
                fadeOut(++i) ;
            });
        }
    }
    var fadeOut = function(i){  
        if(i == 100){
            console.log("end fadeout");
            return;
        }else{
            console.log("fadeout " + i);
            that.animate({ opacity: 0.0 }, 1000, "<" , function(){
                fadeIn(++i);
            });
        }
    }
    fadeIn(i);      
}

createBlink(0,intro);