首页 > web前端 > js教程 > JS 仿腾讯发表微博的效果代码_javascript技巧

JS 仿腾讯发表微博的效果代码_javascript技巧

WBOY
发布: 2016-05-16 17:07:14
原创
984 人浏览过

最近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代码如下:

复制代码 代码如下:


       

           

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


            < ;div>
               
               


                    JS 仿腾讯发表微博的效果代码_javascript技巧                    JS 仿腾讯发表微博的效果代码_javascript技巧                    JS 仿腾讯发表微博的效果代码_javascript技巧                    JS 仿腾讯发表微博的效果代码_javascript技巧
                    JS 仿腾讯发表微博的效果代码_javascript技巧                    JS 仿腾讯发表微博的效果代码_javascript技巧
                   JS 仿腾讯发表微博的效果代码_javascript技巧
                   JS 仿腾讯发表微博的效果代码_javascript技巧
              


           

           

              

            < ;div class="tr">
               


                   还能输入140 strong>个字
                   
                p>
           
       
       


           

我们在说的


           
           
   
   

CSS代码如下:

复制代码代码如下:

body,div,h2,h3,ul,li,p{margin:0;padding:0;}
    a{text-decoration:none;}
    a:hover{text-装饰:下划线;}
    ul{list-style-type:none;}
    body{颜色:#333;背景:#3c3a3b;字体:12px/1.5 5b8b4f53;}
    #msgBox{宽度: 500px;背景:#fff;边框半径:5px;边距: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{颜色:#777;边框:1px 实心#d0d0d0;边框-半径: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;}
    #msgBox form div{position:relative ;颜色:#999;margin-top:10px;}
    #msgBox img{border-radius:3px;}
    #face{position:absolute;top:0;left:172px;}
    #脸部img{float:左;显示:内联;宽度:30px;高度:30px;光标:指针;margin-right:6px;不透明度:0.5;过滤器:alpha(不透明度= 50);}
    #face img。悬停,#face img.current{宽度:28px;高度:28px;边框:1px 实心#f60;opacity:1;filter:alpha(opacity=100);}
    #sendBtn{border: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;}
    #msgBox .list h3{position:relative;height :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.hover{背景:#f5f5f5;}
    #msgBox .list .userPic{float:left;width:50px;height:50px;display:inline;margin-left:10px;border:1pxsolid #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 span{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);
            });
        });

        // 广播按钮hover事件
        $(_config.sendBtn).hover(function(){
            !$(this).hasClass('hover') && $(this).addClass('hover');
        },function(){
            $(this).hasClass('hover') && $(this).removeClass('hover');
        })

        // 绑定事件
        self._bindEnv();
    },
    /*
     * 计算字符的长度 包括中文 数字 英文等等
     * @param str
     * @return 字符串的长度
     */
     _countCharacters: function(str) {
         var totalCount = 0;
          for (var i=0; i             var c = str.charCodeAt(i);
             if ((c >= 0x0001 && c <= 0x007e) || (0xff60<=c && c<=0xff9f)) {
                totalCount ;
             }else {  
                totalCount =2;
             }
         }
         return totalCount;
     },
     /*
      * 所有的绑定事件
      */
     _bindEnv: function() {
        var self = this,
            _config = self.config,
            _cache = self.cache;

        // 文本域keyup事件
        self._keyUp();

        // 点击广播按钮事件
        self._clickBtn();
     },
     /*
      * 文本域keyup事件
      */
     _keyUp: function() {
         var self = 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) {
                html = _config.maxNum * 1 - len * 1;
             }else {
                html = _config.maxNum * 1 - len * 1;
             }
             $(_config.maxNumElem).html(html);
             $(_config.maxNumElem).attr('data-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).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(),
            alpah = 0,
            计时器,
            count = 0;
        $(oLi).css({"opacity" : "0", "height" : "0"});

        计时器 && clearInterval(计时器);
        计时器 = setInterval(function (){
            $(oLi).css({"显示" : "块", "不透明度" : "0", "高度" : (count = 8) "px"});
            if (count > iHeight){
                  clearInterval(timer);
                    $(oLi).css({ "height" : iHeight "px "});
                    计时器 = setInterval(function (){
                        $(oLi).css({"opacity" : alpah = 10});

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

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

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

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

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板