翻页

499 阅读2分钟

产品需求: 普通的大框里面放不定的小框,两行排列,左右翻页


  • 思想: position: relative; left: xx;
  • 确定的参数:
  • 外框的宽高:展示给用户看到的界面
  • 内框的宽高:放所有数据的容器
  • 展示的数据:
  • 每一页展示的最大个数 = Math.floor((大框的宽 - padding) / (小框的宽+小框padding)) * 列数
  • 总页数 = Math.ceil(总数据 / 每一页最大个数)
  • 最后一页数据 = 总数据 % 总页数(分有无余数)
  • 其他普通页的数据 = Math.floor((总数据 - 最后一页的数据) / (总页数 - 1))
  • 其他:上一页,下一页,到顶显示不能点击
  • Vue.js框架

  • template页面
// JcontainerDomWidth 大屏的宽度  JcontainerDomLeft 相对定位left
 <div class="work-container" id="JContainer" :style="{width: JcontainerDomWidth, left: JcontainerDomLeft}">
        <!-- 设想这是一屏的值 -->
        // pageScroll 总数据
        <ul class="box" :style="{width: boxWidth}" v-for="i in pageScroll" :key="i">
            // workTeamFilter(i) 根据index值筛选应该在本页显示的数据
            <li class="block" v-for="(itemChild, index) in workTeamFilter(i)" :key="index"
            @click="workTeamChange(i, index)" :class="{active: boxSelected === (i-1)*currentPageNumber+index}">
            // 点击选中高亮
            // 包含的业务代码
                <img :src="itemChild.headPortraits" alt="" class="left">
                <div class="right">
                  <p class="row-01">xxx:<span class="index-num">{{itemChild.exponent}}</span> </p>
                  <p class="row-02">{{itemChild.name}}</p>
                  <p class="row-03"><span class="state">当前状态</span> <span class="next" v-if="itemChild.subordinate" @click="nextLevelClick(itemChild.workstationId)">下一级</span></p>
                </div>
            </li>
        </ul>
</div>

  • 展示数据
  pageNumber () {
      let fixedWidth = document.getElementById('Jcontractor')
      // 计算: Math.ceil(数组个数 / (可视窗口/250+padding左右 * 2行))
      let ramainder
      let page
      let number
      let length = this.formInstallTab.workTeam.length
      let imageNumber = Math.floor((fixedWidth.clientWidth-this.padding)/(250+this.padding))*2
      if(fixedWidth) {
        ramainder = Math.ceil(length%imageNumber) // 余数 就是最后一页的个数
        page = Math.ceil(length/imageNumber) // 总页数
      }
      this.pageScroll = page
      // 有余数的情况
      if (page > 1 && ramainder === 0) {
        number = Math.floor((length) / page)
        ramainder = number
      } else if (length > ramainder) {
        number = Math.floor((length - ramainder) / (page - 1)) // 其他页数的个数
      } else {
        // 当只有一页时
        number = 1
      }
      return [ramainder, page, number]
    },

  • 根据窗口大小动态变化
  watch: {
    // 业务中的折叠
    obj () {
      // 点击折叠面板时的重新计算
      this.initScroll()
    },
    currentPos (val) {
    // 左右页面的禁用
      this.btnDisable()
    }
  },
  • 根据个数筛选
   workTeamFilter (i) {
      let [ramainder, page, number] = this.pageNumber()
      let arr = this.formInstallTab.workTeam.filter((item, index) => {
        // 最后一页
        if (i === page) {
          return index >= number * (page - 1)
        } else { // 其他页正常的个数
          let ifgt = index < i * number
          let iflt = index >= (i - 1) * number
          return ifgt && iflt
        }
      })
      console.log([ramainder, page, number], '[ramainder, page, number]')
      console.log(arr, 'arr')
      return arr
    },

  • 其他
   prevClick () {
      let fixedWidth = document.getElementById('Jcontractor').clientWidth
      let prevBtnDom = document.getElementsByClassName('prev-btn')[0]
      console.log(this.currentPos, 'currentPos')
      if (this.currentPos <= 0) {
        return
      } else {
        this.currentPos-=1
        this.JcontainerDomLeft = -fixedWidth * this.currentPos + 'px'
      }
    },
    btnDisable () {
      let boxDom = document.getElementsByClassName('box')
      this.currentPos > 0 ? (this.prevDisabled = false) : (this.prevDisabled = true)
      this.currentPos < this.pageScroll - 1 ? (this.nextDisabled = false) : (this.nextDisabled = true)
      this.showPageNumber()
    },

简单记录