>웹 프론트엔드 >JS 튜토리얼 >Tencent의 Weibo 효과 코드를 JS로 모방한_javascript 기술

Tencent의 Weibo 효과 코드를 JS로 모방한_javascript 기술

WBOY
WBOY원래의
2016-05-16 17:07:14986검색

지난 이틀간 텐센트 웨이보 출시 효과에 대해 연구해보았는데, 그 효과는 다음과 같습니다.

Tencent의 Weibo 효과 코드를 JS로 모방한_javascript 기술

공유하기 전에 제 코딩 습관에 대해 이야기하겠습니다. 많은 분들이 제가 jquery 프레임워크를 사용하는데 왜 Jquery 형식으로 컴포넌트를 작성하지 않느냐고 묻습니다. 당시 내 대답은 이렇습니다. 모든 사람은 코드를 작성할 때 자신만의 습관이 있습니다. 하지만 제가 더 말하고 싶은 것은, 저는 개인적으로 이런 종류의 코딩이 큰 장점이 있다고 생각합니다. 예를 들어 Taobao에서 사용하는 Kissy 프레임워크와 Jquery 프레임워크가 다르기 때문에 저는 Jquery 프레임워크에 크게 의존하지 않습니다. Alipay Baidu에서 사용하는 Alipay 프레임워크는 Baidu 프레임워크를 사용하고, Tencent에는 Tencent의 프론트엔드 js 프레임워크가 있습니다. 제가 작성하는 코드가 jquery에 너무 많이 의존한다면, 다른 사람들이 내 코드를 사용하고 싶어하거나 언젠가 제가 Tencent 프로젝트에 참여하게 된다면 어떻게 될까요? 하지만 그들은 JS 프레임워크를 사용하고 그러한 기능을 가질 수만 있습니까? 그렇다면 jquery의 인코딩 형식에 전적으로 의존한다면 지금 다시 인코딩해야 합니까? 현재 코딩 방법에 따라 코딩하면 대부분 jquery 선택기만 사용하게 됩니다. 그러면 선택기를 변경하기만 하면 다른 코드도 바로 사용할 수 있습니다. 이런 확장성은 매우 좋습니다! 저는 개인적으로 전문 프론트엔드 개발자로서 무언가를 만들기 위해서는 jquery를 조금 알아야 할 뿐만 아니라 고품질의 코드를 작성하는 것도 고려해야 한다고 생각합니다. 어쩌면 jquery로 간단한 코드를 작성하는 것도 좋은 일이 될 수 있지만, 언젠가 특정 기능이 수요에 추가되면 코드를 다시 변경해야 한다는 점을 고려하면? 이전 함수를 기반으로 새 함수를 다시 작성할 수 있나요? 코드를 변경할 필요가 없습니다!

고품질코드란?

개인적으로는 다음 사항이 충족되어야 한다고 생각합니다.

1. 확장성.

2. 유지 관리성.

3. 가독성과 사용 편의성.

4. JS 성능.

가장 중요한 것은 위의 사항을 충족하는 것입니다.

좋아요, 더 이상 말도 안되는 소리는 하지 마세요! 화제를 바꿔서 제가 현재 하고 있는 웨이보 포스팅의 효과는 그냥 간단합니다. 물론 텐센트에는 이모티콘 추가나 기타 기능 추가 등 웨이보 포스팅을 위한 몇 가지 복잡한 기능이 있지만, 아직까지 그렇게 만들어지지는 않았습니다. 순간(작업량이 상대적으로 큼).

아래 작성한 JS 코드는 두 가지 점에 주의해야 합니다.

1. 게시할 때마다 항목이 목록에 추가될 것이라고 모두가 말합니다. 현재 Ajax 요청이 전송되지 않았고 백그라운드에 기록이 없으므로 페이지를 새로 고치면 삭제됩니다.

2. 시간은 클라이언트 시간을 기준으로 합니다. 클라이언트 시간이 틀리면 시간도 영향을 받습니다.

사실 위의 효과를 보시면 이해가 매우 간단하므로 여기서는 자세히 설명하지 않겠습니다! 아니면 아래에 압축된 데모를 제공하겠습니다. 직접 다운로드하여 효과를 확인해 보세요. 게시할 때마다 콜백이 확장으로 제공됩니다! 물론 항목으로 마우스를 이동하면 삭제버튼이 나타나며, 항목을 마음대로 삭제할 수 있습니다. 코드만 게시하시면 더 이상 할 말이 없습니다!

HTML 코드는 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.


       

           

来 , 说说你在做什么 , 想什么


            < ;div>
               
              


                  
                   
                 
                  
                 
                  
                  
                 
              


          

           

              
           ;
            < ;div class="tr">
               


                  还能输入140个字
                  
               
           


       
       

          

大家说
           

           

       
       

    CSS代码如下:

    复主代码 代码如下:

    body,div,h2,h3,ul,li,p{margin:0;padding:0;}
        a{text-장식:none;}
        a:hover{text- 장식:밑줄;}
        ul{목록 스타일 유형:없음;}
        본문{색상:#333;배경:#3c3a3b;글꼴:12px/1.5 5b8b4f53;}
        #msgBox{너비: 500px;배경:#fff;border-radius:5px;margin:10px auto;padding-top:10px;}
        #msgBox 양식 h2{font-weight:400;font:400 18px/1.5 5fae8f6f96c59ed1;}
        #msgBox 양식{배경:url(img/boxBG.jpg) 반복-x 0 하단;패딩:0 20px 15px;}
        #userName,#conBox{color:#777;border:1px solid #d0d0d0;border -radius:6px;배경:#fff url(img/inputBG.png) 반복-x;padding:3px 5px;font:14px/1.5 arial;}
        #userName.active,#conBox.active{border:1px solid #7abb2c;}
        #userName{height:20px;}
        #conBox{width:448px;resize:none;height:65px;overflow:auto;}
        #msgBox 양식 div{위치:상대적 ;color:#999;margin-top:10px;}
        #msgBox img{border-radius:3px;}
        #face{position:absolute;top:0;left:172px;}
        # 얼굴 img{float:left;display:inline;width:30px;height:30px;cursor:pointer;margin-right:6px;opacity:0.5;filter:alpha(opacity=50);}
        #face img. hover,#face img.current{width:28px;height:28px;border:1px solid #f60;opacity:1;filter:alpha(opacity=100);}
        #sendBtn{border:0;width:112px ;height:30px;cursor:pointer;margin-left:10px;Background:url(img/btn.png) no-repeat;}
        #sendBtn.hover{Background-position:0 -30px;}
    #msgBox 형식 .maxNum{글꼴:26px/30px Georgia, Tahoma, Arial;padding:0 5px;}
        #msgBox .list{padding:10px;}
        #msgBox .list h3{위치:상대적;높이 :33px;font-size:14px;font-weight:400;배경:#e3eaec;border:1px solid #dee4e7;}
        #msgBox .list h3 범위{position:absolute;left:6px;top:6px; 배경:#fff;라인 높이:28px;디스플레이:인라인 블록;패딩:0 15px;}
        #msgBox .list ul{overflow:hidden;zoom:1;}
        #msgBox .list ul li {float:left;clear:both;width:100%;border-bottom:1px dashed #d8d8d8;padding:10px 0;ground:#fff;overflow:hidden;}
        #msgBox .list ul li.hover{ 배경:#f5f5f5;}
        #msgBox .list .userPic{float:left;width:50px;height:50px;display:inline;margin-left:10px;border:1px solid #ccc;border-radius:3px ;}
        #msgBox .list .content{float:left;width:400px;font-size:14px;margin-left:10px;font-family:arial;word-wrap:break-word;}
    #msgBox .list .userName{display:inline;padding-right:5px;}
        #msgBox .list .userName a{color:#2b4a78;}
        #msgBox .list .msgInfo{display:inline;word -wrap:break-word;}
        #msgBox .list .times{color:#889db6;font:12px/18px arial;margin-top:5px;overflow:hidden;zoom:1;}
        #msgBox .list .times 범위{float:left;}
        #msgBox .list .times a{float:right;color:#889db6;}
        .tr{overflow:hidden;zoom:1;}
    .tr p{float:right;line-height:30px;}
        .tr *{float:left;}
        .hidden {display:none;}

    JS代码如下:

    复主代码 代码如下:

    /**
     * 仿腾讯发表微博的效果
     * 1.目前没有发ajax请求 后台没有记录 所以刷新页面 会清掉
     * 2. 时间是用的是客户端时间 假如客户端时间错误的话 那么时间也会受影响。
     * 目前就这样交互 具体的思路不太复杂 如果项目中用到这样的 可以根据具体的需求更改
     * @constructor Microblog
     * @date 2013-12-23
     * @author tugenhua
     * @email 879083421@qq.com
     */

     function Microblog(options) {

        this.config = {
            maxNum                        :   140,               // 最大的字符数
            targetElem                    :   '.f-text',         // 输入框 或者文本域的class名
            maxNumElem                    :   '.maxNum',         // 还能输入多少字容器
            sendBtn                       :   '#sendBtn',        // 广播按钮
            face                          :   '#face',           // 表情容器
            activeCls                     :   'active',          // 鼠标点击输入框add类
            currentCls                    :   'current',         // 鼠标点击face头像时 增加的类名
            inputID                       :   '#userName',       // 输入框ID
            textareaId                    :   '#conBox',         // 文本域ID
            list                          :   '#list-msg',       // 大家在说的容器
            callback                      :   null               // 动态广播完后的回调函数
        };

        this.cache = {};
        this.init(options);
     }

     Microblog.prototype = {

        constructor: Microblog,

        init: function(options) {
            this.config = $.extend(this.config,options || {});
            var self = this,
                _config = self.config,
                _cache = self.cache;

            // 点击输入框input 文本域 textarea 边框的变化
            $(_config.targetElem).each(function(index,item){

                $(item).unbind('focus');
                $(item).bind('focus',function(e){
                    !$(this).hasClass(_config.activeCls) && $(this).addClass(_config.activeCls);
                });
                $(item).unbind('blur');
                $(item).bind('blur',function(e){
                    $(this).hasClass(_config.activeCls) && $(this).removeClass(_config.activeCls);
                });
            });

            // 点击face头像 add(增加)类名
            var faceImg = $('img',$(_config.face));
            $(faceImg).each(function(index,item){
                $(item).unbind('click');
                $(item).bind('click',function(e){
                    $(this).addClass(_config.currentCls).siblings().removeClass(_config.currentCls);
                });
            });

    // 버튼 호버 이벤트 브로드캐스트
    $(_config.sendBtn).hover(function(){
    !$(this).hasClass('hover') && $(this).addClass('hover ');
    },function(){
    } $(this).hasClass('hover') && $(this).removeClass('hover');
    })

    // 바인딩 이벤트
                                                                                                    > var totalCount = 0;
    for (var i=0; i var c = str.charCodeAt(i);
        if ((c >= 0x0001 && c <= 0x007e) || (0xff60<=c && c<=0xff9f) ) {
         totalCount ;
                                                                                                       /*
    * 모든 바인딩 이벤트
    */
    _bindEnv: function() {
    var self = this,
    _config = self.config,
    _cache = self.cache;

    // 텍스트 필드 키업 이벤트
    self ._keyUp();

                                                 > this,
    _config = self.config,
    _cache = self.cache;
    $(_config.textareaId).unbind( 'keyup') ;
    $(_config.textareaId).bind(' keyup',function(){
    var len = self._countCharacters($(this).val()),
    html;
    if (_config.maxNum * 1 >= len * 1) {
                                                                                              * 1; ~      },
         /*
          * 点击广播按钮事件
          */
         _clickBtn: function() {

            var self = this,
                _config = self.config,
                _cache = self.cache;
            var reg = /^\s*$/g;
            $(_config.sendBtn).unbind('click');
            $(_config.sendBtn).bind('click',function(){

                var inputVal = $(_config.inputID).val(),
                    textVal = $(_config.textareaId).val(),
                    maxNum = $(_config.maxNumElem).attr('data-html');
                if(reg.test(inputVal)) {
                    alert('请输入你的姓名');
                    return;
                }else if(reg.test(textVal)) {
                    alert("随便说点什么吧!");
                    return;
                }
                if(maxNum * 1 < 0) {
    alert('字符超过限制 请缩减字');
    return;
    }
    // 本来是要发ajax请求的 但是这边没有后台处理 所以目前只是客户端渲染页面
    self._renderHTML(inputVal,textVal);
    });
    },
    /*
    * 把html结构渲染出来
    */
    _renderHTML: function(inputVal,textVal) {
    var self = this,
    _config = self.config,
    _cache = self.cache;
    var oLi = document.createElement("li"),
    oDate = new Date();
    oLi.innerHTML = '

    ' +
                               ''+
                            '
    ' +
                            '
    ' +
                                '' +
                                '
    '+textVal+'
    ' +
                                '
    '+
                                    ''+self._format(oDate.getMonth() + 1) + "\u6708" + self._format(oDate.getDate()) + "\u65e5 " + self._format(oDate.getHours()) + ":" + self._format(oDate.getMinutes())+''+
                                    ''+
                                '
    ' +
                            '
    ';
            // 插入元素
            if($(_config.list + " li").length > 0) {

                $(oLi).insertBefore($(_config.list + " li")[0]);
                self._animate(oLi);
            }else {

                $(_config.list).append(oLi);
                self._animate(oLi);

            }
            _config.callback && $.isFunction(_config.callback) && _config.callback();

            // 清空输入框 文本域的值
            self._clearVal();

            // hover事件
            self._hover();
         },
         /*
          * 格式化时间, 如果为一位数时补0
          */
        _format: function(str){
            return str.toString().replace(/^(\d)$/,"0$1");
        },
        /*
         * 获取ing src
         * @return src
         */
        _getSrc: function() {
            var self = this,
                _config = self.config,
                _cache = self.cache;
            var faceImg = $('img',$(_config.face));

            for(var i = 0; i < faceImg.length; i++) {
    if($(faceImg[i]).hasClass(_config.currentCls)) {
    return $(faceImg[i]).attr('src');
    break;
    }
    }
    },
    /*
    * 清空值
    */
    _clearVal: function() {
    var self = this,
    _config = self.config,
    _cache = self.cache;

    $(_config.inputID) && $(_config.inputID).val('');
    $(_config.textareaId) && $(_config.textareaId).val('');

    },
    /*
    * hover事件
    */
    _hover: function() {
    var self = this,
    _config = self.config,
    _cache = self.cache;
    $(_config.list + ' li').hover(function(){
    !$(this).hasClass('hover') && $(this).addClass('hover').siblings().removeClass('hover');
    $('.del',$(this)).hasClass('hidden') && $('.del',$(this)).removeClass('hidden');
    var $that = $(this);

                // 删除事件
                $('.del',$that).unbind('click');
                $('.del',$that).bind('click',function( ){

                    $($that).animate({
                      '불투명도' : 0
                  },500,function(){
                        $that.remove();   
                   } );
                });
            },function(){
               $(this).hasClass('hover') && $(this).removeClass('hover');
                !$( '.del',$(this)).hasClass('hidden') && $('.del',$(this)).addClass('hidden');
            });

    },
        /*
         * 높이
         */
         _animate: function(oLi) {
            var self = this;
            var iHeight = $(oLi).height(),
                알파 = 0,
                타이머,
                count = 0;
            $(oLi).css({"불투명도" : "0", "높이" : "0"});

            타이머 && clearInterval(timer);
            타이머 = setInterval(function (){
                $(oLi).css({"display" : "block", "opacity" : "0", "height " : (count = 8) "px"});
                if (count > iHeight){
                     clearInterval(timer);
                      $(oLi).css({ "height" : iHeight "px "});
                       타이머 = setInterval(function (){
                         $(oLi).css({"불투명도" : 알파 = 10});

                           알파 > 100 && (clearInterval(timer), $(oLi).css({"opacity":100}));

                       },30);
                    }
               },30);
         }
     };

     // 初始化代码
     $(function(){
        new Microblog({});
     });

    源码下载:http://xiazai.jb51.net//201312/yuanma/wb(jb51.net).rar

    성명:
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
    이전 기사:Javascript: 입력(예제 설명)_javascript 기술에 대한 readOnly 속성을 설정합니다.다음 기사:Javascript: 입력(예제 설명)_javascript 기술에 대한 readOnly 속성을 설정합니다.

    관련 기사

    더보기