• 小程序 搜索历史折叠功能


    主要思路:

    const query = wx.createSelectorQuery().in(this);  方法获取dom的宽度 来计算
    通过使用一个 对比的dom让他 绝对定位于 页面之外 作为是否需要折叠的参照物。
    首先 默认为折叠状态,参照物 减去 需要显示的高度 是否大于 一个范围值 。大于 则 需要折叠;小于 则 不需要折叠 且 不需要折叠按钮
     
    html
    <view class="box">
    <view class=" showArea {{onFold ? 'search-history-wrapper' : 'search-history-wrapper-on-fold'}}">
        <view class="search-history-item" wx:for="{{ onFold ? list : onFoldList}}" wx:key="index">
            {{item}}
        </view>
        <view class="{{onFold ? 'fold' : 'off-fold'}}" wx:if="{{foldIconVisible}}" bindtap="fold"></view>
    </view>
    <!-- 用于对比的 -->
    <view class="search-history-wrapper hideArea">
        <view class="search-history-item_hidden" wx:for="{{originList}}" wx:key="index">
            {{item}}
        </view>
    </view>
    </view>

    css

    .search-history-wrapper,.search-history-wrapper-on-fold{
      /* border: 1px solid red; */
      display: flex;
      align-items: center;
      flex-wrap: wrap;
      padding: 0 32rpx;
      box-sizing: border-box;
    }
    .fold,.off-fold{
       88rpx;
      height: 58rpx;
      background-color: blue;
    }
    .off-fold{
      background-color: red;
    }
    .search-history-item,.search-history-item_hidden{
      padding: 12rpx 20rpx;
      box-sizing: border-box;
      background-color: #f0f2f4;
      border-radius: 8px;
      font-size: 24rpx;
      color: #4f5356;
      font-weight: 400;
      margin: 0 12rpx 12rpx 0;
      white-space: nowrap;
      text-overflow: ellipsis;
      overflow: hidden;
      word-break: break-all;
      max- 236rpx;
    }
    .showArea{
      height: 58rpx;
      overflow: hidden;
    }
    .search-history-wrapper-on-fold{
      height: 126rpx;
    }
    .hideArea{
      position: fixed;
      top: -100px;
    }

    JS

    const app = getApp()
    
    Page({
      data: {
        originList: ["连衣裙", "篮球鞋", "卡酷其", "阿迪王","Nike","衬衣", "Polo", "Benzene", "梅德索拉"], //请求回来的数据
        list: [], //已折叠的数据
        onFoldList: [], // 未折叠的数据
        onFold: true, //用于判断 向上 向下折叠图标
        foldIconVisible:true //折叠图标是否显示
      },
      onLoad() {
        this.checkFold()
      },
    
      async checkFold() {
        const {
          originList
        } = this.data
    
        const query = wx.createSelectorQuery().in(this);
        // 计算dom宽度
        await query
          .selectAll('.showArea,.hideArea,.search-history-item_hidden')
          .boundingClientRect((res) => {
            const maxWidth = res[0].width -32; //容器最大宽度 减去 32 是因为有左右padding
            const offFold = [...originList]; // 用于存放 已折叠 数据
            const onFold = [...originList] // 用于存放 未折叠 数据
            // 已折叠
            let offFoldWidth = 0; //统计 一行最大宽度
            let offSpliceIndex = 0; //统计出 需要 分割的 最后一个元素的下标
            // 未折叠
            let onFoldWidth = 0;
            let onSpliceIndex = 0
            // 判断是否是换行了
            if (res[1].height - res[0].height > 10) {
              // 算出 已折叠 时 第一行的数据个数 加上 折叠按钮
              for (let i = 2; i < res.length; i++) {
                // 每个元素 加 6的原因是margin-left:6
                offFoldWidth += res[i].width + 6
                // 50原因是 折叠按钮  44 + margin-left: 6
                if (maxWidth - offFoldWidth > 50) {
                  offSpliceIndex = i - 1
                }
              }
              const offFoldList = offFold.splice(0, offSpliceIndex)
    
               // 算出 未折叠 时 第一行的数据个数 加上 折叠按钮
              for (let i = 2; i < res.length; i++) {
                onFoldWidth += res[i].width + 6;
                if ((maxWidth*2) - onFoldWidth > 50) {
                  onSpliceIndex = i - 2
                }
              }
              const onFoldList = onFold.splice(0, onSpliceIndex)
              console.error("onFoldList",onFoldList)
              this.setData({
                list: offFoldList,
                onFoldList
              })
            } else {
              this.setData({
                foldIconVisible:false,
                list: originList,
              })
            }
          })
          .exec();
      },
      fold() {
        const {
          onFold,
        } = this.data
        this.setData({
          onFold: !onFold
        })
      }
    })



  • 相关阅读:
    vertical-align:middle 垂直居中无效的原因
    meta标签的使用
    异常重试框架Spring Retry实践
    springboot 整合retry(重试机制)
    Centos7-Docker1.12开启守护进程(远程调用)
    Centos7安装docker与docker-compose
    Centos 下 Jenkins2.6 + Git + Maven Shell一件部署与备份
    Docker实战
    利用 Nginx 实现限流
    Feign拦截器应用 (F版)
  • 原文地址:https://www.cnblogs.com/TreeCTJ/p/16130463.html
Copyright © 2020-2023  润新知