var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {
  $scope.name = 'World';
})
.directive('ellipsisAnimated', function () { 

    return {

        restrict: "EAC",

        template:
            "<span class='ellipsis_animated-inner'>" +
                "<span>.</span>" +
                "<span>.</span>" +
                "<span>.</span>" +
            "</span>",

    };

})

;
<!DOCTYPE html>
<html ng-app="plunker">

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <link data-require="bootstrap-css@*" data-semver="4.0.0-alpha.3" rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.3/css/bootstrap.min.css" />
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css" />
    <script data-require="angular.js@1.5.x" src="https://code.angularjs.org/1.5.8/angular.js" data-semver="1.5.8"></script>
    <script src="app.js"></script>
  </head>

  <body ng-controller="MainCtrl">
    <p>Loading      <ellipsis-animated></ellipsis-animated>
    </p>
  </body>

</html>
/*

Expected usage:

    <span class="ellipsis_animated-inner">
        <span>.</span>
        <span>.</span>
        <span>.</span>
    </span>

*/

body { margin:20px;}

@-webkit-keyframes ellipsis_animated-toggle {
    from {
        opacity: 1;
    }
    to {
        opacity: 0;
    }
}

@-moz-keyframes ellipsis_animated-toggle {
    from {
        opacity: 1;
    }
    to {
        opacity: 0;
    }
}

@-ms-keyframes ellipsis_animated-toggle {
    from {
        opacity: 1;
    }
    to {
        opacity: 0;
    }
}

@-o-keyframes ellipsis_animated-toggle {
    from {
        opacity: 1;
    }
    to {
        opacity: 0;
    }
}

@keyframes ellipsis_animated-toggle {
    from {
        opacity: 1;
    }
    to {
        opacity: 0;
    }
}

.ellipsis_animated-inner span {
    -webkit-animation-name: ellipsis_animated-toggle;
    -moz-animation-name: ellipsis_animated-toggle;
    -ms-animation-name: ellipsis_animated-toggle;
    -o-animation-name: ellipsis_animated-toggle;
    animation-name: ellipsis_animated-toggle;

    -webkit-animation-duration: 1000ms;
    -moz-animation-duration: 1000ms;
    -ms-animation-duration: 1000ms;
    -o-animation-duration: 1000ms;
    animation-duration: 1000ms;

    -webkit-animation-iteration-count: infinite;
    -moz-animation-iteration-count: infinite;
    -ms-animation-iteration-count: infinite;
    -o-animation-iteration-count: infinite;
    animation-iteration-count: infinite;

    -webkit-animation-timing-function: cubic-bezier(.02,.85,.69,1);
    -moz-animation-timing-function: cubic-bezier(.02,.85,.69,1);
    -ms-animation-timing-function: cubic-bezier(.02,.85,.69,1);
    -o-animation-timing-function: cubic-bezier(.02,.85,.69,1);
    animation-timing-function: cubic-bezier(.02,.85,.69,1);
}

.ellipsis_animated-inner span:nth-child(1) {
    -webkit-animation-delay: -1000ms;
    -moz-animation-delay: -1000ms;
    -ms-animation-delay: -1000ms;
    -o-animation-delay: -1000ms;
    animation-delay: -1000ms;
}

.ellipsis_animated-inner span:nth-child(2) {
    -webkit-animation-delay: -900ms;
    -moz-animation-delay: -900ms;
    -ms-animation-delay: -900ms;
    -o-animation-delay: -900ms;
    animation-delay: -900ms;
}

.ellipsis_animated-inner span:nth-child(3) {
    -webkit-animation-delay: -800ms;
    -moz-animation-delay: -800ms;
    -ms-animation-delay: -800ms;
    -o-animation-delay: -800ms;
    animation-delay: -800ms;
}
A very subtle, animated ellipsis taken from https://github.com/bodylabs/ellipsis-animated