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


Posted in Javascript onDecember 25, 2013

最近2天研究了下 腾讯发表微博的效果 特此来分享下,效果如下:

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

 

在此分享前 来谈谈本人编写代码的习惯,很多人会问我既然用的是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 id="msgBox">
        <form>
            <h2>来 , 说说你在做什么 , 想什么</h2>
            <div>
                <input id="userName" class="f-text" value="" />
                <p id="face">
                    <img src="img/face1.gif" class="current" />
                    <img src="img/face2.gif" />
                    <img src="img/face3.gif" />
                    <img src="img/face4.gif" />
                    <img src="img/face5.gif" />
                    <img src="img/face6.gif" />
                    <img src="img/face7.gif" />
                    <img src="img/face8.gif" />
                </p>
            </div>
            <div>
                <textarea id="conBox" class="f-text"></textarea>
            </div>
            <div class="tr">
                <p>
                    <span class="countTxt">还能输入</span><strong class="maxNum">140</strong><span>个字</span>
                    <input id="sendBtn" type="button" value="" title="快捷键 Ctrl+Enter" />
                </p>
            </div>
        </form>
        <div class="list">
            <h3><span>大家在说</span></h3>
            <ul id="list-msg"></ul>
        </div>    
    </div>

CSS代码如下:

body,div,h2,h3,ul,li,p{margin:0;padding:0;}
    a{text-decoration:none;}
    a:hover{text-decoration:underline;}
    ul{list-style-type:none;}
    body{color:#333;background:#3c3a3b;font:12px/1.5 \5b8b\4f53;}
    #msgBox{width:500px;background:#fff;border-radius:5px;margin:10px auto;padding-top:10px;}
    #msgBox form h2{font-weight:400;font:400 18px/1.5 \5fae\8f6f\96c5\9ed1;}
    #msgBox form{background:url(img/boxBG.jpg) repeat-x 0 bottom;padding:0 20px 15px;}
    #userName,#conBox{color:#777;border:1px solid #d0d0d0;border-radius:6px;background:#fff url(img/inputBG.png) repeat-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 form div{position:relative;color:#999;margin-top:10px;}
    #msgBox img{border-radius:3px;}
    #face{position:absolute;top:0;left:172px;}
    #face 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 form .maxNum{font:26px/30px Georgia, Tahoma, Arial;padding:0 5px;}
    #msgBox .list{padding:10px;}
    #msgBox .list h3{position:relative;height:33px;font-size:14px;font-weight:400;background:#e3eaec;border:1px solid #dee4e7;}
    #msgBox .list h3 span{position:absolute;left:6px;top:6px;background:#fff;line-height:28px;display:inline-block;padding: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{background:#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 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<str.length; 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 = '<div class="userPic">' + 
                           '<img src="'+self._getSrc()+'" />'+
                        '</div>' + 
                        '<div class="content">' + 
                            '<div class="userName"><a href="javascript:;">'+inputVal+'</a>:</div>' + 
                            '<div class="msgInfo">'+textVal+'</div>' + 
                            '<div class="times">'+
                                '<span>'+self._format(oDate.getMonth() + 1) + "\u6708" + self._format(oDate.getDate()) + "\u65e5 " + self._format(oDate.getHours()) + ":" + self._format(oDate.getMinutes())+'</span>'+ 
                                '<a class="del hidden" href="javascript:;">删除</a>'+
                            '</div>' + 
                        '</div>';
        // 插入元素
        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({
                    'opacity' : 0
                },500,function(){
                    $that.remove();    
                });
            });
        },function(){
            $(this).hasClass('hover') && $(this).removeClass('hover');
            !$('.del',$(this)).hasClass('hidden') && $('.del',$(this)).addClass('hidden');
        });
    },
    /*
     * height
     */
     _animate: function(oLi) {
        var self = this;
        var iHeight = $(oLi).height(),
            alpah = 0,
            timer,
            count = 0;
        $(oLi).css({"opacity" : "0", "height" : "0"});
        timer && clearInterval(timer);
        timer = setInterval(function (){
            $(oLi).css({"display" : "block", "opacity" : "0", "height" : (count += 8) + "px"});
            if (count > iHeight){
                    clearInterval(timer);
                    $(oLi).css({ "height" : iHeight + "px"});
                    timer = setInterval(function (){
                        $(oLi).css({"opacity" : alpah += 10});
                        alpah > 100 && (clearInterval(timer), $(oLi).css({"opacity":100}));
                    },30);
                }
            },30);
     }
 };
 // 初始化代码
 $(function(){
    new Microblog({});
 });

源码下载:http://xiazai.3water.com//201312/yuanma/wb(3water.com).rar

Javascript 相关文章推荐
跟随鼠标旋转的文字
Nov 30 Javascript
Extjs学习过程中新手容易碰到的低级错误积累
Feb 11 Javascript
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
Nov 30 Javascript
电子商务网站上的常用的js放大镜效果
Dec 08 Javascript
js脚本实现数据去重
Nov 27 Javascript
Node.js开发之访问Redis数据库教程
Jan 14 Javascript
JS实现单击输入框弹出选择框效果完整实例
Dec 14 Javascript
JavaScript笔记之数据属性和存储器属性
Mar 31 Javascript
AngularJS过滤器详解及示例代码
Aug 16 Javascript
原生JS和jQuery操作DOM对比总结
Jan 19 Javascript
JS实现纵向轮播图(初级版)
Jan 18 Javascript
js实现简单五子棋游戏
May 28 Javascript
javascript使用定时函数实现跳转到某个页面
Dec 25 #Javascript
JS不间断向上滚动效果代码
Dec 25 #Javascript
js中同步与异步处理的方法和区别总结
Dec 25 #Javascript
在javascript中实现函数数组的方法
Dec 25 #Javascript
js 时间格式与时间戳的相互转换示例代码
Dec 25 #Javascript
js中for in的用法示例解析
Dec 25 #Javascript
在javascript中执行任意html代码的方法示例解读
Dec 25 #Javascript
You might like
discuz安全提问算法
2007/06/06 PHP
PHP strip_tags()去除HTML、XML以及PHP的标签介绍
2014/02/18 PHP
getJSON跨域SyntaxError问题分析
2014/08/07 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
2015/04/17 PHP
PHP连接sftp并下载文件的方法教程
2018/08/26 PHP
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
11款基于Javascript的文件管理器
2009/10/25 Javascript
JavaScript 学习历程和心得分享
2010/12/12 Javascript
EXTjs4.0的store的findRecord的BUG演示代码
2013/06/08 Javascript
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
2014/09/01 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
第一篇初识bootstrap
2016/06/21 Javascript
原生js仿淘宝网商品放大镜效果
2017/02/28 Javascript
今天,小程序正式支持 SVG
2019/04/20 Javascript
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
[53:10]Secret vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
教你安装python Django(图文)
2013/11/04 Python
分析Python的Django框架的运行方式及处理流程
2015/04/08 Python
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
Python迭代和迭代器详解
2016/11/10 Python
Python关于excel和shp的使用在matplotlib
2019/01/03 Python
Django后端接收嵌套Json数据及解析详解
2019/07/17 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
2020/03/10 Python
Python接口测试数据库封装实现原理
2020/05/09 Python
HTML5 input元素类型:email及url介绍
2013/08/13 HTML / CSS
巧克力领导品牌瑞士莲美国官网:Lindt Chocolate美国
2016/08/25 全球购物
建筑专业毕业生推荐信
2013/11/21 职场文书
创先争优活动心得体会
2014/09/04 职场文书
个性与发展自我评价
2015/03/06 职场文书
2015年初三班主任工作总结
2015/05/21 职场文书
2015年国庆节演讲稿范文
2015/07/30 职场文书
农贸批发市场管理制度
2015/08/07 职场文书
2016形势与政策学习心得体会
2016/01/12 职场文书
中学教代会开幕词
2016/03/04 职场文书
解决go在函数退出后子协程的退出问题
2021/04/30 Golang
springcloud之Feign超时问题的解决
2021/06/24 Java/Android