HTML移動(dòng)端 實(shí)現(xiàn)刻度尺效果

前言

在薄荷app的用戶信息頁(yè)看到在記錄身高時(shí)衔峰,利用左右滑動(dòng)刻度尺來(lái)取值即寡。原本以為是h5實(shí)現(xiàn)戈毒,但上網(wǎng)搜索后并沒(méi)有找到相關(guān)博客和文章,倒是有很多android的控件實(shí)現(xiàn)议经。所以就想自己實(shí)現(xiàn)一個(gè)看看斧账。

需求

因?yàn)橹皇亲鲆粋€(gè)demo,那就實(shí)現(xiàn)簡(jiǎn)單的效果就可以:

  1. 刻度區(qū)間[0煞肾,100]
  2. 有倒三角標(biāo)記咧织,指示當(dāng)前刻數(shù)
  3. 用戶左右滑動(dòng)刻度尺區(qū)域,能夠動(dòng)態(tài)獲取倒三角指示的刻數(shù)

效果圖

效果圖

實(shí)現(xiàn)過(guò)程

以下講述關(guān)鍵的實(shí)現(xiàn)步驟籍救,也可以直接下載文章最后的github源碼习绢。

頁(yè)面繪制

頁(yè)面其實(shí)很好繪制,一個(gè)刻度文本<span>節(jié)點(diǎn)和一個(gè)包裹刻度尺的<div>容器蝙昙。難點(diǎn)在于刻度尺的展示和倒三角的實(shí)現(xiàn)闪萄。

  • 倒三角的實(shí)現(xiàn)
//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;
}

倒三角是一個(gè)沒(méi)有內(nèi)容的div,高度0奇颠,寬度0败去,為了讓其居中,設(shè)置marigin:0 auto烈拒。通過(guò)設(shè)置左右邊框透明为迈、上邊框1rem粗可以畫(huà)出倒三角的效果。

  • 刻度尺實(shí)現(xiàn)
//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. 刻度尺其實(shí)是一個(gè)無(wú)序列表缺菌,每一個(gè)刻度都是其中一個(gè)列表項(xiàng)葫辐。
  2. ul元素的寬度盡量設(shè)置非常大,并將其父div的overflow屬性設(shè)置為hidden伴郁,保證列表項(xiàng)在一行上耿战。
  3. 刻度線使用一張背景圖片實(shí)現(xiàn),設(shè)置background-size和background屬性焊傅,可以讓其達(dá)到合適的排列效果剂陡。同時(shí)需要float:left消除空隙狈涮。list-style:none也是必須的,不然會(huì)有默認(rèn)的圓點(diǎn)鸭栖。

至此歌馍,頁(yè)面的布局算是完成了。

滑動(dòng)事件響應(yīng)

實(shí)現(xiàn)滑動(dòng)效果就是計(jì)算手指滑動(dòng)距離晕鹊,來(lái)設(shè)置#ruler的tansform:translateX(距離)樣式松却。

  • 首先記錄手指觸碰到屏幕時(shí)的x坐標(biāo)
    ruler.addEventListener('touchstart', function (event) {
        //手指按下時(shí)的坐標(biāo)
        offsetX = event.touches[0].clientX;
        //初始化第一次滑動(dòng)的距離為0
        moveBefore = 0;
    });
  • 當(dāng)手指在屏幕上滑動(dòng)時(shí)將其x坐標(biāo)記錄下來(lái),跟按下時(shí)的x坐標(biāo)相減計(jì)算出偏移量溅话,將該偏移量賦給#ruler的樣式晓锻,同時(shí)除以單位刻度的長(zhǎng)度unit獲取移動(dòng)的刻度數(shù),保留兩位小數(shù)顯示
    rulerUl.addEventListener('touchmove', function (event) {
        //獲取滑動(dòng)時(shí)手指的動(dòng)態(tài)坐標(biāo)
        var move = event.touches[0].clientX;
        //上一次計(jì)算出的刻度尺移動(dòng)距離
        var offset = ruler.dataset.offset;
        //原來(lái)是string飞几,轉(zhuǎn)換為float方便計(jì)算
        offset = parseFloat(offset);
        var tempMove = 0;
        var len = 0;
        //相對(duì)于手指按下時(shí)的距離砚哆,除以10是因?yàn)橐獙x轉(zhuǎn)換為rem單位
        tempMove = move - offsetX;
        tempMove /= 10;
        //計(jì)算兩次滑動(dòng)間的距離
        len = offset + (tempMove - moveBefore);
        len = parseFloat(len);
        //邊界判斷,最大偏移長(zhǎng)度65rem
        if (len - 0.0 < 0 && len > -65) {
            //將結(jié)果保存下來(lái)屑墨,下一次滑動(dòng)時(shí)取出參與計(jì)算
            moveX = tempMove;
            ruler.dataset.offset = len;
            moveBefore = moveX;
            //設(shè)置樣式
            ruler.style = "transform: translateX(" + len + "rem)";
            //顯示刻度躁锁,保留2位小數(shù)
            num.innerText = -((len / unit).toFixed(2));
        }
    }, false);

源碼地址

github地址

總結(jié)

一時(shí)興起做了這個(gè)demo,簡(jiǎn)單的實(shí)現(xiàn)了刻度尺滑動(dòng)效果卵史。但是也有一些問(wèn)題:

  1. 因?yàn)楦↑c(diǎn)數(shù)精度問(wèn)題會(huì)出現(xiàn)無(wú)法滑動(dòng)到0或100的情況灿里,因?yàn)榇藭r(shí)已經(jīng)滿足滑動(dòng)事件中的if條件,后面的樣式修改等語(yǔ)句不會(huì)執(zhí)行程腹。
  2. 雖然使用了rem單位來(lái)處理不同設(shè)備匣吊,但是因?yàn)榭潭染€使用了背景圖片來(lái)實(shí)現(xiàn),不同的設(shè)備寬度下精度會(huì)受到影響寸潦。
  3. 我只是一個(gè)學(xué)了3個(gè)月前端的新人色鸳,代碼中肯定還有很多我不知道的不規(guī)范的地方,,希望能幫我指出见转。

如果能幫到你命雀,我將十分榮幸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末斩箫,一起剝皮案震驚了整個(gè)濱河市吏砂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乘客,老刑警劉巖狐血,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異易核,居然都是意外死亡匈织,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)缀匕,“玉大人纳决,你說(shuō)我怎么就攤上這事∠缧。” “怎么了阔加?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)满钟。 經(jīng)常有香客問(wèn)我胜榔,道長(zhǎng),這世上最難降的妖魔是什么零远? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任苗分,我火速辦了婚禮厌蔽,結(jié)果婚禮上牵辣,老公的妹妹穿的比我還像新娘。我一直安慰自己奴饮,他們只是感情好纬向,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著戴卜,像睡著了一般逾条。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上投剥,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天师脂,我揣著相機(jī)與錄音,去河邊找鬼江锨。 笑死吃警,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的啄育。 我是一名探鬼主播酌心,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼挑豌!你這毒婦竟也來(lái)了安券?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤氓英,失蹤者是張志新(化名)和其女友劉穎侯勉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體铝阐,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡壳鹤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饰迹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芳誓。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡余舶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锹淌,到底是詐尸還是另有隱情匿值,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布赂摆,位于F島的核電站挟憔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏烟号。R本人自食惡果不足惜绊谭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望汪拥。 院中可真熱鬧达传,春花似錦、人聲如沸迫筑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)脯燃。三九已至搂妻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辕棚,已是汗流浹背欲主。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逝嚎,地道東北人扁瓢。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像懈糯,于是被迫代替她去往敵國(guó)和親涤妒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容