HTML移动端 实现刻度尺效果

前言

在薄荷app的用户信息页看到在记录身高时,利用左右滑动刻度尺来取值。原本以为是h5实现,但上网搜索后并没有找到相关博客和文章,倒是有很多android的控件实现。所以就想自己实现一个看看。

需求

因为只是做一个demo,那就实现简单的效果就可以:

  1. 刻度区间[0,100]
  2. 有倒三角标记,指示当前刻数
  3. 用户左右滑动刻度尺区域,能够动态获取倒三角指示的刻数

效果图

效果图

实现过程

以下讲述关键的实现步骤,也可以直接下载文章最后的github源码。

页面绘制

页面其实很好绘制,一个刻度文本<span>节点和一个包裹刻度尺的<div>容器。难点在于刻度尺的展示和倒三角的实现。

  • 倒三角的实现
//html
<div id="triangle"></div>
//css样式
#triangle {
    width: 0;
    height: 0;
    margin: 0 auto;
    z-index: 199;
    border-top: 1rem solid rgb(190, 98, 75);
    border-left: 1rem solid transparent;
    border-right: 1rem solid transparent;
}

倒三角是一个没有内容的div,高度0,宽度0,为了让其居中,设置marigin:0 auto。通过设置左右边框透明、上边框1rem粗可以画出倒三角的效果。

  • 刻度尺实现
//html
<div id="ruler" data-offset="0">
            <ul id="ruler-ul">
                <li>
                    <span>10</span>
                </li>
                <li>
                    <span>20</span>
                </li>
                <li>
                    <span>30</span>
                </li>
                //更多的刻度
          </ul>
</div>
//css样式
#ruler-container {
    position: relative;
    overflow: hidden;
    width: 20rem;
    height: 5rem;
    border: 1px solid rgb(147, 184, 47);
}

#ruler ul {
    transform: translateX(10rem);
    width: 100rem;
    height: 4rem;
    position: relative;
}

#ruler ul li{
    width: 6.5rem;
    height: 100%;
    text-align: right;
    background: url(./ruler.png) top left no-repeat;
    background-size: 100px auto;
    float: left;
    list-style: none;
}
  1. 刻度尺其实是一个无序列表,每一个刻度都是其中一个列表项。
  2. ul元素的宽度尽量设置非常大,并将其父div的overflow属性设置为hidden,保证列表项在一行上。
  3. 刻度线使用一张背景图片实现,设置background-size和background属性,可以让其达到合适的排列效果。同时需要float:left消除空隙。list-style:none也是必须的,不然会有默认的圆点。

至此,页面的布局算是完成了。

滑动事件响应

实现滑动效果就是计算手指滑动距离,来设置#ruler的tansform:translateX(距离)样式。

  • 首先记录手指触碰到屏幕时的x坐标
    ruler.addEventListener('touchstart', function (event) {
        //手指按下时的坐标
        offsetX = event.touches[0].clientX;
        //初始化第一次滑动的距离为0
        moveBefore = 0;
    });
  • 当手指在屏幕上滑动时将其x坐标记录下来,跟按下时的x坐标相减计算出偏移量,将该偏移量赋给#ruler的样式,同时除以单位刻度的长度unit获取移动的刻度数,保留两位小数显示
    rulerUl.addEventListener('touchmove', function (event) {
        //获取滑动时手指的动态坐标
        var move = event.touches[0].clientX;
        //上一次计算出的刻度尺移动距离
        var offset = ruler.dataset.offset;
        //原来是string,转换为float方便计算
        offset = parseFloat(offset);
        var tempMove = 0;
        var len = 0;
        //相对于手指按下时的距离,除以10是因为要将px转换为rem单位
        tempMove = move - offsetX;
        tempMove /= 10;
        //计算两次滑动间的距离
        len = offset + (tempMove - moveBefore);
        len = parseFloat(len);
        //边界判断,最大偏移长度65rem
        if (len - 0.0 < 0 && len > -65) {
            //将结果保存下来,下一次滑动时取出参与计算
            moveX = tempMove;
            ruler.dataset.offset = len;
            moveBefore = moveX;
            //设置样式
            ruler.style = "transform: translateX(" + len + "rem)";
            //显示刻度,保留2位小数
            num.innerText = -((len / unit).toFixed(2));
        }
    }, false);

源码地址

github地址

总结

一时兴起做了这个demo,简单的实现了刻度尺滑动效果。但是也有一些问题:

  1. 因为浮点数精度问题会出现无法滑动到0或100的情况,因为此时已经满足滑动事件中的if条件,后面的样式修改等语句不会执行。
  2. 虽然使用了rem单位来处理不同设备,但是因为刻度线使用了背景图片来实现,不同的设备宽度下精度会受到影响。
  3. 我只是一个学了3个月前端的新人,代码中肯定还有很多我不知道的不规范的地方,,希望能帮我指出。

如果能帮到你,我将十分荣幸。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容