Vue定制尺子姚淆,支持各種自定義,使用簡單方便

看到網(wǎng)上很多關于Vue的尺子組件屡律,有一些上傳到npm官網(wǎng)的腌逢,但是使用并不方便,支持的定制化也不夠用超埋,抽空寫了一個搏讶,總體來說主要是樣式寫好,效果是基于better-scroll實現(xiàn)的霍殴,支持bounce效果媒惕,自動識別最近的刻度,只需要傳入自己的最大值和最小值来庭,就會幫你算出一個包含最大值的最大刻度吓笙,整體效果不錯关摇,由于是demo芳杏,沒有基于任何UI效果,要達到自己設計師要求的UI效果冲甘,可以將這份代碼拷貝過去自己改造定義一個尺子的Vue組件來使用尊搬,效果圖:

有點大了

頁面DOM結構如下叁鉴,樣式采用的stylus預處理語法,個人覺得stylus就是為css而生的佛寿,相比less幌墓,sass好用很多,請現(xiàn)在webpack.config.js里面配上處理stylus的規(guī)則冀泻,

<template>

? ? <div class="box">

? ? ? ? <div class="arrow">{{value}}</div>

? ? ? ? <div class="wrapper ruler">

? ? ? ? ? ? <ul ref="ul" :style="{width: ul_width + 'px'}">

? ? ? ? ? ? ? ? <li v-for="(v, i) in ruler_max_num" :key="i">

? ? ? ? ? ? ? ? ? ? <label>{{v * 10}}</label>

? ? ? ? ? ? ? ? ? ? <span v-for="(e, d) in 10" :key="d"></span>

? ? ? ? ? ? ? ? </li>

? ? ? ? ? ? </ul>

? ? ? ? </div>

? ? </div>

</template>

樣式如下:


<style lang="stylus" rel="stylesheet/stylus" scoped>

.box

? ? .arrow

? ? ? ? font-weight 500

? ? ? ? width 100%

? ? ? ? height 20px

? ? ? ? text-align center

? ? ? ? position relative

? ? ? ? top -20px

? ? ? ? &::after

? ? ? ? ? ? content ''

? ? ? ? ? ? position absolute

? ? ? ? ? ? left 50%

? ? ? ? ? ? top 110px

? ? ? ? ? ? transform translateX(-50%)

? ? ? ? ? ? border 8px solid black

? ? ? ? ? ? border-color black? transparent transparent transparent

? ? .ruler

? ? ? ? font-size 12px

? ? ? ? width 100%

? ? ? ? padding-top 100px

? ? ? ? >ul

? ? ? ? ? ? width 100%

? ? ? ? ? ? height 80px

? ? ? ? ? ? border 1px solid #ddd

? ? ? ? ? ? border-left none

? ? ? ? ? ? border-right none

? ? ? ? ? ? display flex

? ? ? ? ? ? justify-content space-between

? ? ? ? ? ? background #fff

? ? ? ? ? ? >li

? ? ? ? ? ? ? ? height 18px

? ? ? ? ? ? ? ? display flex

? ? ? ? ? ? ? ? justify-content space-between

? ? ? ? ? ? ? ? box-sizing border-box

? ? ? ? ? ? ? ? position relative

? ? ? ? ? ? ? ? &:first-child

? ? ? ? ? ? ? ? ? ? position relative

? ? ? ? ? ? ? ? ? ? &::before

? ? ? ? ? ? ? ? ? ? ? ? position absolute

? ? ? ? ? ? ? ? ? ? ? ? content ""

? ? ? ? ? ? ? ? ? ? ? ? left -1px

? ? ? ? ? ? ? ? ? ? ? ? top 0

? ? ? ? ? ? ? ? ? ? ? ? height 11px

? ? ? ? ? ? ? ? ? ? ? ? width 1px

? ? ? ? ? ? ? ? ? ? ? ? background black

? ? ? ? ? ? ? ? ? ? ? ? opacity 0.8

? ? ? ? ? ? ? ? &::after

? ? ? ? ? ? ? ? ? ? position absolute

? ? ? ? ? ? ? ? ? ? content ""

? ? ? ? ? ? ? ? ? ? right 0

? ? ? ? ? ? ? ? ? ? top 0

? ? ? ? ? ? ? ? ? ? height 15px

? ? ? ? ? ? ? ? ? ? width 1px

? ? ? ? ? ? ? ? ? ? background black

? ? ? ? ? ? ? ? >label

? ? ? ? ? ? ? ? ? ? position absolute

? ? ? ? ? ? ? ? ? ? right -6px

? ? ? ? ? ? ? ? ? ? bottom -16px

? ? ? ? ? ? ? ? >span

? ? ? ? ? ? ? ? ? ? width 10px

? ? ? ? ? ? ? ? ? ? height 11px

? ? ? ? ? ? ? ? ? ? box-sizing border-box

? ? ? ? ? ? ? ? ? ? border-right 1px solid black

? ? ? ? ? ? ? ? ? ? opacity 0.8

? ? ? ? ? ? ? ? ? ? position relative

? ? ? ? ? ? ? ? ? ? &::after

? ? ? ? ? ? ? ? ? ? ? ? position absolute

? ? ? ? ? ? ? ? ? ? ? ? content ""

? ? ? ? ? ? ? ? ? ? ? ? left 50%

? ? ? ? ? ? ? ? ? ? ? ? top 0

? ? ? ? ? ? ? ? ? ? ? ? transform translateX(-50%)

? ? ? ? ? ? ? ? ? ? ? ? height 8px

? ? ? ? ? ? ? ? ? ? ? ? width 1px

? ? ? ? ? ? ? ? ? ? ? ? background black

? ? ? ? ? ? ? ? ? ? ? ? opacity 0.5

</style>

js代碼如下:

<script>

import BScroll from 'better-scroll'

export default {

? ? props: {

? ? ? ? max_val: { // 需要

? ? ? ? ? ? type: Number,

? ? ? ? ? ? default() {

? ? ? ? ? ? ? ? return 168

? ? ? ? ? ? }

? ? ? ? },

? ? ? ? min_val: {

? ? ? ? ? ? type: Number,

? ? ? ? ? ? default() {

? ? ? ? ? ? ? ? return 0

? ? ? ? ? ? }

? ? ? ? }

? ? },

? ? data() {

? ? ? ? return {

? ? ? ? ? ? split_val: 10,

? ? ? ? ? ? value: 0

? ? ? ? }

? ? },

? ? mounted() {

? ? ? ? let ul = this.$refs.ul

? ? ? ? let lis = ul.getElementsByTagName('li')

? ? ? ? let first_li = lis[0]

? ? ? ? let last_li = lis[lis.length - 1]

? ? ? ? first_li.style.marginLeft = document.body.clientWidth/2 + 'px'

? ? ? ? last_li.style.marginRight= document.body.clientWidth/2 + 'px'

? ? ? ? this.$nextTick(()=>{

? ? ? ? ? ? let bs = new BScroll('.wrapper', {

? ? ? ? ? ? ? ? startX: 0,

? ? ? ? ? ? ? ? scrollX: true,

? ? ? ? ? ? ? ? probeType: 2,

? ? ? ? ? ? ? ? useTransition: false,

? ? ? ? ? ? ? ? bounce: true,

? ? ? ? ? ? ? ? momentum: true

? ? ? ? ? ? })

? ? ? ? ? ? bs.on('scrollEnd', ({x, y}) => {

? ? ? ? ? ? ? ? if (x > 0) {

? ? ? ? ? ? ? ? ? ? x = 0

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? this.value = -Math.round(x/10)

? ? ? ? ? ? ? ? bs.scrollTo(Math.round(x/10) * 10, 0)

? ? ? ? ? ? })

? ? ? ? })

? ? },

? ? computed: {

? ? ? ? ul_width() {

? ? ? ? ? ? return this.ruler_max_num * 10 * 10 + document.body.clientWidth?

? ? ? ? },

? ? ? ? ruler_max_num() {

? ? ? ? ? ? let split_num = Math.floor(this.max_val / this.split_val)

? ? ? ? ? ? let left_v = this.max_val % this.split_val

? ? ? ? ? ? if (left_v > 0) {

? ? ? ? ? ? ? ? split_num = split_num + 1

? ? ? ? ? ? }

? ? ? ? ? ? return split_num

? ? ? ? }

? ? }

}

</script>

基本上項目安裝好better-scroll后就可以運行起來了,

今天做了一個小小的優(yōu)化常侣,支持傳入最大值和最小值,從而只顯示這個值域段的刻度


DOM

樣式添加:

<style lang="stylus" rel="stylesheet/stylus" scoped>

.box

? ? .arrow

? ? ? ? font-weight 500

? ? ? ? width 100%

? ? ? ? height 20px

? ? ? ? text-align center

? ? ? ? position relative

? ? ? ? top -20px

? ? ? ? &::after

? ? ? ? ? ? content ''

? ? ? ? ? ? position absolute

? ? ? ? ? ? left 50%

? ? ? ? ? ? top 110px

? ? ? ? ? ? transform translateX(-50%)

? ? ? ? ? ? border 8px solid black

? ? ? ? ? ? border-color black? transparent transparent transparent

? ? .ruler

? ? ? ? font-size 12px

? ? ? ? width 100%

? ? ? ? padding-top 100px

? ? ? ? >ul

? ? ? ? ? ? width 100%

? ? ? ? ? ? height 80px

? ? ? ? ? ? border 1px solid #ddd

? ? ? ? ? ? border-left none

? ? ? ? ? ? border-right none

? ? ? ? ? ? display flex

? ? ? ? ? ? justify-content space-between

? ? ? ? ? ? background #fff

? ? ? ? ? ? >li

? ? ? ? ? ? ? ? height 18px

? ? ? ? ? ? ? ? display flex

? ? ? ? ? ? ? ? justify-content space-between

? ? ? ? ? ? ? ? box-sizing border-box

? ? ? ? ? ? ? ? position relative

? ? ? ? ? ? ? ? &:first-child

? ? ? ? ? ? ? ? ? ? position relative

? ? ? ? ? ? ? ? ? ? &::before

? ? ? ? ? ? ? ? ? ? ? ? position absolute

? ? ? ? ? ? ? ? ? ? ? ? content ""

? ? ? ? ? ? ? ? ? ? ? ? left -1px

? ? ? ? ? ? ? ? ? ? ? ? top 0

? ? ? ? ? ? ? ? ? ? ? ? height 11px

? ? ? ? ? ? ? ? ? ? ? ? width 1px

? ? ? ? ? ? ? ? ? ? ? ? background black

? ? ? ? ? ? ? ? ? ? ? ? opacity 0.8

? ? ? ? ? ? ? ? &::after

? ? ? ? ? ? ? ? ? ? position absolute

? ? ? ? ? ? ? ? ? ? content ""

? ? ? ? ? ? ? ? ? ? right 0

? ? ? ? ? ? ? ? ? ? top 0

? ? ? ? ? ? ? ? ? ? height 15px

? ? ? ? ? ? ? ? ? ? width 1px

? ? ? ? ? ? ? ? ? ? background black

? ? ? ? ? ? ? ? >label

? ? ? ? ? ? ? ? ? ? position absolute

? ? ? ? ? ? ? ? ? ? right -6px

? ? ? ? ? ? ? ? ? ? bottom -16px

? ? ? ? ? ? ? ? ? ? &.first

? ? ? ? ? ? ? ? ? ? ? ? right 100%

? ? ? ? ? ? ? ? ? ? ? ? bottom -14px

? ? ? ? ? ? ? ? ? ? ? ? margin-right -6px

? ? ? ? ? ? ? ? >span

? ? ? ? ? ? ? ? ? ? width 10px

? ? ? ? ? ? ? ? ? ? height 11px

? ? ? ? ? ? ? ? ? ? box-sizing border-box

? ? ? ? ? ? ? ? ? ? border-right 1px solid black

? ? ? ? ? ? ? ? ? ? opacity 0.8

? ? ? ? ? ? ? ? ? ? position relative

? ? ? ? ? ? ? ? ? ? &::after

? ? ? ? ? ? ? ? ? ? ? ? position absolute

? ? ? ? ? ? ? ? ? ? ? ? content ""

? ? ? ? ? ? ? ? ? ? ? ? left 50%

? ? ? ? ? ? ? ? ? ? ? ? top 0

? ? ? ? ? ? ? ? ? ? ? ? transform translateX(-50%)

? ? ? ? ? ? ? ? ? ? ? ? height 8px

? ? ? ? ? ? ? ? ? ? ? ? width 1px

? ? ? ? ? ? ? ? ? ? ? ? background black

? ? ? ? ? ? ? ? ? ? ? ? opacity 0.5

</style>

JS邏輯:

export default {

? ? props: {

? ? ? ? max_val: {

? ? ? ? ? ? type: Number,

? ? ? ? ? ? default() {

? ? ? ? ? ? ? ? return 888

? ? ? ? ? ? }

? ? ? ? },

? ? ? ? min_val: {

? ? ? ? ? ? type: Number,

? ? ? ? ? ? default() {

? ? ? ? ? ? ? ? return 666

? ? ? ? ? ? }

? ? ? ? }

? ? },

? ? data() {

? ? ? ? return {

? ? ? ? ? ? split_val: 10,

? ? ? ? ? ? value: 0,

? ? ? ? ? ? initail_val: 0

? ? ? ? }

? ? },

? ? mounted() {

? ? ? ? let ul = this.$refs.ul

? ? ? ? let lis = ul.getElementsByTagName('li')

? ? ? ? let first_li = lis[0]

? ? ? ? let last_li = lis[lis.length - 1]

? ? ? ? first_li.style.marginLeft = document.body.clientWidth/2 + 'px'

? ? ? ? last_li.style.marginRight= document.body.clientWidth/2 + 'px'

? ? ? ? this.value = this.ruler_min_num * 10

? ? ? ? this.initail_val = this.ruler_min_num * 10

? ? ? ? this.$nextTick(()=>{

? ? ? ? ? ? let bs = new BScroll('.wrapper', {

? ? ? ? ? ? ? ? startX: 0,

? ? ? ? ? ? ? ? scrollX: true,

? ? ? ? ? ? ? ? probeType: 2,

? ? ? ? ? ? ? ? useTransition: false,

? ? ? ? ? ? ? ? bounce: true,

? ? ? ? ? ? ? ? momentum: true

? ? ? ? ? ? })

? ? ? ? ? ? bs.on('scrollEnd', ({x, y}) => {

? ? ? ? ? ? ? ? if (x > 0) {

? ? ? ? ? ? ? ? ? ? x = 0

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? this.value = -Math.round(x / 10) + this.ruler_min_num * 10

? ? ? ? ? ? ? ? bs.scrollTo(Math.round(x / 10) * 10, 0)

? ? ? ? ? ? })

? ? ? ? })

? ? },

? ? computed: {

? ? ? ? ul_width() {

? ? ? ? ? ? return this.actual_num * 10 * 10 + document.body.clientWidth

? ? ? ? },

? ? ? ? ruler_max_num() {

? ? ? ? ? ? let split_num = Math.floor(this.max_val / this.split_val)

? ? ? ? ? ? let left_v = this.max_val % this.split_val

? ? ? ? ? ? if (left_v > 0) {

? ? ? ? ? ? ? ? split_num = split_num + 1

? ? ? ? ? ? }

? ? ? ? ? ? return split_num

? ? ? ? },

? ? ? ? ruler_min_num() {

? ? ? ? ? ? let split_num = Math.floor(this.min_val / this.split_val)

? ? ? ? ? ? return split_num

? ? ? ? },

? ? ? ? actual_num() {

? ? ? ? ? ? return this.ruler_max_num - this.ruler_min_num

? ? ? ? }

? ? }

}

效果圖:傳入最大值88弹渔,傳入最小值66胳施,顯示為60-90之前的尺段,提高尺子的滑動效率:


最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肢专,一起剝皮案震驚了整個濱河市舞肆,隨后出現(xiàn)的幾起案子焦辅,更是在濱河造成了極大的恐慌,老刑警劉巖椿胯,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筷登,死亡現(xiàn)場離奇詭異,居然都是意外死亡哩盲,警方通過查閱死者的電腦和手機前方,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來廉油,“玉大人镣丑,你說我怎么就攤上這事∮榱剑” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵金吗,是天一觀的道長十兢。 經(jīng)常有香客問我,道長摇庙,這世上最難降的妖魔是什么旱物? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮卫袒,結果婚禮上宵呛,老公的妹妹穿的比我還像新娘。我一直安慰自己夕凝,他們只是感情好宝穗,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著码秉,像睡著了一般逮矛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上转砖,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天须鼎,我揣著相機與錄音,去河邊找鬼府蔗。 笑死晋控,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的姓赤。 我是一名探鬼主播赡译,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼不铆!你這毒婦竟也來了捶朵?” 一聲冷哼從身側(cè)響起蜘矢,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎综看,沒想到半個月后品腹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡红碑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年舞吭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片析珊。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡羡鸥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出忠寻,到底是詐尸還是另有隱情惧浴,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布奕剃,位于F島的核電站衷旅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏纵朋。R本人自食惡果不足惜柿顶,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望操软。 院中可真熱鬧嘁锯,春花似錦、人聲如沸聂薪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽藏澳。三九已至烤低,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笆载,已是汗流浹背扑馁。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凉驻,地道東北人腻要。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像涝登,于是被迫代替她去往敵國和親雄家。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355