Heim  >  Artikel  >  Web-Frontend  >  Detaillierte Beispiele der CSS3-Implementierung von Barrage

Detaillierte Beispiele der CSS3-Implementierung von Barrage

小云云
小云云Original
2018-05-15 14:21:042632Durchsuche

Das Projekt muss Barrage implementieren. Ich habe online verschiedene Methoden konsultiert und bin schließlich zu dem Schluss gekommen, dass der durch Transform+Transition erzielte Effekt die beste Leistung auf Mobilgeräten aufweist. Beim Testen auf iPhone 6 und Redmi 4 wurde keine Verzögerung festgestellt. Auf Mobilgeräten, die die animierte Animation von jquery verwenden, kommt es offensichtlich zu Verzögerungen. In diesem Artikel wird hauptsächlich der Beispielcode für die Implementierung von Barrage in CSS3 vorgestellt. Der Herausgeber findet ihn recht gut, daher werde ich ihn jetzt mit Ihnen teilen und als Referenz verwenden. Folgen wir dem Herausgeber und schauen wir uns das an. Ich hoffe, es kann allen helfen.

1. Erstellen Sie zunächst den Sperrbereich

<p class="barrage">
<p class="mask">
<!--//弹幕内容-->
</p>
</p>

<input type="text" ng-model="data.comment"/>
<button ng-click="addDanmu()">说两句</button >

2.css

.webPage .barrage{width:100%;height:22%;position: absolute; bottom: 50px; 
background-color: transparent;pointer-events: none;
}
.webPage .barrage .mask{width:100%;height:100%;background:transparent;z-index:100;}

Hinweis : Das obige HTML und CSS kann an Ihre eigenen Bedürfnisse angepasst werden

3.js

$scope.data = {comment:&#39;&#39;};
$scope.danmuCount = 5; //最大弹幕行数
$scope.danmus = [&#39;1545466666还是&#39;,&#39;9777777&#39;,&#39;哈哈哈哈哈&#39;,&#39;对企业读完后环球网好齐齐哈&#39;,&#39;42115我我我5&#39;,&#39;556噢噢噢噢45&#39;,&#39;54哦&#39;,&#39;54545646&#39;,&#39;666但近段时间66&#39;,&#39;56565&#39;,&#39;454465465565&#39;, &#39;1545466666还是&#39;,&#39;9777777&#39;,&#39;哈哈哈哈哈&#39;,&#39;对企业读完后环球网好齐齐哈&#39;,&#39;42115我我我5&#39;,&#39;556噢噢噢噢45&#39;,&#39;54哦&#39;,&#39;54545646&#39;,&#39;666但近段时间66&#39;,&#39;56565&#39;,&#39;454465465565&#39;]; //弹幕数据源

//创建弹幕区域
$scope.createDanmuContent = function () {
var height = 1 / $scope.danmuCount * 100 + &#39;%&#39;;
for (var i = 0; i < $scope.danmuCount; i++) {
var item = &#39;<p style="width: 100%; height: &#39;+height+&#39;"></p>&#39;;
$(&#39;.mask&#39;).append(item);
}
 $scope.createDanmu ();
};

//开始弹幕绘制
$scope.createDanmu = function () {
var maxCount = 0;
if ($scope.danmus.length > $scope.danmuCount) {
 maxCount = $scope.danmuCount;
 } else {
maxCount = $scope.danmus.length;
}
var _left = window.screen.width;
for (var i = 0; i < maxCount; i++) {
var _lable = $("<p style=&#39;margin: 0;position: absolute;opacity:1;display:table;left: "+_left + &#39;px&#39;+&#39;;color:&#39;+$scope.getRandomColor()+"&#39;>"+$scope.danmus[i]+"</p>");
$(".mask p").each(function () {
//检测该区域是否绘制了弹幕
if ($scope.checkDanmu($(this))) {
$(this).append(_lable);
$scope.moveArray(i);
 i--;
return false;
}
});
}
$scope.init_barrage();
};

//将数组第一位放到最后一位,(因弹幕池内容太少,所以没删除已显示的弹幕)
$scope.moveArray = function (i) {
 var temp = $scope.danmus[i];
$scope.danmus.splice(i,1);
$scope.danmus.push(temp);
}
//判断content区域有没有弹幕
$scope.checkDanmu = function (el) {
return el.find(&#39;p&#39;).length == 0 ? true : false;
};
//获取随机颜色
$scope.getRandomColor = function () {
return &#39;#&#39; + (function(h){
return new Array(7 - h.length).join("0") + h
})((Math.random() * 0x1000000 << 0).toString(16))
};

//初始化弹幕参数
$scope.init_barrage = function () {
$(".mask p p").show().each(function() {
 var _moveLeft = window.screen.width+$(this).width();
var time = 100000 / $(this).width() + 5000;//弹幕滑动时间
$scope.addCssAnimate($(this),_moveLeft,time);
});
};

//添加弹幕动画
$scope.addCssAnimate = function (el,_moveLeft,time) {
el.css({
&#39;transform&#39;:&#39;translateX(&#39;+-_moveLeft+&#39;px)&#39;,
&#39;transition&#39;:&#39;all &#39;+time+&#39;ms&#39;+ &#39; linear&#39;,
&#39;-webkit-transform&#39;:&#39;translateX(&#39;+-_moveLeft+&#39;px)&#39;,
&#39;-webkit-transition&#39;:&#39;all &#39;+time+&#39;ms&#39;+ &#39; linear&#39;,
&#39;-moz-transform&#39;:&#39;translateX(&#39;+-_moveLeft+&#39;px)&#39;,
&#39;-moz-transition&#39;:&#39;all &#39;+time+&#39;ms&#39;+ &#39; linear&#39;,
&#39;-ms-transform&#39;:&#39;translateX(&#39;+-_moveLeft+&#39;px)&#39;,
&#39;-ms-transition&#39;:&#39;all &#39;+time+&#39;ms&#39;+ &#39; linear&#39;
});
//当动画执行完毕后,将弹幕移到原处,更换弹幕文字,重新开始执行动画,相当于对原本弹幕的复用
$timeout(function () {
//判断弹幕池是否还有内容,如果没有则移除弹幕
if ($scope.danmus.length > 0) {
el.css({
&#39;transform&#39;:&#39;translateX(0px)&#39;,
&#39;transition&#39;:&#39;all 0ms linear&#39;,
&#39;-webkit-transform&#39;:&#39;translateX(0px)&#39;,
&#39;-webkit-transition&#39;:&#39;all 0ms linear&#39;,
&#39;-moz-transform&#39;:&#39;translateX(0px)&#39;,
&#39;-moz-transition&#39;:&#39;all 0ms linear&#39;,
&#39;-ms-transform&#39;:&#39;translateX(0px)&#39;,
&#39;-ms-transition&#39;:&#39;all 0ms linear&#39;
});
$scope.resetAnimate(el);
} else {
el.remove();
}
},time);
};

//更换弹幕内容,重新开始弹幕动画
$scope.resetAnimate = function (el) {
el.html($scope.danmus[0]);
$scope.moveArray(0);
var _moveLeft = el.width() + screen.width;
var time = 100000 / el.width() + 5000;
$scope.addCssAnimate(el,_moveLeft,time);
};

//评论,添加弹幕
$scope.addDanmu = function () {
var text = $scope.data.comment;
if(text == ""){
return;
}
$scope.danmus.unshift(text);
};

$scope.createDanmuContent();

An diesem Punkt ist die Funktion grundsätzlich implementiert. Um die Sperre zu schließen, müssen Sie lediglich den Sperrbereich entfernen, der im Artikel nicht erwähnt wird.

Logik: Erstellen Sie zunächst die Anzahl der Sperrlinien basierend auf $scope.danmuCount, fügen Sie dann Sperren zu jeder Zeile hinzu und fügen Sie entsprechende Animationen hinzu. Wenn eine Animation abgeschlossen ist, bewegen Sie das Sperrfeuer zurück in seine ursprüngliche Position, ändern Sie den Inhalt des Sperrfeuers und führen Sie die Animation erneut aus, um so eine Überlappung des Sperrfeuers zu vermeiden. Die Ausführungszeit jeder Sperrfeueranimation wird durch die Länge des Sperrfeuers bestimmt.

Persönliche Erfahrung, ich hoffe, jeder kann auf die Mängel hinweisen. Der obige Code verwendet AngularJS, aber die Logik ist dieselbe

Verwandte Empfehlungen:

HTML5-Textsperreffekt

WeChat Code-Implementierung des Miniprogramms Barrage

HTML5-Spieleentwicklung – Barrage + Imitation Lightning Minispiel-Demo

Das obige ist der detaillierte Inhalt vonDetaillierte Beispiele der CSS3-Implementierung von Barrage. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn