js通讯录效果,你见过麽

最近有一个需求,要写一个通讯录效果的联系人列表效果,相信这个大家都不陌生,当然当我写到一半的时候,同事告诉我这个是android和IOS的需求,,,十分郁闷,但是本人求知欲甚是强烈,就用jq实现了这个功能。

现在我们先来看一下这个功能演示,这个实现了基本的功能,不过一些过渡的动画没有写上,后期会补上,大家想用的话,自行不上这个过渡效果:


通讯录效果演示.gif

首先我们来看一下html的布局,这个布局很简单

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <meta name="format-detection" content="telephone=no">
    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="Expires" content="0" />
    <title>Title</title>
    <style>
    *{padding: 0;margin: 0}
html,body{
    width: 100%;height: 100%;box-sizing: border-box;
    font-size: 62.5%;
}
a,ul,li{
    list-style: none;
    text-decoration: none;
}
.slider{width: 100%;height: 100%;position: relative ; padding-top: 1.5rem }
.sliderNav{width: 10%;position: fixed;right: 0;height: 100%;text-align: center;top: 1.5rem;}
.slider>h2{
    font-size: 2rem;
    line-height: 3.5rem;
    padding-left: 1.5rem;
}
.sliderNav>li>a{
    font-size: 2rem;
    color: #18a2ff;
}
.slider-content{
    position: absolute;
    left: 1.5rem;
    width: 85%;
}
.slider-content>div{
    font-size: 30px;
    padding-left: 1.5rem;
    height: 50px;
    line-height: 50px;
    background-color: #7f8393;
}
.slider-content>div:nth-child(2n+1){
    background-color: #bff3de;
}
.slider-content>div:nth-child(2n){
    background-color: #7f8393;
}

.slider-content>ul{
    padding-top: 0.5rem;
}
.slider-content>ul>li{
    line-height:3rem;
}
    </style>
    <script src="jquery.min.js"></script>
    <script src="codeList.js"></script>
    <script src="test.js"></script>
    <link rel="stylesheet" href="test.css">
</head>
<body>

<div class="slider" id="slider">
    <h2 >邀请的好友列表</h2>
    <div class="slider-content" id="sliderContent"></div>
    <ul class="sliderNav" id="sliderNav"></ul>
</div>
</body>
<script>

</script>
</html>

鉴于文件的太多,引入的文件部分我会以链接的形式,大家可以跳转页面,下载相应的部分

  1. 引入一个jquery文件
  2. 变量 的引入,其中需要引入一个 字符的Unicode编码范围为19968至40869
  3. 对应的汉字转码
    4.列表显示的数据展示
111111111111111111111.png

相关链接请跳转此处

http://www.jianshu.com/p/fe5f32f5acfb
2016121411540catFish.jpg

有了以上的条件,我们来看js实现部分

/**
 * Created by Administrator on 2017/1/5.
 */

$(function () {
    var obj = getInviterFirst(inviter);
    getSliderNav(obj.inviterFirst);
    console.log(obj.sortInviter);
    getSliderContent(obj.sortInviter);
});
function getSliderContent(object) {
    var html = '';
    var _li_html = '';
    for(var i in object){
        console.log(i);
        for (var j = 0 ; j < object[i].length; j++){
            _li_html+='<li>'+object[i][j]+'</li>';
        }
        html += '<div id='+i+'><span>'+i+'</span></div><ul >'+_li_html+'</ul>';
        _li_html = '';
    }
    $('#sliderContent').html(html);
}
/**
 * 字母排序
 * @param a
 * @param b
 * @returns {number}
 */
function mySorter(a, b){
    if (/^\d/.test(a)^/^\D/.test(b)) return a>b?1:(a==b?0:-1);
    return a>b?-1:(a==b?0:1);
}
/**
 * 获取通讯录右侧的索引
 * @param array
 */
function getSliderNav(array) {
    var html = '';
    for (var i = 0; i < array.length ; i ++){
        html+='<li ><a href=#'+array[i]+'>'+array[i]+'</a></li>';
    }
    $('#sliderNav').append(html);
    $('.sliderNav li').css('height',($('.sliderNav').height()-35)/array.length);
    $('.sliderNav li').css('line-height',($('.sliderNav').height()-35)/array.length+'px');

}
/**
 * 获取所有数据包含的首字母,并且去重,按照字母顺序进行排序,并将数据按照首字母进行分类
 * @param arr
 * @returns {*|Array.<T>}
 */
function getInviterFirst(arr){
    var objObj = {};
    var array = [];
    var objArr = [];
    for (var i = 0 ; i < arr.length ; i ++){
        array.push(query(arr[i]));
        console.log(query(arr[i]));
        if (!objObj.hasOwnProperty(query(arr[i]))){
            objArr = [];
            objArr.push(arr[i]);
            objObj[query(arr[i])] = objArr;

        }else{
            objArr.push(arr[i]);
        }
    }

    return obj = {
        sortInviter:objObj,
        inviterFirst:(Array.from(new Set(array))).sort(mySorter)
    };
}
/**
 *查看拼音首字母缩写
 */
function query(str){
    if(str == "") return;
    var arrRslt = makePy(str);
    return arrRslt[0].toLowerCase().substr(0,1);
}
/**
 * 参数,中文字符串
 * 返回值:拼音首字母串数组
 * @param str
 * @returns {*}
 */
function makePy(str){
    if(typeof(str) != "string")
        throw new Error(-1,"函数makePy需要字符串类型参数!");
    var arrResult = new Array(); //保存中间结果的数组
    for(var i=0,len=str.length;i<len;i++){
        //获得unicode码
        var ch = str.charAt(i);
        //检查该unicode码是否在处理范围之内,在则返回该码对映汉字的拼音首字母,不在则调用其它函数处理
        arrResult.push(checkCh(ch));
    }
    //处理arrResult,返回所有可能的拼音首字母串数组
    return mkRslt(arrResult);
}

function checkCh(ch){
    var uni = ch.charCodeAt(0);
//如果不在汉字处理范围之内,返回原字符,也可以调用自己的处理函数
    if(uni > 40869 || uni < 19968)
        return ch; //dealWithOthers(ch);
//检查是否是多音字,是按多音字处理,不是就直接在strChineseFirstPY字符串中找对应的首字母
    return (oMultiDiff[uni]?oMultiDiff[uni]:(strChineseFirstPY.charAt(uni-19968)));
}

function mkRslt(arr){
    var arrRslt = [""];
    for(var i=0,len=arr.length;i<len;i++){
        var str = arr[i];
        var strlen = str.length;
        if(strlen == 1){
            for(var k=0;k<arrRslt.length;k++){
                arrRslt[k] += str;
            }
        }else{
            var tmpArr = arrRslt.slice(0);
            arrRslt = [];
            for(k=0;k<strlen;k++){
                //复制一个相同的arrRslt
                var tmp = tmpArr.slice(0);
                //把当前字符str[k]添加到每个元素末尾
                for(var j=0;j<tmp.length;j++){
                    tmp[j] += str.charAt(k);
                }
                //把复制并修改后的数组连接到arrRslt上
                arrRslt = arrRslt.concat(tmp);
            }
        }
    }
    return arrRslt;
}

哈哈,看着这个通讯录效果虽然比较简陋但是基本效果还是实现了,大家可以引用在此基础上进行修改以满足你们的需求欲,如有疑问请留言或者发送我的邮箱2372734044@qq.com
不足之处大家尽可以指出来,方便交流探讨

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,392评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 家乡的秋是迷人的。 家乡的秋,天空如明镜似的一般清澈。蓝色的天空飘着几朵悠闲地云儿,似乎在漫不经心的看着远方,又似...
    小苜蓿阅读 262评论 16 10
  • 甜美系的妹子 这几年一直都非常受欢迎 今天我们就来看看岛国的甜美系妹子 新垣结衣长相甜美、笑容纯真 拥有天使般笑容...
    小淘米_TTMIX阅读 549评论 0 0
  • 累了就躲远一点,舒服就靠得近一些,如果相处很累就千万不要同路,生活已经如此艰难,为何不让自己过得顺畅些呢?
    美伊王阅读 294评论 0 0