zoukankan      html  css  js  c++  java
  • 如何在前端实现语义缩放(第一步)

    在phone中找联系人的时候,点击那个拼音首字母,26个字母会在当前屏幕全部显示。这种语义缩放在WP中是一种控件。所有歌曲的名称也可以这样快速查找。

    对于小的手机屏幕不适合一页一页的翻页,这个语义缩放真是太方便了。

    在JS中怎么实现,先上图:

    源代码:

     <ul id="l1" class="no-dot content">
                <li>关怀</li>
                <li>测试</li>
                <li>阿女</li>
                <li>第三方</li>
                <li>谁谁谁</li>
                <li>模糊</li>
                <li>电话</li>
                <li>发送</li>
                <li>沟通</li>
                <li></li>
                <li>当天</li>
                <li>当前</li>
                <li>代码</li>
                <li>但是</li>
                <li>仍然</li>
                <li>稳稳</li>
            </ul>

    通过对比,可以发现,按拼音首字母已经排序了。并且在每组(按首字母分组)的第一个词语前加上了首字母拼音。

    做这个功能的关键是,所有汉字的拼音字典。(网上很多,一个JSON即可)

    JS中的关键函数是get,输入汉字,返回拼音。

    var Pinyin = {}
     
    Pinyin._ucfirst = function (l1) {
        if (l1.length > 0) {
            var first = l1.substr(0, 1).toUpperCase();
            var spare = l1.substr(1, l1.length);
            return first + spare;
        }
    }
    
    
    Pinyin._arraySearch = function (l1, l2) {
        for (var name in this._pinyin) {
            if (this._pinyin[name].indexOf(l1) != -1) {
                return this._ucfirst(name); break;
            }
        }
        return false;
    }
    
    Pinyin.get = function (l1) {
        var l2 = l1.length;
        var I1 = "";
        var reg = new RegExp('[a-zA-Z0-9- ]');
        for (var i = 0; i < l2; i++) {
            var val = l1.substr(i, 1);//拆分后的输入字符
           
            var name = this._arraySearch(val, this._pinyin);//不为false表示找到的拼音
            if (reg.test(val)) {//半角字母或数字输出原字符
                I1 += val;
            } else if (name !== false) {
                I1 += name;
            }
    
        }
        I1 = I1.replace(/ /g, '-');
        while (I1.indexOf('--') > 0) {
            I1 = I1.replace('--', '-');
        }
        return I1;
    }


    完整的HTMl源码:

    <head>
        <meta name="viewport" content="width=device-width" />
        <title>List</title>
        <script src="~/Scripts/Pinyin.js"></script>
        <script src="~/Scripts/jquery-1.8.2.js"></script>
        <script>
    
            var usableLetter = [];
    
            function appendFirstLetterOfPinyin(list)
            {
                var lis = $('li', list).each(function () {
                    var fp = getFP(this);
    
                    $(this).data('fp', fp);
                }).sort(sort);
                $(list).html(lis);
    
                $('li', list).each(function (index, item) {
                    (function (me) {
                        var fp = getFP(me);
                        if (index === 0) {
                            insertFP(fp, me);
    
                        }
                        else {
                            var l_fp = getFP($('li:eq(' + (index -1) + ')', list));
                            console.log(l_fp + " - " + fp);
                            if (fp != l_fp) {
                                usableLetter.push(fp);
                                insertFP(fp, me);
    
                            }
                        }
                    })(this);
                   
                })
            }
    
            function insertFP(fp,target)
            {
                $('<div class="flag" >' + '<a href="#' + fp + '">' + fp + '</a></div>').insertBefore(target);
            }
    
            function getFP(t) {
                var fw = $(t).text().substring(0, 1);
                var fp = Pinyin.get(fw).substring(0, 1);
                return fp;
            }
    
    
            function sort(a, b) {
                var _a = $(a).data('fp').charCodeAt(0);
                var _b = $(b).data('fp').charCodeAt(0);
    
                return _a - _b;
            }
    
            $(function () {
    
                appendFirstLetterOfPinyin($('#l1'));
            })
        </script>
        <style>
            .flag {
                width: 16px;
                height: 16px;
                padding: 2px;
                text-align: center;
                background-color: rgba(20, 181, 111, 0.92);
                color: white;
                cursor:pointer;
            }
            .no-dot {
                list-style: none;
            }
            ul :first-child ::before {
                 
            }
            .flag a
            {
                text-decoration:none;
                color:white;
            }
             .content li {
            }
        </style>
    </head>
    <body>
        <div>
            
            <ul id="l1" class="no-dot content">
                <li>关怀</li>
                <li>测试</li>
                <li>阿女</li>
                <li>第三方</li>
                <li>谁谁谁</li>
                <li>模糊</li>
                <li>电话</li>
                <li>发送</li>
                <li>沟通</li>
                <li></li>
                <li>当天</li>
                <li>当前</li>
                <li>代码</li>
                <li>但是</li>
                <li>仍然</li>
                <li>稳稳</li>
            </ul>
        </div>
    </body>


    接下来是添加拼音首字母事件,点击后一屏出现26个字母,可用的字母用亮色表示,不可用的字母用暗色背景表示。然后点击可用字母后自动定位。

    扩展用途:定位时自动获取翻页数据。

    适用场景:小屏幕上找列表项是词语或短语的又需要翻页的。这个比传统的翻页更方便。

    (拼音JSON较大,稍后附上)

  • 相关阅读:
    layout_weight使用
    Android sdk manager 下载速度慢的问题
    详谈OC(object-c)深浅复制/拷贝-什么情况下用retain和copy
    object-c(oc)内存管理机制详解
    xmpp实现的即时通讯聊天(二)
    xmpp实现的即时通讯聊天(一)
    iOS开发消息推送原理
    指定的转换无效。
    Oracle11g +Win 64+PLSQL9.0
    数据库连接字符串
  • 原文地址:https://www.cnblogs.com/langu/p/4494664.html
Copyright © 2011-2022 走看看