首頁 >web前端 >js教程 >JS 仿騰訊發表微博的效果程式碼_javascript技巧

JS 仿騰訊發表微博的效果程式碼_javascript技巧

WBOY
WBOY原創
2016-05-16 17:07:14986瀏覽

最近2天研究了下 騰訊發表微博的效果 特此來分享下,效果如下:

JS 仿騰訊發表微博的效果程式碼_javascript技巧

 

在此分享前 來談談本人寫程式的習慣,很多人會問我既然用的是jquery框架 為什麼寫的元件不用Jquery那種形式?我當時回答的是:每個人寫程式都有每個人的習慣。但我更想表達的是:這種編碼個人覺得有一個很大的優點,我不是非常依賴Jquery框架,因為不同的公司有不同的框架比如在淘寶用的kissy框架在支付寶用的是支付寶框架在百度用的是百度框架在騰訊有騰訊的前端js框架假如我的編寫代碼太依賴於jquery 那假如其他人想要用我代碼或者我自己某一天去做騰訊項目了但是他們那邊要求我們只能用他們的JS框架且又有這樣的功能?那如果我完全依賴jquery那種形式編碼 那現在我是不是要重新編碼呢?如果按照現在編碼方式去編碼 最多只是用了下jquery選擇器而已 那麼只要改下選擇器 其他的代碼都可以直接拿來用,這樣的擴張性非常好!我個人覺得作為一個專業的前端開發,不僅僅只會一點點jquery做做東西,而更應該考慮編寫高質量的代碼,可能用jquery寫寫簡單的代碼同樣能做好某個東西,但是有沒有考慮到假如某一天需求增加了某某功能你是不是又要改程式碼?能不能在以前的基礎上重寫新的功能?而無需改程式碼!

何謂高品質的程式碼?

個人覺得必須滿足以下幾點:

   1. 可擴充性。

   2. 可維護性。

   3. 可讀性,使用性。

   4. JS性能。

 最主要滿足以上幾點。

 好了 廢話不多說了!轉主題,目前我做的這個發表微博效果 只是簡單的 當然騰訊發表微博有一些複雜的功能 比如說下面有添加表情等等功能,目前沒有做成那樣的(工作量比較大)。

 下面我寫的這個JS程式碼要注意2點:

 1.每次發表下後 大家在說列表會加一條,目前沒有發ajax請求 後台沒有記錄 所以刷新頁面 會清掉。

 2. 時間是用的是客戶端時間 假如客戶端時間錯誤的話 那麼時間也會受影響。

其實思路很簡單 看上面的效果就明白 所以思路在這邊不多說了!或者我下面會提供壓縮demo 可以自己下載下來看看效果就ok了!每次發表一次後 都提供了回呼 作為擴充吧!當然滑鼠移到某一項時候 會出現刪除按鈕 同時可以任意刪除某一項。直接貼程式碼吧 也沒有什麼好說的!

HTML程式碼如下:

複製程式碼 程式碼如下:


       

           
               


                    JS 仿騰訊發表微博的效果程式碼_javascript技巧
   🎜>                    JS 仿騰訊發表微博的效果程式碼_javascript技巧
                    JS 仿騰訊發表微博的效果程式碼_javascript技巧
 />
                   JS 仿騰訊發表微博的效果程式碼_javascript技巧
           


          🎜>                   也輸入140
                   鍵Ctrl Enter" //>
                p>
            

           

我們在說的


           

           
    CSS程式碼如下:





    複製程式碼


    程式碼如下:

    body,div,h2,h3,ul,li,p{margin:0;padding:0;}
        a{text-decoration:none;}
        a:hover{text-decoration:none;}
        a:hover{text-裝飾:底線;}
        ul{list-style-type:none;}
        body{顏色:#333;背景:#3c3a3b;字體:12px/1.5 5b8b4f53;}    #msgBox 形式h2{font-weight:400;font:400 18px/1.5 558f8 >    #msgBox 表單{背景:url(img/boxBG.jpg) 重複-x 0 底部;填色:0 20px 15px;}
        #userName,#conBox{顏色:#777;邊框:1px 實心邊框#d0d00d -半徑:6px;背景:#fff url(img/inputBG.png) 重複-x;填入:3px 5px;字型:14px/1.5 arial;}
        #userName.active,#conBox.active{border:1px solid #7abb2c;}
        #userName{height:20px;}
        #conBox{width:448px;resize:none;height:65px;overflow:auto;]div ;顏色:#999;margin-top:10px;}
        #msgBox img{border-radius:3px;}
        #face{position:absolute;top:0;left:172px;}    #face img。懸停,#face img.current{寬度:28px;高度:28px;邊框:1px 實心#f60;opacity:1;filter:alpha(opacity=100);}
        #sendBtn{border:0;寬度:寬度:0; 112px ;高度:30px;遊標:指針;左邊距:10px;背景:url(img/btn.png) 無重複;}
        #sendBtn.hover{background-position:0 -30px;}
    # msgBox form .maxNum{font:26px/30px Georgia, Tahoma, Arial;padding:0 5px;}
        #msgBox .list{padding:10px;}
      33px;字體大小:14px;字體粗細:400;背景:#e3eaec;邊框:1px 實體#dee4e7;}
        #msgBox .list h3 span{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;background:#fff;overflow:hidden;}
        #msgBox .list ul li.hf55:f5 ;}
        #msgBox .list .userPic{float:left;width:50px;height:50px;display:inline;margin-left:10px;border:1pxsolid #ccc;border;margin-left:10px;border:1pxsolid #ccc;border-radius> #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:🎜>    #msgBox .list .msgInfo{display:inbreakline; word;}
        #msgBox .list .times{color:#889db6;font:12px/18px arial;margin-top:5px;overflow:hidden;zoom:1;}
     list {float:left;}
        #msgBox .list .times a{float:right;color:#889db6;}
        .tr{overflow:hidden;zoom:1;}
    .trpffloat :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);
                });
            });

            // 廣播按鈕hover事件
            $(_config.sendBtn).hover(function(){
                !$(this).hasClass('hover') && $(this).addClass('hover ');
            },function(){
                $(this).hasClass('hover') & (this).removeClass(hover); > // 綁定事件
            self._bindEnv();
        },
       /*
        * @ return 字串的長度
         */
         _countCharacters: function(str) {
            {
    var c = str.charCodeAt(i);
                 if ((c >= 0x0001 && c              } else {  
                   ,talCount =2;
                 return totalCount;
         },
         /*
          * 所有的綁定事件
            * 所有的綁定事件
       _bindEnv: function() {
            var self = this,
               🎜>
            // 文字域keyup事件
            self._keyUp ();

            // 點選廣播按鈕事件
            self._clickBtn();      */
    _keyUp: function() {
             var self = this,
                ;
             $(_config.textareaId).unbind('keyup');
             $(_config.textareaId).bind('keyup',function(){
                         html;
                if(_config .maxNum * 1 >= len * 1) {
                    html = _config.maxNum * 1 - len *           html = _config.maxNum * 1 - len * 1;
    }
                 $(_config.maxNumElem).html(html);
                });
         },
         /*
          * 点击广播按钮事件
          */
         _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). 'click',function( ){

                    $($that).animate({
                    },500,function(){
                       } );
                });
            },function(){
       🎜>            !$ ( '.del',$(this)).hasClass('hidden') && $('.del',$(this)).addClass('hidden');
            });

    },
        /*
         * 高度
         */
         _animate: function(oLi) {
         _animate:   var iHeight = $(oLi).height() ,
                alpah = 0,
               計時器化$(oLi).css({"opacity" : "0", "height" : "0"});

            計時器 && clearInterval(計時器);
            計時器 = setInterval(function (){:   計時器 = setInterval(function (夢" : "0 ", "高度" : (count = 8) "px"});
                if (count > iHeight){
                         $(oLi).css({ "height" : iHeight "px "});
                        計時器= setInterval(function (){

                            阿爾法 > 100 && (clearInterval(timer), $(oLi).css({"opacity":1000);

                        },30);
              🎜>     }
     };

     // 初始化程式碼
     $(function(){
        new Microblog({});
     });

    原始碼下載:
    http://xiazai.jb51.net//201312/yuanma/wb(jb51.net).rar

    陳述:
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn