String de execução AngularJS (alternativa de letreiro)

A tag <marquee> faz uma coisa muito legal de uma maneira muito antiquada e muitos programadores recomendam nem mesmo usá-la. Além disso, ele tem alguns problemas com dispositivos móveis.

Eu estava construindo um site que não usava jQuery, mas usava AngularJS e precisava criar um feed de notícias em execução e os resultados foram excelentes.

Também cuidei da parte de SEO. Para não prejudicar o page rank do Google, os links contêm ‘rel = “nofollow”‘ e para deixar o visitante na minha página, uso ‘target = “_ blank”‘ para que as notícias abram em uma nova janela.

Então aqui está o código …

HTML (dentro do escopo do controlador):

<div id="news_strip" ng-mouseover="conf.news_move_flag=false" ng-mouseout="conf.news_move_flag=true">
<div class="shadow left">&nbsp;</div>
<a ng-repeat="(k, n) in news track by $index" ng-style="{'right': get_news_right($index)}" id="news_{{$index}}" rel="nofollow" target="_blank" href="{{n.link}}">
<span class="date">{{n.pubDate}}</span>
<span class="title">{{n.title}}</span>
</a>
<div class="shadow right">&nbsp;</div>
</div>

CSS:

#news_strip {
width
: 100%;
border
-bottom: 1px dotted #cccccc;
display
: block;
height
: 17px;
position
: relative;
overflow
: hidden;
}

#news_strip a {
display
: inline;
text
-decoration: none;
margin
-right: 20px;
z
-index: 1;
position
: absolute;
top
: 0px;
}

#news_strip a span {
cursor
: pointer;
display
: inline;
color
: #343434;
font
-weight: bold;
padding
-right: 5px;
z
-index: 1;
}

#news_strip a span.date {
display
: inline-block;
font
-weight: normal;
color
: #888888;
}

#news_strip a:hover span.title {
text
-decoration: underline;
}

/* The shadow DIVs of the sides are decorative and optional, but they add a very nice effect :) */

#news_strip div.shadow{
position
: absolute;
top
: 0px;
width
: 30px;
height
: 100%;
z
-index: 5;
background
: #ffffff;
}

#news_strip div.shadow.left{
left
: 0px;
-webkit-box-shadow: 10px 0px 10px #fff;
-moz-box-shadow: 10px 0px 10px #fff;
box
-shadow: 10px 0px 10px #fff;
}

#news_strip div.shadow.right{
right
: 0px;
-webkit-box-shadow: -10px 0px 10px #fff;
-moz-box-shadow: -10px 0px 10px #fff;
box
-shadow: -10px 0px 10px #fff;
}

A parte mais interessante – AngularJS (dentro do escopo do controlador):

$scope.news = [];
$scope
.conf = {
news_length
: false,
news_pos
: 200, // the starting position from the right in the news container
news_margin
: 20,
news_move_flag
: true
};

$scope
.init = function() {
$http
.post('the_news_file.json', null).success(function(data) {
if (data && data.length > 0) {
$scope
.news = data;
$interval
($scope.news_move ,50);
}
});
};

$scope
.get_news_right = function(idx) {
var $right = $scope.conf.news_pos;
for (var ri=0; ri < idx; ri++) {
if (document.getElementById('news_'+ri)) {
$right
+= $scope.conf.news_margin + angular.element(document.getElementById('news_'+ri))[0].offsetWidth;
}
}
return $right+'px';
};

$scope
.news_move = function() {
if ($scope.conf.news_move_flag) {
$scope
.conf.news_pos--;
if ( angular.element(document.getElementById('news_0'))[0].offsetLeft > angular.element(document.getElementById('news_strip'))[0].offsetWidth + $scope.conf.news_margin ) {
var first_new = $scope.news[0];
$scope
.news.push(first_new);
$scope
.news.shift();
$scope
.conf.news_pos += angular.element(document.getElementById('news_0'))[0].offsetWidth + $scope.conf.news_margin;
}
}
};

E é isso 🙂

Você pode encontrá-lo rodando em https://useful.co.il