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

首頁 > 編程 > JavaScript > 正文

小程序click-scroll組件設計

2019-11-19 11:19:26
字體:
來源:轉載
供稿:網友

一. 背景

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

二. 功能

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

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

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

1.偏移量(offset dimension):

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

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

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

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

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

3.滾動大小(scroll dimension)

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

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

四. 組件設計思路

五. 使用文檔

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>

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品在线免费观看| 91国产在线精品| 久久97久久97精品免视看| 亚洲mm色国产网站| 久久国产精品久久国产精品| 日韩电影视频免费| 国产一区二区丝袜| 欧美人与性动交a欧美精品| 91精品啪在线观看麻豆免费| 欧美日韩国产中字| 国产精品福利小视频| 在线免费观看羞羞视频一区二区| 欧美电影免费观看大全| 久久九九有精品国产23| 中国日韩欧美久久久久久久久| 奇门遁甲1982国语版免费观看高清| 国语自产偷拍精品视频偷| 91精品国产777在线观看| 日韩三级成人av网| 日韩美女视频中文字幕| 久久国产精品亚洲| 91亚洲精品久久久久久久久久久久| 精品亚洲一区二区三区在线观看| 亚洲欧美国产精品久久久久久久| 韩剧1988在线观看免费完整版| 日日噜噜噜夜夜爽亚洲精品| 久久精品国产欧美亚洲人人爽| 亚洲国产精品电影在线观看| 欧美第一黄网免费网站| 国产精品爽黄69天堂a| 国产成人亚洲精品| 国产国语刺激对白av不卡| 亚洲欧美福利视频| 少妇av一区二区三区| 日韩欧亚中文在线| 中文亚洲视频在线| 国产区精品视频| 一个人看的www欧美| 欧美日韩国产成人在线观看| 欧美激情国产日韩精品一区18| 亚洲人成亚洲人成在线观看| 欧美成年人视频网站欧美| 一区三区二区视频| 国产97在线视频| 国模精品视频一区二区三区| 精品视频在线导航| 欧美裸体男粗大视频在线观看| 精品久久久久久久久久| 国产精品美女www爽爽爽视频| 91午夜理伦私人影院| 亚洲jizzjizz日本少妇| 亚洲片在线观看| 亚洲一区二区三区在线免费观看| 中文字幕日韩av电影| www.日韩av.com| 久久99久久亚洲国产| 亚洲日韩欧美视频一区| 成人免费网站在线| 一区二区欧美日韩视频| 92裸体在线视频网站| 国产精品亚洲视频在线观看| 亚洲香蕉成人av网站在线观看| 亚洲国产福利在线| 欧美极品少妇全裸体| 日韩欧美在线视频观看| 精品久久久久久国产| 高清欧美性猛交| 九九视频这里只有精品| 91精品视频一区| 国产精品www色诱视频| 亚洲国产精品久久久久| 中文字幕在线日韩| 亚洲免费高清视频| 成人久久一区二区三区| 欧洲日本亚洲国产区| 欧美日韩免费区域视频在线观看| 情事1991在线| 2019中文在线观看| 2019亚洲日韩新视频| 国产成人精品一区二区在线| 久久久久这里只有精品| 在线播放日韩专区| 日韩免费精品视频| 欧美成人小视频| 亚洲一区二区三区sesese| 欧美最顶级丰满的aⅴ艳星| 欧美精品中文字幕一区| 久久视频在线直播| 亚洲乱码一区二区| 亚洲国产日韩一区| 国产精品精品视频| 国产69精品久久久久久| 亚洲欧美一区二区三区情侣bbw| 伊人久久综合97精品| 亚洲黄色免费三级| 欧美一级淫片播放口| 国产成人精品一区二区在线| 日韩中文字幕在线免费观看| 最新的欧美黄色| 久久成人亚洲精品| 91在线视频一区| 91亚洲人电影| 97精品一区二区三区| 国产精品永久免费观看| 久久天天躁狠狠躁夜夜爽蜜月| 日本精品久久久久影院| 亚洲专区在线视频| 国语自产精品视频在免费| 欧美日韩性视频在线| 日韩网站免费观看| 91精品视频大全| 91久久久久久久久久久久久| 久久国内精品一国内精品| 91精品久久久久久久久不口人| 精品成人av一区| 国产激情999| 久久久精品国产网站| 国产精品草莓在线免费观看| 在线色欧美三级视频| 亚洲色图狂野欧美| 日韩精品高清在线观看| 中文国产成人精品久久一| 日韩av黄色在线观看| 色一情一乱一区二区| 亚洲国模精品一区| 91av在线不卡| 91精品视频一区| 91精品国产91久久久| 日韩精品视频在线免费观看| 国产精品激情自拍| 亚洲精品日产aⅴ| 日韩欧美国产高清91| 国产啪精品视频| 精品视频一区在线视频| 992tv成人免费视频| 久久在线视频在线| 亚洲人成网站999久久久综合| 精品国产老师黑色丝袜高跟鞋| 国产精品黄色av| 日韩在线www| 国产精品久久久久久网站| 国产精品成人国产乱一区| 欧美性猛交xxxx乱大交| 97视频在线观看成人| 日本精品性网站在线观看| 欧美性xxxxx极品娇小| 日韩一中文字幕| 日韩免费观看网站| 91视频国产高清| 91在线国产电影| 日韩欧美在线免费| 91影院在线免费观看视频| 在线电影中文日韩| 久久成人精品一区二区三区| 亚洲国产精品大全| 亚洲黄色片网站| 国产精品久久网| 自拍偷拍免费精品| 91理论片午午论夜理片久久| 国产日韩精品在线播放| 日韩av在线电影网| 国产精品91免费在线| 精品视频偷偷看在线观看| 国产原创欧美精品|