打造移动版QQ表情


跟QQ手机版的表情类似,可以滑动翻页,总共100个表情。上图看看效果吧,这不是APP,你没看错,是Web。是不是感觉比基于jQuery的QQ表情插件看起来高大上些呢。不是说那个不好,主要是那只适用于PC端,在移动端显示效果很差也不好用,所以想模仿QQ的web页面中的表情输入。

QQ表情
QQ表情


一般Web版表情实现方式

查看过jQuery的QQ表情插件应该知道,每个表情有一个图片,通过CSS把每个表情排列好,点击每个表情的时触发对应的事件,将对应编号组成指定格式(如[em_11])输入到文本框,通过将[em_11]转换为html的img标签显示到页面中。


兴趣部落的QQ表情是怎么实现的?

在手机QQ中打开兴趣部落,随便找个话题进去,点击分享,复制链接发到PC,chrome打开对应链接,额,提示要扫码在手机端查看,不急,按下F12打开调试模式,开启手机调试模式(调试窗口左上角手机按钮),随便选择一个Nexus4机型,刷新即可,然后点击评论(需要登录),点击表情按钮,右键审查元素,结构就都显示出来了。


兴趣部落表情
兴趣部落表情

然后发现,每个页面是一张大图,总共5张大图片(其实我最初只是打算来取这几张图片的(>_<),然后就忍不住了)。每次滑动显示下一张图片,每张图片上的每个表情由span标签分割位置(没有使用CSS分割图片,只是记录对应的位置)。通过下面这张图应该能很清楚的看到效果。


JS显示每个HTML标签
JS显示每个HTML标签
这张图怎么来的?且看下面这一句JS(哈哈,装逼的时候到了,这句话总算派上用场了)
```
[].forEach.call($$("*"),function(a){
  a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16)
})
```
当然,这不是我写的,这一句话很值得慢慢品味,附上原文链接[Learning much javascript from one line of code](http://arqex.com/939/learning-much-javascript-one-line-code?utm_source=ourjs.com)

继续,然后每个表情也有一张单独的图片,并且比大图中的更清晰。发表之后,根据img标签去访问对应的图片即可。

为什么用这种方式?

  • 5张大图100个表情总共100K左右,如果采用滑动时加载的话,初次载入只需要20K,而发送时才会去访问对应表情的单张图片。而如果是之前jQuery插件方式,75个表情总共221K需要一次性载入,或者分5次载入,也需要每次50K左右。
  • 其次整张图片的形式可以做到根据屏幕宽度对应缩放,而单个的调整起来麻烦且不清晰。

实现过程

1. 点击表情

通过上面的分析可以知道,每个span标签包含着对应表情,通过给每个标签绑定相同的class,不同的alt,如:

<span class="express" index="0" alt="[em_0]"></span>

给class绑定click事件,获取光标之前的文本,检测表情code块,处理添加、删除字符或表情code块。

// 点击表情
$('.express').on('click', function() {
    // 获取表情对应code
    var imgCode = $(this).attr('alt');
    // 获取编号判断是否为删除按钮
    var index = $(this).attr('index');
    var ta = document.querySelector('textarea');
    // 删除操作
    if(index == -1){
        if ($('#' + curFocus.fid).length) {
            var text = $('#' + curFocus.fid).val();
            // 获取光标之前的字符串
            var changedText = text.substr(0, curFocus.start);
            var len = changedText.length;
            var reg=/\[em_([0-9]*)\]$/g;
            // 删除表情code块或最后一个字符
            if(reg.test(changedText)){
                changedText=changedText.replace(reg,"");
            }else{
                changedText=changedText.substring(0,changedText.length-1);
            }
            var resText = changedText + text.substr(curFocus.end, text.length);
            $('#' + curFocus.fid).val(resText);
            // 调整光标位置
            curFocus.start = curFocus.end = curFocus.end - (len - changedText.length);
        }
    // 添加操作
    }else if ($('#' + curFocus.fid).length) {
        var text = $('#' + curFocus.fid).val();
        // 添加表情code块到光标位置
        var resText = text.substr(0, curFocus.start) + imgCode + text.substr(curFocus.end, text.length);
        $('#' + curFocus.fid).val(resText);
        curFocus.start = curFocus.end = curFocus.end + imgCode.length;
    }
});

2. 分页滑动

通过chrome分析可知兴趣部落采用的是zepto.js做的图片滑动,但是个人觉得太大,于是随便找了个swipe.js(参考http://www.jiawin.com/swipe-mobile-touch-slider),使用相对简单,绑定几个标签和样式即可。

var slider =
        Swipe(document.getElementById('slider'), {
            continuous: true,
            callback: function (pos) {

                var i = bullets.length;
                while (i--) {
                    bullets[i].className = ' ';
                }
                bullets[pos].className = 'js-active';
            }
        });

    var bullets = document.getElementById('position').getElementsByTagName('li');

至于CSS直接从兴趣部落中提取出来的,做了部分修改,兴趣部落的表情太小。
需要查看完整代码可访问QQ表情,需要开启手机调试模式才能查看滑动效果。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,615评论 4 59
  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 24,862评论 7 249
  • 又一次八点多睡醒,睁开眼又合上,不是不愿意醒来起来,只是真不知道起床要做什么。辞职之后我没有了固定的临时工作,本...
    简伟阅读 245评论 0 0
  • 世界是一面镜子。你认为外界一切都是恶的。外面就会显示与你对立,与你产生对抗关系。 你若认同外界一切都是善的。外面就...
    顿慈悟语阅读 113评论 0 0