首页 > 代码库 > jQuery实现评论弹幕、弹幕漂浮、滚动代码

jQuery实现评论弹幕、弹幕漂浮、滚动代码

1、html代码和jquery代码:

<!DOCTYPE html>
<html>

<head lang="en">
    <meta charset="UTF-8">
    <title>document</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width,height=device-height,inital-scale=1.0,maximum-scale=1.0, minimun-scale=1.0,user-scalable=no;">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="format-detection" content="telephone=no">
    <script type="text/javascript" src="js/auto_rem.js"></script>
    <link rel="stylesheet" href="css/style.css" />
</head>

<body>
    <header class="fixed top-nav">
        <a class="back"></a>
        <span class="title">公屏</span>
        <a class="home"></a>
    </header>
    <div class="gp-body">
        <div class="main-box">
            <ul class="all-list">
            </ul>
        </div>
        <div class="fixed send-ms flex">
            <div class="ipt s_txt flex1" contenteditable="true"></div>
            <span class="btn s_btn">发送</span>
        </div>
    </div>
</body>
<script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
    //发表评论
    $.getJSON(./js/test.json, function(result) {
        actFn($(.all-list), result)
    })

    function actFn(tar, data) {
        var data = data;

        function startTranslate() {  //循环插入每个要被遍历循环的item html 评论
            var key = 0;
            var leng = data.length;
            var time = setInterval(function() {
                if (key >= leng) {
                    clearInterval(time);  //如果data数据没有了就不在插入
                    return;
                };
                var _html = itemHtml(data[key].img_src, data[key].grade, data[key].words)
                key++;
                tar.append(_html);
                init_screen();
            }, 400);
        }
        startTranslate()
        $(".s_btn").click(function() {  //和上面类似,擦别是点击触发插入item html
            var text = $(".s_txt").html();
            if (text == ‘‘) return;
            var _html = itemHtml(./img/heads.png, 最强王者, text)
            tar.prepend(_html);
            $(".s_txt").html(‘‘);
            init_screen();
        });

        function itemHtml(img, grade, words) {  //插入内容的模板,也就是每条评论的模板
            var _html = "<li class=‘item‘>" +
                "<span class=‘img-box‘>" +
                "<img src=http://www.mamicode.com/‘" + img + "‘ alt=‘‘>" +
                "</span>" +
                "<p class=‘para‘>" +
                "<em class=‘grade‘>" + grade + "</em>" +
                "<span class=‘words‘>" + words + "</span>" +
                "</p>" +
                "</li>";
            return _html;
        }

        var initTop = 20;
        var _top = initTop;

        function init_screen() {
            tar.find("li[class!=‘had‘]").show().each(function(item, key) {
                if ($(this).hasClass(had)) return;
                var that = this;
                var twidth = $(this).width();
                var _left = $(window).width() + twidth;
                var rd = Math.random() * 100;
                var rdColor = getRandomColor();
                var _height = $(window).height();
                var time = 20000;
                if (_top > _height - 150) {  //如果快到屏幕底部就重新设置top,这样就从屏幕头部开始动作
                    if (initTop == 20) {
                        _top = initTop = 60;   //至于分成2种情况是为了,第一排和第二排错开,这样可以争取空间,不容易重叠(指的是评论item)
                    } else {
                        _top = initTop = 20;
                    }
                }
                
                $(this).find(.grade).css({
                    color: rdColor
                })
                $(this).css({  //初始化每条评论的位置,也就是看不到的位置,right位置在屏幕看不到的地方
                    top: _top,
                    right: "-" + twidth + "px"   
                });
                $(this).css({  //这里实现的重点方法是translateX,利用css3实现评论的移动,这样可以提高性能,如果用其他方法比如jq的animate方法在pc端没 问题,在移动端就性能不好,会有卡顿的现象
                    transform: "translateX(-" + (_left + rd + 200) + "px)"
                }).addClass(had);
                _top = _top + 80;
            });
        }


        //随机获取颜色值
        function getRandomColor() {
            return # + (function(h) {
                return new Array(7 - h.length).join("0") + h
            })((Math.random() * 0x1000000 << 0).toString(16))
        }
    }
});

//初始化弹幕
</script>

</html>

2、scss代码:

.gp-body {
    @extend .main;
    width: 100%;
    height: 100%;
    .main-box {
        background: url("../img/gp-bg.jpg") no-repeat;
        background-size: 100% 100%;
        height: 100%;
        width: 100%;
        overflow: hidden;
        overflow-y: scroll;
        .all-list {
            position: relative;
        }
        .item {
            display: inline-block;
            position: absolute;
            top: 0;
            right: -100%;
            display: none;
            transition: transform 12s ease-in-out;  //css设置移动的时间及表现
            ;
     
            .para {
                color: white;
                font-size: 14px;
                line-height: 37px;
                display: inline-block;
                overflow: hidden;
                border-radius: 20px;
                background: rgba(0, 0, 0, 0.6);
                padding: 0 10px;
                max-width: 400px;
                white-space: nowrap;
                text-overflow: ellipsis;
                .grade {
                    margin-right: 3px;
                }
            }
            .img-box {
                float: left;
                img {
                    width: 35px;
                    height: 35px;
                    border-radius: 100%;
                    margin-right: 5px;
                }
            }
        }
    }
}

评论弹幕的主要思想是重看不到的屏幕位置移动到屏幕看到的位置,最后消失,所以需要移动,这里采用的是css3 的translate 方法,可以实现目标的移动而在移动端不卡顿。

至于每条屏幕的飘移过程中之间的位置关系需要良好的设置,比如间隔时间插入每条评论,这样就会在垂直位置上错开,还有就是top位置的关系上的调节等,比如奇数排设置top20,偶数排设置60,这样又可以错开水平方面的每条评论的位置。如下的错开:

技术分享

 

 

以下是最终效果图:

技术分享

 

 

以下是demo数据:

[{
    "img_src": "./img/heads.png",
    "grade": "最强王者",
    "words": "灯笼裤飞机失控打笼裤飞机失控打笼裤飞机失控打笼裤飞机失控打笼裤飞机失控打笼裤飞机失控打飞机"
}, {
    "img_src": "./img/heads.png",
    "grade": "最强王者",
    "words": "灯笼裤飞机失控飞机失控飞机失控打飞机"
}, {
    "img_src": "./img/heads.png",
    "grade": "最强王者",
    "words": "灯笼裤飞机失控打飞机"
}, {
    "img_src": "./img/heads.png",
    "grade": "最强王者",
    "words": "灯笼裤飞机失控飞机失控飞机失控打飞机"
}, {
    "img_src": "./img/heads.png",
    "grade": "最强王者",
    "words": "灯笼裤飞机失控飞机失控飞机失控打飞机"
}, {
    "img_src": "./img/heads.png",
    "grade": "荣耀黄金",
    "words": "灯笼裤飞机失控打飞机"
}, {
    "img_src": "./img/heads.png",
    "grade": "最强王者",
    "words": "灯笼裤飞机失控打飞机last"
}]

 

jQuery实现评论弹幕、弹幕漂浮、滚动代码