亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 課堂 > 小程序 > 正文

小程序click-scroll組件設計

2020-03-21 15:53:55
字體:
來源:轉載
供稿:網友

一. 背景

有些業務需求,要求前端展示的內容多時可以通過scroll的形式拖拉查看,但是太多的滾動條又造成頁面太亂,于是封裝了這個click-scroll 組件。在組件上設定好展示的位置和空間大小,在組件內部放置實際要展示的內容,實際展示的內容寬度或長或短都由此組件來控制。

二. 功能

組件內的內容寬度超過組件寬度時,組件兩側會自動出現『左右移動』交互。

當內部展示的內容超過組件的可見區域時,可以在組件的可見區域單擊拖動查看內容

三. 背景知識,元素大小的測量

1.偏移量(offset dimension):

元素在屏幕上占用的可見的所有空間,元素的可見大小由其高度、寬度決定,包括所有內邊距、滾動條和邊框大小。由四個值決定:offsetHeight、offsetWidth、offsetLeft和offsetRight。

  • offsetHeight:元素在垂直方向上占用的空間大小,以像素計。包括元素的高度、(可見)水平滾動條的高度、上邊框高度和下邊框高度。
  • offsetWidth:元素在水平方向上占用的空間大小,以像素計。包括元素的寬度、(可見)垂直滾動條的寬度、左邊框寬度和右邊框寬度。
  • offsetLeft:元素的左外邊框至包含元素的左內邊框之間的像素距離。 d.
  • offsetTop:元素的上外邊框至包含元素的上內邊框之間的像素距離。

小程序,click-scroll,組件設計

2.客戶區大?。╟lient dimension)

元素內容及其內邊距所占據空間的大小,滾動條占用的空間不計算在內。

  • clientWidth:元素內容區寬度加上左右內邊距的寬度
  • clientHeight: 元素內容區高度加上上下內邊距的高度

小程序,click-scroll,組件設計

3.滾動大小(scroll dimension)

包含滾動內容的元素的大小。

  • scrollHeight:在沒有滾動條的情況下,元素內容的實際總高度。
  • scrollWidth:在沒有滾動條的情況下,元素內容的實際總寬度。
  • scrollLeft:被隱藏在內容區域左側的像素數。通過設置這個屬性可以改變元素的滾動位置。
  • scrollTop:被隱藏在內容區域上方的像素數。通過設置這個屬性可以改變元素的滾動位置。

小程序,click-scroll,組件設計

四. 組件設計思路

小程序,click-scroll,組件設計

五. 使用文檔

slot:

 

參數 說明 類型
content 組件實際要展示的內容 dom

 

<click-scroll>  <template slot="content">    <div>      我是實際要展示的內容啊啊啊啊啊……    </div>  </template></click-scroll>

六. 組件源碼

<template> <div class="hui-hui" :id="domId.compID">  <!--向左滑動-->  <div class="hui-drag-left"     :class="{'hui-drag-action': drag.isLeft}"     v-if="drag.isShow"     @click="onClickLeft">  </div>  <!--展示的內容-->  <div :id="domId.containerID"     class="hui-container"     v-show="hasContent"     ref='container'     @mousedown="onMouseDown">   <slot name="content"></slot>  </div>  <div v-show="!hasContent" class="hui-no-data">暫無數據</div>  <!--向右滑動-->  <div class="hui-drag-right"     :class="{'hui-drag-action': drag.isRight}"     v-if="drag.isShow"     @click="onClickRight">  </div> </div></template><script>import store from '@/store'export default { name: 'cards-container', data () {  return {   hasContent: false,   domId: {    compID: `hui-comp-${+new Date()}`,    containerID: `hui-container-${+new Date()}`   },   drag: {    isShow: false,    isLeft: false,    isRight: false   }  } }, methods: {  judgeHasContent () {   this.hasContent = this.$slots.hasOwnProperty('content')  },  judgeDragIsShow () {   const compWidth = this.getCompWidth()   const contextMaxWidth = this.getContextMaxWidth()   if (compWidth >= contextMaxWidth) {    this.drag.isShow = false   } else {    this.drag.isShow = true   }   return this.drag.isShow  },  judgeIsLeft () {   const containerDom = this.getContainerDom()   const contentWidth = this.getContextMaxWidth()   if (!containerDom && !contentWidth) this.drag.isLeft = false   if (containerDom.offsetWidth + containerDom.scrollLeft >= contentWidth) {    this.drag.isLeft = false   } else {    this.drag.isLeft = true   }  },  judgeIsRight () {   const containerDom = this.getContainerDom()   if (!containerDom) this.drag.isRight = false   if (containerDom.scrollLeft === 0) {    this.drag.isRight = false   } else {    this.drag.isRight = true   }  },  getCompDom () {   return document.getElementById(this.domId.compID) || null  },  getCompWidth () {   const compDom = this.getCompDom()   if (!compDom) {    return 0   } else {    return compDom.offsetWidth   }  },  getContainerDom () {   return document.getElementById(this.domId.containerID) || null  },  getContextMaxWidth () {   if (!this.$refs.hasOwnProperty('container')) {    return 0   } else {    const widthArr = []    for(let e of this.$refs['container'].childNodes) {     widthArr.push(e.offsetWidth)    }    return Math.max(...widthArr)   }  },  onMouseDown (e) { // 手動滑動   const containerDom = this.getContainerDom()   if (!containerDom) return   let scrollLeft = containerDom.scrollLeft   const containerLeft = containerDom.offsetLeft   let ev = e || window.event   let offsetLeft = ev.clientX - containerLeft   document.onmousemove = (e) => {    let ev = e || window.event    let nowOffsetLeft = ev.clientX - containerLeft    containerDom.scrollLeft = scrollLeft + (offsetLeft - nowOffsetLeft)    this.judgeIsLeft()    this.judgeIsRight()   }   document.onmouseup = () => {    document.onmousemove = null    document.onmouseup = null   }  },  onClickLeft () { // 向左滑動   if (!this.hasContent && !this.drag.isLeft) return   const containerDom = this.getContainerDom()   if (!containerDom) return   const scrollWidth = containerDom.offsetWidth   containerDom.scrollLeft += scrollWidth   this.judgeIsLeft()   this.judgeIsRight()  },  onClickRight () { // 向右滑動   if (!this.hasContent && !this.drag.isRight) return   const containerDom = this.getContainerDom()   if (!containerDom) return   const scrollWidth = containerDom.offsetWidth   containerDom.scrollLeft -= scrollWidth   this.judgeIsLeft()   this.judgeIsRight()  } }, updated () {  this.$nextTick(() => {   this.judgeHasContent()   const isShow = this.judgeDragIsShow()   if (isShow) {    this.judgeIsLeft()    this.judgeIsRight()   }  }) }, mounted () {  this.judgeHasContent()  const isShow = this.judgeDragIsShow()  if (isShow) {   this.judgeIsLeft()   this.judgeIsRight()  } }}</script>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品视频大全| 黑人巨大精品欧美一区二区一视频| 九色精品美女在线| 亚洲小视频在线| 久久人人爽人人爽人人片av高清| 欧美一区二区三区艳史| 国产91在线高潮白浆在线观看| 麻豆乱码国产一区二区三区| 国产精品一区二区av影院萌芽| 成人黄色av网站| 精品国产999| 91综合免费在线| 国产精品一区专区欧美日韩| 97视频色精品| 91成人性视频| 欧美日韩国产综合新一区| 国产69久久精品成人| 欧美激情一区二区久久久| 国产精品免费福利| 精品中文字幕视频| 日韩欧美亚洲国产一区| 欧美成年人视频网站| 欧美精品生活片| 亚洲成年人影院在线| 国产精品wwwwww| 亚洲网址你懂得| 亚洲无亚洲人成网站77777| 在线观看欧美日韩国产| 久久香蕉精品香蕉| 国产美女精品视频免费观看| 这里只有精品视频| 国产精彩精品视频| 成人激情在线观看| 伦伦影院午夜日韩欧美限制| 国产精品香蕉国产| 亚洲综合色av| 欧美日韩亚洲天堂| 亚洲男人天堂视频| 亚洲精品美女久久| 日韩欧美亚洲范冰冰与中字| 国产精品视频久久久| www.亚洲成人| 亚洲男人天堂视频| 国产一区二区三区在线免费观看| 日韩欧美大尺度| 亚洲国产日韩欧美综合久久| 久久精品99无色码中文字幕| 欧美精品久久久久a| 欧美亚洲国产成人精品| 亚洲欧美日韩视频一区| 热门国产精品亚洲第一区在线| 久久久久在线观看| 色播久久人人爽人人爽人人片视av| 欧美做受高潮1| 伊人男人综合视频网| 最新国产精品亚洲| 色综合亚洲精品激情狠狠| 26uuu久久噜噜噜噜| 久99久在线视频| 国产丝袜一区二区| 欧美贵妇videos办公室| 7777精品视频| 国产精品露脸av在线| 亚洲乱码一区二区| 欧美黄色片在线观看| 欧美成人国产va精品日本一级| 国产精品青青在线观看爽香蕉| 欧美午夜精品久久久久久久| 欧美一区亚洲一区| 国产日韩精品电影| 韩国视频理论视频久久| 欧美日韩在线视频一区| 国产成人综合一区二区三区| 久久久中精品2020中文| 日本国产精品视频| 国产精品丝袜一区二区三区| 亚洲欧美日韩精品久久奇米色影视| 日韩视频免费大全中文字幕| 北条麻妃一区二区三区中文字幕| 中文字幕在线观看日韩| 国产精品视频免费观看www| 日韩精品在线视频观看| 国产精品久久久久久久久免费| 91免费视频国产| 欧美高清第一页| 欧美成人激情视频免费观看| 91系列在线观看| 午夜精品久久17c| 成人精品一区二区三区电影免费| 亚洲精品福利视频| 亚洲一区美女视频在线观看免费| 欧美另类交人妖| 中文字幕亚洲无线码在线一区| 国产欧美在线看| 国产精品成人久久久久| 久久久久久这里只有精品| 国产精品久久久久久久久免费| www日韩欧美| 国产欧美精品久久久| 欧洲亚洲免费在线| 久久亚洲精品国产亚洲老地址| 欧美一级在线亚洲天堂| 国产精品高潮在线| 欧美成人免费在线视频| 亚洲黄色www网站| 日本sm极度另类视频| 一区二区三区动漫| 亚洲一区二区三区四区视频| 韩剧1988在线观看免费完整版| 中文字幕欧美精品在线| 国产精品视频网| 国模吧一区二区三区| 国产精品精品久久久久久| 蜜月aⅴ免费一区二区三区| 久久精品91久久久久久再现| 国产成人精品在线播放| 亚洲高清在线观看| 国产精品日韩在线一区| 日韩av影视综合网| 久久亚洲精品一区二区| 九九精品在线视频| 51视频国产精品一区二区| 日本精品中文字幕| 日韩中文字幕免费视频| 日韩欧美国产骚| 激情av一区二区| 国产欧美日韩精品专区| 欧美视频在线观看 亚洲欧| 亚洲成人av片在线观看| 久久成人精品视频| 中文字幕久久久| 亚洲精品视频久久| 日韩激情在线视频| 欧美国产日韩一区二区| 亚洲欧美精品中文字幕在线| 成人情趣片在线观看免费| 欧美日韩国产精品一区二区三区四区| 国内免费久久久久久久久久久| 亚洲视频在线观看视频| 亚洲国产精品久久| 亚洲电影成人av99爱色| 欧美重口另类videos人妖| 国产欧美日韩免费看aⅴ视频| 亚洲欧美精品中文字幕在线| 国产亚洲精品久久| 久久亚洲综合国产精品99麻豆精品福利| 国产婷婷成人久久av免费高清| 亚洲欧美成人一区二区在线电影| 成人午夜在线观看| 国产欧美日韩中文字幕| 国产欧美一区二区三区久久人妖| 欧美午夜久久久| 亚洲高清一区二| 在线国产精品播放| 久热精品视频在线免费观看| 成人激情视频小说免费下载| 最新中文字幕亚洲| 97视频免费看| 欧美日韩日本国产| 91久久久久久久一区二区| 97视频在线观看免费高清完整版在线观看| 国产大片精品免费永久看nba| 日韩在线中文视频| 5566成人精品视频免费|