左右联动布局效果

news2024/11/24 2:36:19

 效果图:

<template>
  <el-dialog :modelValue="modelValue" :before-close="close" fullscreen :close-on-click-modal="false">
    <div class="farmer_detail">
      <div class="info_content">
        <div class="info_left">
          <!-- @click.native="stepClick(item, key)" -->
          <el-tabs tab-position="left" class="demo_tab_farmer_pop" v-model="activeStep" @tab-click="stepClick">
            <el-tab-pane :label="item.title" :name="key" v-for="(item, key) in stepList" :key="key">
              <template #label>
                <span class="custom_label">
                  <span>{{ item.title }}</span>
                </span>
              </template>
            </el-tab-pane>
          </el-tabs>
        </div>
        <div class="info_right" ref="rightRef">
          <el-scrollbar :height="calcScrollHeight + 'px'" ref="scrollMenuRef" @scroll="onScroll" @wheel="handleWheel">
            <!-- <p v-for="item in 20" :key="item" class="scrollbar-demo-item">{{ item }}</p> -->
            <div class="scroll_container" ref="right" id="scrollContent">
              <el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="130px">
                <div class="scroll_content">
                  <div class="info_title" id="JCxx">基础信息</div>
                  <el-row :gutter="20">
                    <el-col :xs="colSpan.xs" :sm="colSpan.sm" :md="colSpan.md" :lg="colSpan.lg" :xl="colSpan.xl">
                      <el-form-item prop='realName' label='姓名'>
                        <el-input v-model="ruleForm.realName" placeholder="请输入姓名" :disabled='isEdit' clearable
                          style='width:100%;'></el-input>
                      </el-form-item>
                    </el-col>
                    <el-col :xs="colSpan.xs" :sm="colSpan.sm" :md="colSpan.md" :lg="colSpan.lg" :xl="colSpan.xl">
                      <el-form-item prop='paperNumber' label='身份证号'>
                        <el-input v-model="ruleForm.paperNumber" placeholder="请输入身份证号" :disabled='isEdit' clearable
                          style='width:100%;'></el-input>
                      </el-form-item>
                    </el-col>
                    <el-col :xs="colSpan.xs" :sm="colSpan.sm" :md="colSpan.md" :lg="colSpan.lg" :xl="colSpan.xl">
                      <el-form-item prop='gender' label='性别'>
                        <selectOption v-model="ruleForm.gender" placeholder="请选择性别" :disabled="isEdit"
                          :optionList="genderList" clearable>
                        </selectOption>
                      </el-form-item>
                    </el-col>
                  </el-row>
                </div>
                <div class="scroll_content">
                  <div class="info_title" id="ZZxx">组织信息</div>
                  <el-row>
                    <el-col :xs="colSpan.xs" :sm="colSpan.sm" :md="colSpan.md" :lg="colSpan.lg" :xl="colSpan.xl">
                      <el-form-item label="担任职务" prop="holdType">
                        <selectOption v-model="ruleForm.holdType" placeholder="请选择担任职务" :disabled="isEdit"
                          :multiple="false" :collapseTags="true" typeCode="new_has_job" clearable>
                        </selectOption>
                      </el-form-item>
                    </el-col>
                  </el-row>
                </div>
                <div class="scroll_content">
                  <div class="info_title" id="JYxx">教育与社会信息</div>
                  <el-row>
                    <el-col :xs="colSpan.xs" :sm="colSpan.sm" :md="colSpan.md" :lg="colSpan.lg" :xl="colSpan.xl">
                      <el-form-item prop='school' label='毕业院校'>
                        <el-input v-model="ruleForm.school" placeholder="" :disabled='isEdit' clearable
                          style='width:100%;'></el-input>
                      </el-form-item>
                    </el-col>
                  </el-row>
                </div>
              <div class="scroll_content">
                <div class="info_title" id="ZCxx">资产信息</div>
                <div>
                  <CusTable ref="zcTableRef" :column="zcColumnTD" :tableData="zcTableDataTD" title="土地信息">
                    <span slot="title">土地信息(7块,3.68亩)</span>
                  </CusTable>
                </div>
              </div>

              <div class="scroll_content">
                <div class="info_title" id="BTxx">补贴信息</div>
                <CusTable ref="btTableRef" :column="btColumn" :tableData="btTableData" title="补贴信息(7项)">
                  <span slot="title">补贴信息(7项)</span>
                </CusTable>
                <!-- 补贴信息 -->
              </div>
          <div class="info_title" id="XYxx">信用评价</div> -->
            </div>
          </el-scrollbar>
        </div>
      </div>
      <!-- </el-card> -->
    </div>
    <template #footer>
      <el-button type="default" @click="close">取 消</el-button>
      <el-button type="primary" @click="submit(ruleFormRef)" v-if="!btnShow">
        确 认
      </el-button>
    </template>
  </el-dialog>
</template>



const stepList = ref([
  { title: '基础信息', id: 'JCxx' },
....
  { title: '资产信息', id: 'ZCxx' },
  { title: '补贴信息', id: 'BTxx' },
  { title: '信用评价', id: 'XYxx' }])

const scrollMenuRef = ref(null)
//计算右侧可滚动区域高度
const calcScrollHeight = computed(() => clientHeight.value - 390)
const clientHeight: any = ref(document.documentElement.clientHeight || document.body.clientHeight)
watch(clientHeight, (newVal, oldVal) => {
  return newVal
})
let right = ref(null); // 右边 列表盒子
onMounted(() => {
  window.onresize = () => {
    clientHeight.value = `${document.documentElement.clientHeight}`;
  }
})



const stepTag = ref(1) //标识是点击滚动还是滚轮滑动滚动
const rightRef = ref()

//点击滚动  //待完善功能是否到底部不可点击或者滚动
const stepClick = (item: any, index: number) => {
  let ind = Number(item.index)
  var id = "#" + stepList.value[ind].id
  stepTag.value = 1
  if (activeStep.value - ind == 0) return
  activeStep.value = ind
  //监听滚动条是否到底部
  const curDom: any = document.querySelector(id);
  const dom: any = document.getElementById('scrollContent');
  if (curDom) {
    document.querySelector(id).scrollIntoView({
      behavior: "smooth",
      block: "start",
      inline: "nearest",
    });
  }
}

//右侧内容滚动方法
const onScroll = (e:any) => {
  if (stepTag.value == 1) return
  let scrollItems: any = document.querySelectorAll(".scroll_content");
  // console.log(e, scrollItems,scrollItems[0].offsetTop,'ee')
  for (let i = scrollItems.length - 1; i >= 0; i--) {
    // 判断滚动条滚动距离是否大于当前滚动项可滚动距离 e.target.scrollTop
    let judge = e.scrollTop >= scrollItems[i].offsetTop - 100 - scrollItems[0].offsetTop;
    if (judge) {
      activeStep.value = i;
      break;
    }
  }
}
// 是否是右侧滚动
const handleWheel = (e) => {
  stepTag.value = 0
}

<style lang="scss" scoped>
.farmer_detail {
  .img_box {
    height: 200px;
    text-align: center;

    .user_name {
      padding-top: 10px;
      font-size: 18px;
    }

    .block {
      .btn_back {
        float: right;
      }
    }
  }

  .info_content {
    display: flex;
    position: relative;
    // width: 100%;
    justify-content: flex-end;



    .info_left {
      width: 300px;

      .demo_tab_farmer_pop {
        >:deep(.el-tabs__header) {
          .el-tabs__item {
            // width:244px;
            padding-right: 60px;
            height: 60px;
            line-height: 60px;
            font-size: 18px;
            transition: background-color .3s ease-in-out;
          }

          .el-tabs__nav-wrap::after {
            background-color: #ECF3FF;
          }

          .el-tabs__nav-wrap,
          .el-tabs__nav-scroll {
            overflow: visible;
          }

          .el-tabs__item.is-active {
            background-color: #ECF3FF;

          }

          .el-tabs__item::after {
            content: "";
            position: absolute;
            right: -4px;
            bottom: 25px;
            width: 10px;
            height: 10px;
            box-sizing: border-box;
            border: 1px solid #CCCCCC;
            background: #FFFFFF;
            border-radius: 50%;
          }

          .el-tabs__active-bar.is-left {
            width: 10px;
            height: 10px !important;
            border-radius: 50%;
            background-color: #2F71F5;
            top: 25px;
            right: -4px;
          }

        }
      }
    }

    .info_right {
      flex: 1;

      // width: calc(100% - 200px);
      overflow-y: auto;

      .scroll_container {
        padding-right: 20px;
      }

      .info_title {
        display: flex;
        align-items: center;
        margin: 20px 0;
        font-size: 18px;
        font-weight: 700;
      }

      .info_title:first-child {
        margin-top: 0;
      }
    }
  }
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1457655.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32入门教程:新建工程

本博文是基于建立好STM32的keil5软件后建立工程&#xff0c;如果还没下载软件建议先下载好该软件&#xff0c;在 B站江科大32教学有&#xff0c;并把相关文件下好。 STM32的开发方式有&#xff1a;基于寄存器的方式&#xff0c;基于标准库也就是库函数的方式&#xff0c;基于…

MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案

项目场景 有时候&#xff0c;遇到数据库重复数据&#xff0c;需要将数据进行分组&#xff0c;并取出其中一条来展示&#xff0c;这时就需要用到group by语句。 但是&#xff0c;如果mysql是高版本&#xff0c;当执行group by时&#xff0c;select的字段不属于group by的字段的…

NLP_BERT与GPT争锋

文章目录 介绍小结 介绍 在开始训练GPT之前&#xff0c;我们先比较一下BERT和 GPT 这两种基于 Transformer 的预训练模型结构&#xff0c;找出它们的异同。 Transformer架构被提出后不久&#xff0c;一大批基于这个架构的预训练模型就如雨后春笋般地出现了。其中最重要、影响…

【PHP】web服务器支持PHP_环境配置

一、PHP运行目前为止主要有4方式 &#xff08;1&#xff09;以模块加载的方式运行&#xff0c;初学者可能不容易理解&#xff0c;其实就是将PHP集成到Apache服务器&#xff0c; 以同一个进程运行。 &#xff08;2&#xff09;以CGI的方式运行&#xff0c;CGI英文叫…

【MATLAB】BiGRU神经网络回归预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 BiGRU神经网络回归预测算法是一种基于双向门控循环单元&#xff08;GRU&#xff09;的多变量时间序列预测方法。该方法结合了双向模型和门控机制&#xff0c;旨在有效地捕捉时间序列数据中…

两个发散级数的和是否发散?

1、两个发散级数的和可能是收敛的也可能是发散的。 例子&#xff1a; 发散级数 ∑ 1 n \sum\frac{1}{n} ∑n1​和发散级数 ∑ ( 1 n 2 − 1 n ) \sum(\frac{1}{n^{2}}-\frac{1}{n}) ∑(n21​−n1​)的和是收敛级数&#xff1b; 发散级数∑(1/n) 和发散级数 ∑(1/n1/n) 的和是…

HarmonyOS 鸿蒙应用开发(十一、面向鸿蒙开发的JavaScript基础)

ArkTS 是HarmonyOS&#xff08;鸿蒙操作系统&#xff09;原生应用开发的首选语言。它是用于构建用户界面的一种TypeScript方言&#xff0c;扩展了TypeScript以适应HarmonyOS生态系统的UI开发需求。ArkTS 融合了TypeScript的静态类型系统和现代UI框架的设计理念&#xff0c;为开…

Redis 缓存(Cache)

什么是缓存 缓存(cache)是计算机中的一个经典的概念在很多场景中都会涉及到。 核心思路就是把一些常用的数据放到触手可及(访问速度更快)的地方&#xff0c;方便随时读取。 这里所说的“触手可及”是个相对的概念 我们知道&#xff0c;对于硬件的访问速度来说&#xff0c;通常…

通过VSCode开发Python项目

一、插件准备 Python 插件&#xff0c;必须 autoDocstring 生成注释&#xff0c;和Pycharm一样输入三个引号"""会生产注释结构 Todo Tree 高亮显示 TODO/FIXME 二、python相关设置 一&#xff09;设置python环境 按"F1"打开命令面板&#xff08;…

19. 【Linux教程】nano 编辑器

前面小节介绍了如何使用 vim 编辑器&#xff0c;相比于 vim 编辑器&#xff0c;nano 编辑器就比较简单了。nano 是 UNIX 系统中的一个文本编辑器&#xff0c;大部分 Linux 发行版本默认都安装了 nano 文本编辑器。 和 vim 编辑器相比&#xff0c;nano 编辑器就没有那么强大&am…

centos7 arm服务器编译安装onnxruntime-gpu

前言 ONNX Runtime是适用于Linux,Windows和Mac上ONNX格式的机器学习模型的高性能推理引擎,但在arm服务器上,onnxruntime只有CPU版的,GPU版的没有,因此需要自行去编译GPU版本的才可以。 环境准备 1、python3.8 2、cmake:2.26.0版本以上,可以直接下载aarch64版本的进行…

LeetCode42.接雨水(单调栈)

题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 &#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,…

​中国手游发行商收入TOP30!

SensorTower 数据 2024年1月中国手游发行商&#xff0c;全球多款游戏在收入和用户增长方面取得的显著成绩。 1. 中国手游发行商全球表现&#xff1a;2024年1月&#xff0c;共有38个中国厂商入围全球手游发行商收入榜TOP100&#xff0c;合计收入达到19.6亿美元&#xff0c;占榜单…

PDF控件Spire.PDF for .NET【安全】演示:如何在 PDF 中添加签名字段

Spire.PDF for .NET 是一款独立 PDF 控件&#xff0c;用于 .NET 程序中创建、编辑和操作 PDF 文档。使用 Spire.PDF 类库&#xff0c;开发人员可以新建一个 PDF 文档或者对现有的 PDF 文档进行处理&#xff0c;且无需安装 Adobe Acrobat。 E-iceblue 功能类库Spire 系列文档处…

mysql mgr集群部署

一、前言 mysql mgr集群是为了实现mysql高可用&#xff0c;分为单主集群和多主集群&#xff0c;单主集群只有一个主节点可写&#xff0c;节点发生故障时&#xff0c;自动进行主从的故障切换&#xff0c;多主集群所有节点都可写&#xff0c;当节点发生故障时&#xff0c;将故障节…

【RPG Maker MV 仿新仙剑 战斗场景UI (二)】

RPG Maker MV 仿新仙剑 战斗场景UI 二 战斗指令菜单原仙剑战斗指令图RMMV战斗指令对应代码战斗指令菜单代码效果 战斗指令菜单 原仙剑战斗指令菜单是使用方向键控制&#xff0c;同时按照使用情况正好对应四个指令和四个方向&#xff0c;同时没有选中的菜单用黑色透明图片覆盖&…

层级关联,审批人功能

一个需求要求选择一级&#xff0c;下方展示一级的效果 后端给了审批人数据&#xff0c;但是数据需要单独处理 <template><div class"box"><el-form :model"ruleForm" :rules"rules" ref"ruleForm" label-width"…

【鸿蒙系统学习笔记】ArkTS开发语言

一、背景 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集。 二、基本语法 2.1、基本语法介绍 ArkTS的基本组成&#xff0c;资料来自…

【洛谷题解】P8627 [蓝桥杯 2015 省 A] 饮料换购

题目链接&#xff1a;[蓝桥杯 2015 省 A] 饮料换购 - 洛谷 题目难度&#xff1a;普及- 涉及知识点&#xff1a;换购 题意&#xff1a; 分析&#xff1a;一直换购直至瓶盖数<3为只 AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int main() {i…

极其抽象的SpringSecurity理解

原始&#xff1a;A → B Security&#xff1a;A → S → B 太抽象了&#xff0c;看不懂啊T_T 抽象故事 故事大概&#xff1a;C是一个大区&#xff0c;拥有巨大的火力&#xff08;C准备联合B吞并掉A&#xff09;&#xff0c;A得到了这个消息&#xff0c;…