弾幕の CSS3 実装の詳細な例

小云云
リリース: 2018-05-15 14:21:04
オリジナル
2808 人が閲覧しました

このプロジェクトでは弾幕を実装する必要があります。インターネットでさまざまな方法を調べましたが、最終的には、iPhone6 と Redmi 4 でテストしたところ、変換 + トランジションによって得られる効果が最高であると感じました。見られた。 jquery のアニメーション アニメーションを使用するモバイル デバイスでは明らかな遅延が発生します。この記事ではCSS3で弾幕を実装するためのサンプルコードを中心に紹介しますが、編集者が非常に良いと思ったので参考として共有させていただきます。編集者をフォローして見てみましょう。皆さんのお役に立てれば幸いです。

1.まず弾幕エリアを作成します

1

2

3

4

5

6

7

8

<p class="barrage">

<p class="mask">

<!--//弹幕内容-->

</p>

</p>

 

<input type="text" ng-model="data.comment"/>

<button ng-click="addDanmu()">说两句</button >

ログイン後にコピー

2.css

1

2

3

4

.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;}

ログイン後にコピー

注: 上記のHTMLとCSSは必要に応じてカスタマイズできます

3.js

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

$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();

ログイン後にコピー

ポイント、機能は基本的に実装されています。弾幕を閉じるには、弾幕エリアを削除するだけで済みますが、記事には記載されていません。

ロジック: まず $scope.danmuCount に基づいて弾幕の行数を作成し、次に各行に弾幕を追加し、対応するアニメーションを追加します。アニメーションが終了したら、弾幕を元の位置に戻し、弾幕の内容を変更してアニメーションを再実行することで、弾幕の重なりを回避できます。各弾幕アニメーションの実行時間は、弾幕の長さによって決まります。

個人的な経験ですが、皆さんが欠点を指摘できることを願っています。上記のコードは angularjs を使用していますが、ロジックは同じです

関連する推奨事項:

HTML5 テキスト弾幕エフェクト

WeChat ミニプログラム弾幕のコード実装

html5 ゲーム開発 - 弾幕 + サンダーミニゲームの模倣デモ

以上が弾幕の CSS3 実装の詳細な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
関連するチュートリアル
人気のおすすめ
最新のコース
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート