首页 > 其他分享 >滚动对话框内容,已打开的下拉框超出对话框范围显示

滚动对话框内容,已打开的下拉框超出对话框范围显示

时间:2023-11-20 10:34:00浏览次数:34  
标签:el 滚动 对话框 scrollView 下拉框 隐藏

问题场景

点击对话框内的下拉框,显示下拉列表,纵向滚动对话框内容,已经打开的下拉列表,超出对话框范围仍然显示。

image

分析

下拉框列表消失的条件是下拉框失焦。

因此,有三种解决方案:

  1. 给对话框设置样式:下拉框超出对话框范围就隐藏;
  2. 给对话框内的下拉框设置:若滚动对话框,则让下拉框失焦,即关闭已打开的下拉框;
  3. 滚动对话框,若滚动的距离超出一定范围,就设置下拉框列表样式为隐藏。

解决

这里采用了第三种方案。因为二次封装了对话框组件 DialogBox,就直接给 DialogBox 对话框设置隐藏下拉框列表。

  computed: {
    // 滚动的视图范围
    scrollView() {
      const el = document.getElementsByClassName("el-dialog__body");
      return el.length ? el[0] : null;
    },
    // 下拉框对象
    selectObj() {
      let result = {
        "el-autocomplete-suggestion": null,
        "el-select-dropdown": null,
      };
      if (!this.scrollView) {
        return result;
      } else {
        Object.keys(result).forEach((key) => {
          result[key] = this.scrollView.getElementsByClassName(key);
        });
        return result;
      }
    },
  },
  created() {
    this.$nextTick(() => {
      // 开始监听
      document.addEventListener("scroll", this.handleScroll, true);
    });
  },
  methods: {
    // 滚动对话框时,隐藏下拉框
    handleScroll() {
      let contentHeight = this.scrollView.scrollHeight;
      let gridHeight = this.scrollView.clientHeight;
      let scrollDistance = this.scrollView.scrollTop;
      // console.log({ contentHeight }, { gridHeight }, { scrollDistance });
      // 滚动距离超出盒子高度,则隐藏下拉框
      if (scrollDistance >= gridHeight) {
        Object.keys(this.selectObj).forEach((key) => {
          if (!this.selectObj[key]) return;
          for (let item of this.selectObj[key]) {
            item.style.display = "none";
          }
        });
      }
    },
    handleClose() {
      if (!this.scrollView) return;
      // 移除监听
      this.scrollView.removeEventListener("scroll", this.handleScroll, true);
      this.$emit("close-dialog");
    },
   }

弊端

上述代码,滚动距离超出盒子高度,则隐藏下拉框。有两个弊端:

  1. 滚动距离小于盒子高度时:但打开的下拉框位于对话框顶部,此时应该隐藏下拉框,却没有隐藏。
    image

  2. 滚动距离大于盒子高度时:打开下拉框,只要再滚动一下,下拉框就会隐藏,交互操作有些突兀。
    image

改进

方案一:监听对话框滚动,只要一滚动,就隐藏下拉框;

方案二:监听下拉框是否在对话框的显示范围内,只要一超出,就隐藏下拉框;

方案三:设置超出对话框显示范围的下拉框隐藏。

参考链接

  1. 通过自定义指令,解决弹窗内容滚动时el-select下拉框,超出显示范围问题.
  2. 如何强制让element下拉框失去焦点
  3. el-select 组件失去焦点

标签:el,滚动,对话框,scrollView,下拉框,隐藏
From: https://www.cnblogs.com/shayloyuki/p/17843305.html

相关文章

  • Flutter实现文字的跑马灯滚动显示
    如果你想实现自动滚动,显示完毕后等待1秒钟再次开始自动滚动,可以使用Marquee这个库,它专门用于实现文本的滚动效果。首先,你需要在pubspec.yaml文件中添加marquee依赖:dependencies:marquee:^1.0.3然后运行flutterpackagesget命令以安装依赖项。接下来,使用Marquee组......
  • vue3+element-Plus表格滚动联动
    constTable0=ref()constTable1=ref()functionsyncScroll(){for(leti=0;i<compareData.compareInfo.length;i++){letfirstTable=Table0.value[i].$refs.bodyWrapper.getElementsByClassName('el-scrollbar__wrap')[0]letsec......
  • 第10章 Qt 对话框--实现浏览器和用户的交流
    Qt对话框--实现浏览器和用户的交流用户登录窗口--升级为模态对话框这里不是转到槽而是点击信号槽方法,转到槽是自己编写代码反应的逻辑浏览器用户登录窗口与主窗口切换导入对应的指针按照需求绑定退出的信号,为上传功能添加标准对话框本章小结......
  • element中select组件加入滚动分页及模糊查询
    element中select组件加入滚动分页及模糊查询1.directive.js-自定义vue指令importVuefrom'vue'exportdefault()=>{Vue.directive('loadMore',{bind(el,binding){//如上图,我通过v-if来控制了两个select框,当没有binding.arg这个参数时,我只能监听到企......
  • 一个很基础的虚拟滚动
    由于项目中要写一个虚拟滚动,但不能下插件,所以就手写实现了一版,很基础。主要难点是要动态计算第几屏主要思想是算出真实高度是滚动高度的几倍,然后*100,在用视口已滚动的最大页数*这个倍数在除以这个倍数不理解这个逻辑如果不考虑精度也可以通过滚动的真实距离除以视口大小,来计......
  • 解决复制select下拉框时 值没法复制的问题
     tip:当选择下拉框某个值时,f12查看到的option并没有自动添加selected属性,所以复制时下拉框的值没法复制的,这时需要clone函数来复制并通过循环原来的select复制选中的值 <inputtype='button'value='复制'  onclick='copyRow(this)'/>//复制当前行,dom元素的复制,不会刷新当前页......
  • 短视频app源码,自定义快速滚动条FastScrollBar
    短视频app源码,自定义快速滚动条FastScrollBarAndroidMainfest.xml中  <activityandroid:name=".MainActivity"      android:theme="@style/FastScrollTheme">      <intent-filter>        <actionandroid:name="androi......
  • element中的el-select下拉框多选显示的tags文本内容过长导致显示溢出框外
      /*select多选tags超出省略显示*/.el-select__tags-text{ display:inline-block; max-width:60px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;}.el-select.el-tag__close.el-icon-close{ top:-7px;}......
  • layui动态生成下拉框不可见
    今天发现动态生成表单元素的过程中其余标签都可见唯独下拉框无效,如下图所示后我查阅相关资料发现,对于动态生成的html元素layui需要再次手动渲染layui.use('form',function(){varform=layui.form;//只有执行了这一步,部分表单元素才会自动修饰成功//……//但......
  • 基于React使用swiperjs实现竖向滚动自动轮播
    很多文章,都只提供了js部分,包括官方的文档也只有js部分,如果css设置不正确,会导致轮播图不自动播放。使用的swiper版本:v11.0.3文档https://swiperjs.com/get-startedhttps://swiperjs.com/react实现效果使用vite创建react应用pnpmcreatevitereact-app--templatereact完整依赖pac......