이번에는 CSS3를 사용하여 연발 효과를 얻는 방법과 연발 효과를 얻기 위해 CSS3를 사용하는 주의 사항에 대해 소개하겠습니다. 다음은 실제 사례입니다.
최근 프로젝트에 대한 Barrage를 구현해야 했기 때문에 인터넷에서 다양한 방법을 상담한 후 최종적으로 Transform+Transition의 효과가 모바일 기기에서 가장 좋은 성능을 발휘한다고 느꼈습니다. iPhone6 및 Redmi 4에서 테스트했습니다. , 지연이 없었습니다. jquery의 애니메이션 애니메이션을 사용하는 모바일 장치에는 명백한 지연이 있습니다.
1. 먼저 포격 지역을 만듭니다
<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;}
참고: 위의 HTML과 CSS는 필요에 따라 조정할 수 있습니다
3.js
$scope.data = {comment:''}; $scope.danmuCount = 5; //最大弹幕行数 $scope.danmus = ['1545466666还是','9777777','哈哈哈哈哈','对企业读完后环球网好齐齐哈','42115我我我5','556噢噢噢噢45','54哦','54545646','666但近段时间66','56565','454465465565', '1545466666还是','9777777','哈哈哈哈哈','对企业读完后环球网好齐齐哈','42115我我我5','556噢噢噢噢45','54哦','54545646','666但近段时间66','56565','454465465565']; //弹幕数据源 //创建弹幕区域 $scope.createDanmuContent = function () { var height = 1 / $scope.danmuCount * 100 + '%'; for (var i = 0; i < $scope.danmuCount; i++) { var item = '<p style="width: 100%; height: '+height+'"></p>'; $('.mask').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='margin: 0;position: absolute;opacity:1;display:table;left: "+_left + 'px'+';color:'+$scope.getRandomColor()+"'>"+$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('p').length == 0 ? true : false; }; //获取随机颜色 $scope.getRandomColor = function () { return '#' + (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({ 'transform':'translateX('+-_moveLeft+'px)', 'transition':'all '+time+'ms'+ ' linear', '-webkit-transform':'translateX('+-_moveLeft+'px)', '-webkit-transition':'all '+time+'ms'+ ' linear', '-moz-transform':'translateX('+-_moveLeft+'px)', '-moz-transition':'all '+time+'ms'+ ' linear', '-ms-transform':'translateX('+-_moveLeft+'px)', '-ms-transition':'all '+time+'ms'+ ' linear' }); //当动画执行完毕后,将弹幕移到原处,更换弹幕文字,重新开始执行动画,相当于对原本弹幕的复用 $timeout(function () { //判断弹幕池是否还有内容,如果没有则移除弹幕 if ($scope.danmus.length > 0) { el.css({ 'transform':'translateX(0px)', 'transition':'all 0ms linear', '-webkit-transform':'translateX(0px)', '-webkit-transition':'all 0ms linear', '-moz-transform':'translateX(0px)', '-moz-transition':'all 0ms linear', '-ms-transform':'translateX(0px)', '-ms-transition':'all 0ms linear' }); $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를 기반으로 사격 라인 수를 생성한 다음 각 라인에 사격을 추가하고 해당 애니메이션을 추가합니다. 애니메이션이 완료되면 포격을 원래 위치로 되돌리고 포격 내용을 교체한 후 애니메이션을 다시 실행하여 포격이 겹치는 것을 방지합니다. 각 사격 애니메이션의 실행 시간은 사격의 길이에 따라 결정됩니다.
이 기사의 사례를 읽은 후 방법을 마스터했다고 생각합니다. 더 흥미로운 정보를 보려면 PHP 중국어 웹사이트의 다른 관련 기사를 주목하세요!
추천 자료:
위 내용은 CSS3를 사용하여 사격 효과 얻기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!