深入探索 Element UI:自定义滚动条与弹出层管理的技巧

简介: 在这篇博客中,我们将深入探讨 Element UI 中的自定义滚动条及弹出层管理技巧。文章详细介绍了 el-scrollbar 组件的使用和参数设置,以及 PopupManager 如何有效管理弹出层的 z-index。我们还将探讨如何实现灵活的全屏组件,利用 vue-popper 创建自定义弹出层,最后介绍 ClickOutside 指令的用法。这些高级技巧将帮助你提升 Element UI 应用程序的用户体验与交互灵活性。

el-scrollbar滚动条

参数 说明 类型 可选值
native 是否采用原生滚动。即只是隐藏原生滚动条,但并没有使用自定义的滚动条) Boolean -
wrapStyle 容器样式 Object -
wrapClass 容器样式名 Object -
viewClass 展示视图的样式名 Object -
viewStyle 展示视图的样式 Object -
noresize 容器大小是否不可变。如果 container 尺寸不会发生变化,最好设置它可以优化性能 Boolean -
tag 渲染容器的标签view容器用那种标签渲染,默认为div String -

自定义滚动条的原理

scrollbar

warp:滚动的可显示区域,滚动内容就是在这个区域中滚动;

view:实际的滚动内容,超出warp可显示区域的内容将被隐藏;

track:滚动条的滚动滑块;

thumb:上下滚动的轨迹。

<el-scrollbar>
    <li v-for="user in userList" :key="user.id">{
  {user.name}}</li>
</el-scrollbar>

管理弹出层的z-indexPopupManager

ElementUI的弹出层在元素定位上,都有两种实现方式,分别是:

  • append-to-body:此模式下,弹出层会被放在<body>元素上,通过position: fixed定位,配合动态的topleft属性,完成弹出元素的定位。
  • append-to-body:此模式下,弹出层通过position: absolute定位,配合其父元素position: relative来完成弹出元素的定位。

在大多数情况下,ElementUI都是默认使用append-to-body,因为非append-to-body存在严重副作用,只有迫不得已的情况下才需要使用。

具体有什么副作用,可以把你们的理解打在评论区。

ElementUI弹出层的核心实现机制:
只要让新出现的弹出层,永远比之前所有弹出层的层级要高,就不会有新弹层旧弹层遮盖的事情发生。

PopupManager:为弹出层提供获取实例、注册、注销等各种能力,但其最重要的能力,是提供了z-index的层级管理能力。

ElementUI为其内置了一个弹出层z-index基数(2000),但可以进行修改。

// 修改弹出层的`z-index`从3000开始递增
Vue.use(Element, {
    zIndex: 3000})
<template>
  <div class="container">
    <el-button @click="onClick">增加</el-button>
    z-index: {
  { value }} 
  </div>
</template>
<script>
import { PopupManager } from 'element-ui/src/utils/popup'
export default {
  data() {
    return {
      value: 0
    }
  },
  methods: {
    onClick() {
      // 使用
      this.value = PopupManager.nextZIndex()
    }
  }
}
</script>

实战:一个更灵活的全屏组件

众所周知,浏览器是有官方的全屏API的:Element.requestFullscreen(),它可以让一个元素立刻铺满视窗,并且置于所有元素之上。官方全屏是设定层级高于一切,那些append-to-body的弹窗,无论z-index多高,也绝对不会被显示出来。而那些非append-to-body模式的弹出层,确实会在某些业务场景不符合要求。

符合ElementUI层级标准的全屏组件

和浏览器官方API实现全屏的思路基本一致,但不同的地方在于:

  • 官方全屏会默认置顶,z-index无限大;
  • 封装的全屏组件,z-index符合PopupManager管家的规范。

简易Demo

<template>
    <div :class="{ 'custom-full-screen': isFullScreen }" :style="{zIndex: currentZIndex}">
      <slot></slot>
    </div>
    </template>
<script>
import { PopupManager } from 'element-ui/src/utils/popup'

export default {
  data() {
    return {
      isFullScreen: false,
      currentZIndex: null
    }
  },
  methods: {
    request() {
      this.isFullScreen = true
      this.currentZIndex = PopupManager.nextZIndex()
    }
  }
}
</script>
<style>
.custom-full-screen {
  position: fixed !important;
  top: 0 !important;
  left: 0 !important;
  right: 0 !important;
  bottom: 0 !important;
  width: 100% !important;
  height: 100% !important;
}
</style>

万能弹出组件:vue-popper

ElementUI中的大部分弹出层都是基于vue-popper组件来实现的。比如selectdata-pickercascaderdropdownpopvertooltip等。

如何使用vue-popper

通常来说,它的主要用法是混入(mixins)

可以参考ElementUI select-dropdown中对它的具体使用。

实战:完全自定义的弹出层

  1. 引入vue-popper,在模板中引入该组件,并定义一个弹出层元素,一个定位元素。

    <template>
      <!-- 定位元素 -->
      <div class="custom-picker">
        <!-- vue-popper组件 -->
        <Popper ref="popper" v-model="showPopper"></Popper>
        <!-- 弹出组件 -->
        <div ref="fly-piece" v-show="showPopper" class="custom-picker__popper">弹出内容</div>
      </div>
    </template>
    <script>
    // 引入vue-popper组件
    import Popper from 'element-ui/src/utils/vue-popper';
    
    export default {
      components: {
        Popper
      },
      data() {
        return {
          // 双向绑定,控制弹出层是否弹出
          showPopper: false
        },
      },
    }
    </script>
    
  1. vue-popper实例指定弹出层定位层

    mounted() {
      this.$refs.popper.popperElm = this.$refs['fly-piece'];
      this.$refs.popper.referenceElm = this.$el;
    }
    
  1. 通过控制vue-popperprops.value来控制是否弹出。

    this.showPopper = !this.showPopper
    

2023.10.08更新~


ClickOutside

ClickOutsideElementUI实现的一个自定义指令,顾名思义,就是点击元素外面才会触发的事件。ElementUI中的selectdropdownpopver等组件都用到该指令。

<template>
    <div v-clickoutside="handleClose" v-show="flag"></div>
</template>
<script>
import Clickoutside from "element-ui/src/utils/clickoutside"
export default{
    data(){
        return {
            flag: true
        }
    },
    directives: { Clickoutside },
    methods: {
        handleClose(){
            this.flag = false;
        }
    }
}    
</script>

GIF 8-10-2023

通过掌握这些高级技巧和窍门,你可以更好地定制和优化ElementUI应用程序,提供更出色的用户体验和更灵活的界面交互。还有没有发现ElementUI中更好玩的内容,发出来大家学习学习。

目录
相关文章
|
1月前
|
JavaScript 索引
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
112 0
|
3月前
|
JavaScript
基于Element UI或Element Plus实现具有倒计时的Message消息提示
本文介绍了如何在Element UI或Element Plus框架中实现具有倒计时功能的消息提示组件,支持多次点击生成多个独立倒计时的消息提示,并提供了详细的实现代码和使用示例。
327 1
基于Element UI或Element Plus实现具有倒计时的Message消息提示
|
3月前
|
JavaScript UED
基于Vue2.0仿Element UI的el-tooltip实现一个气泡框组件,支持多数据类型的显示和内容为空时不显示气泡框
该文章介绍了如何基于Vue2.0仿照Element UI的el-tooltip组件实现一个自定义的气泡框组件,该组件能够根据内容是否为空智能显示或隐藏,支持多种数据类型的显示。
115 0
基于Vue2.0仿Element UI的el-tooltip实现一个气泡框组件,支持多数据类型的显示和内容为空时不显示气泡框
|
3月前
|
开发者 C# Android开发
明白吗?Xamarin与Native的终极对决:究竟哪种开发方式更适合您的项目需求,让我们一探究竟!
【8月更文挑战第31天】随着移动应用开发的普及,开发者面临多种技术选择。本文对比了跨平台解决方案Xamarin与原生开发方式的优势与劣势。Xamarin使用C#进行跨平台开发,代码复用率高,可大幅降低开发成本;但因基于抽象层,可能影响性能。原生开发则充分利用平台特性,提供最佳用户体验,但需维护多套代码库,增加工作量。开发者应根据项目需求、团队技能和预算综合考量,选择最适合的开发方式。
115 0
|
3月前
|
前端开发 开发者 C#
深度解析 Uno Platform 中的 MVVM 模式:从理论到实践的全方位指南,助你轻松掌握通过 C# 与 XAML 构建高效可维护的跨平台应用秘籍
【8月更文挑战第31天】本文详细介绍如何在优秀的跨平台 UI 框架 Uno Platform 中实施 MVVM(Model-View-ViewModel)模式,通过一个简单的待办事项列表应用演示其实现过程。MVVM 模式有助于分离视图层与业务逻辑层,提升代码组织性、易测性和可维护性。Uno Platform 的数据绑定机制使视图与模型间的同步变得高效简便。文章通过构造 `TodoListViewModel` 类及其相关视图,展示了如何解耦视图与模型,实现动态数据绑定及命令处理,从而提高代码质量和开发效率。通过这一模式,开发者能更轻松地构建复杂的跨平台应用。
54 0
|
3月前
|
JavaScript 前端开发 开发者
决战前端之巅!Element UI与Vuetify谁才是Vue.js组件界的霸主?一场关于颜值与实力的较量!
【8月更文挑战第30天】本文对比了两款热门的Vue.js组件库——Element UI与Vuetify。Element UI由饿了么团队打造,提供多种高质量UI组件,设计简洁大方。Vuetify基于Material Design规范,支持Vue.js 2.0及3.0版本,具备前瞻性。两者均涵盖表单、导航、数据展示等组件,Element UI配置选项丰富,而Vuetify则提供了更深层的样式定制功能。开发者可根据项目需求及个人偏好选择合适的组件库。
263 0
|
3月前
|
JavaScript 开发者 UED
Vue.js组件库大对决:Element UI与Vuetify,开发者的罗密欧与朱丽叶!
【8月更文挑战第30天】Element UI和Vuetify是Vue.js开发中的热门组件库,前者简洁高效,后者遵循Material Design,国际化程度高。两者均提供丰富的组件支持,但Vuetify组件更多样,设计更灵活;Element UI在性能和中文支持上更优。文档方面,Element UI更直观易懂,而Vuetify配置灵活但学习成本稍高。选择时需综合考虑项目需求、团队背景及设计风格,以达到最佳开发效果。
185 0
|
6天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
1月前
|
开发框架 JavaScript 前端开发
鸿蒙NEXT开发声明式UI是咋回事?
【10月更文挑战第15天】鸿蒙NEXT的声明式UI基于ArkTS,提供高效简洁的开发体验。ArkTS扩展了TypeScript,支持声明式UI描述、自定义组件及状态管理。ArkUI框架则提供了丰富的组件、布局计算和动画能力。开发者仅需关注数据变化,UI将自动更新,简化了开发流程。此外,其前后端分层设计与编译时优化确保了高性能运行,利于生态发展。通过组件创建、状态管理和渲染控制等方式,开发者能快速构建高质量的鸿蒙应用。
110 3
|
23天前
|
开发框架 JavaScript 前端开发
HarmonyOS UI开发:掌握ArkUI(包括Java UI和JS UI)进行界面开发
【10月更文挑战第22天】随着科技发展,操作系统呈现多元化趋势。华为推出的HarmonyOS以其全场景、多设备特性备受关注。本文介绍HarmonyOS的UI开发框架ArkUI,探讨Java UI和JS UI两种开发方式。Java UI适合复杂界面开发,性能较高;JS UI适合快速开发简单界面,跨平台性好。掌握ArkUI可高效打造符合用户需求的界面。
75 8