vue利用指令实现快速设置元素的高度

 更新时间:2024年03月11日 08:52:26   作者:pe7er  
在项目中经常有需要将列表的高度设置成剩余可视区域的高度,本文主要来和大家介绍一下如何通过指令和css变量的方式快速设置列表高度,希望对大家有所帮助

在项目中经常有需要将列表的高度设置成剩余可视区域的高度,一般的做法是用ref获取后,计算元素的top,然后通过v-bind()将top注入到style中

cn.vuejs.org/api/sfc-css-features.html#v-bind-in-css

height: calc(100vh - v-bind(top))

下面介绍一种通过指令和css变量的方式快速设置列表高度的方法,下面是代码示例。

import type { DirectiveBinding, Directive } from 'vue'

const PREFIX = '--bounding-info-'
interface IOptions {
  prefix?: string
}

const setStyles = (el: HTMLElement, options: IOptions = {}) => {
  const { prefix = PREFIX } = options
  const boundingClientRectInfo = el.getBoundingClientRect()
  const { width, height, top, right, bottom, left, x, y } = boundingClientRectInfo
  const rawStylesStr = el.getAttribute('style')
  const rawStyles = rawStylesStr ? rawStylesStr.split(';').filter((item) => !!item && !item.includes(prefix)) : []
  const bindingStyles = [
    {
      name: 'width',
      value: width
    },
    {
      name: 'height',
      value: height
    },
    {
      name: 'top',
      value: top
    },
    {
      name: 'right',
      value: right
    },
    {
      name: 'bottom',
      value: bottom
    },
    {
      name: 'left',
      value: left
    },
    {
      name: 'x',
      value: x
    },
    {
      name: 'y',
      value: y
    }
  ].map((item) => `${prefix}${item.name}: ${item.value}px`)
  const newStyles = rawStyles.concat(bindingStyles)
  el.setAttribute('style', newStyles.join(';'))
}
const boundingInfoToCssVar: Directive = {
  mounted(el: HTMLElement, binding: DirectiveBinding) {
    setStyles(el, binding.arg as IOptions)
  },
  updated(el: HTMLElement, binding: DirectiveBinding, vnode, prevVnode) {
    setStyles(el, binding.arg as IOptions)
  }
  // beforeUnmount(el: HTMLElement, binding: DirectiveBinding) {
  //   console.log(el)
  // }
}

export const name = 'BoundingInfoToCssVar'
export default boundingInfoToCssVar

使用方法

<div
  v-if="activated"
  v-bounding-info-to-css-var:[boundingInfoOptions]
  style="font-size: 12px"
  :style="styles"
  @click="closeHandle"
  class="overflow"
/>

<script lang="ts" setup>
const boundingInfoOptions = { prefix: '--bounding-info-' }
</script>

<style lang="less">
.overflow {
  height: calc(100vh - var(--bounding-info-top));
}
</style>

这是一个使用 Vue.js 实现的指令,它将元素的边界信息转换为 CSS 变量,并将这些 CSS 变量应用到元素的样式上。

以下是代码的详细解释:

setStyles函数用于设置元素的样式。它接受一个元素和一个可选的配置对象作为参数。配置对象可以包含一个前缀选项,用于指定生成的 CSS 变量的前缀。

  • 函数内部首先获取元素的边界信息,包括宽度、高度、上边界、右边界、下边界、左边界、水平偏移量和垂直偏移量。
  • 然后,它从元素的现有样式中提取出不包含指定前缀的样式,并将其存储在rawStyles数组中。
  • 接下来,它根据边界信息生成一组 CSS 变量,并将其存储在bindingStyles数组中。每个 CSS 变量的名称都以指定的前缀开头,后面跟着对应的边界信息名称,值为边界信息的值,单位为像素。
  • 最后,它将原始样式和生成的绑定样式合并成一个新的样式字符串,并将其设置回元素的style属性中。

boundingInfoToCssVar指令用于将边界信息转换为 CSS 变量。它包含mountedupdated两个生命周期钩子函数。

  • mounted函数在指令首次绑定到元素时被调用,它调用setStyles函数来设置元素的样式。
  • updated函数在指令的绑定值发生变化时被调用,它也调用setStyles函数来更新元素的样式。

代码最后导出了指令的名称和定义,以便在其他地方使用。

使用这个指令时,可以在模板中使用v-bounding-info-css-var指令来绑定一个对象,该对象可以包含一个prefix选项,用于指定 CSS 变量的前缀。例如:

<!-- 此处的元素将具有带有 --my-prefix- 前缀的 CSS 变量 -->
<div v-bounding-info-css-var="{ prefix: '--my-prefix-' }"></div>

这样,元素的边界信息将被转换为带有指定前缀的 CSS 变量,并应用到元素的样式上。

这段代码是一个使用 Vue.js 的示例,它包含一个具有条件渲染和一个自定义指令 v-bounding-info-to-css-var 的 <div> 元素。下面是代码的详细解释:

<div
  v-if="activated"
  v-bounding-info-to-css-var:[boundingInfoOptions]
  style="font-size: 12px"
  :style="styles"
  @click="closeHandle"
  class="list"
 />
  • v-if="activated":这是一个条件渲染指令,只有当 activated 变量的值为 true 时,这个 <div> 元素才会被渲染。
  • v-bounding-info-to-css-var:[boundingInfoOptions]:这是一个自定义指令,它接受一个参数 boundingInfoOptions,这个参数会被传递给指令的处理函数。
  • style="font-size: 12px":这是一个内联样式,用于设置 <div> 元素的字体大小为 12px
  • :style="styles":这是一个 v-bind 指令,它将 styles 变量绑定到 <div> 元素的 style 属性上。
  • @click="closeHandle":这是一个事件监听指令,当点击 <div> 元素时,会触发 closeHandle 函数。
  • class="list":这是一个类名,用于给 <div> 元素添加一个名为 list 的类。
const boundingInfoOptions = { prefix: '--bounding-info-' }

boundingInfoOptions:这是一个对象,它包含了自定义指令 v-bounding-info-to-css-var 所需的参数。在这个例子中,prefix 是一个参数,它的值为 --bounding-info-

.list { height: calc(100vh - var(--bounding-info-top)); }

.list:这是一个类选择器,用于选择具有 list 类的元素。

height: calc(100vh - var(--bounding-info-top));:这是一个 CSS 样式声明,它使用了 calc 函数来计算元素的高度。100vh 表示视窗的高度,var(--bounding-info-top) 表示一个变量,它的值是由自定义指令 v-bounding-info-to-css-var 设置的上边界距离。通过减去上边界的距离,得到了元素的高度。

总的来说,这段代码的目的是在一个具有特定条件(activated 为 true)的情况下,渲染一个 <div> 元素。这个元素具有一些样式,并且当点击时会触发一个函数。此外,它还使用了一个自定义指令来将元素的边界信息转换为 CSS 变量,并使用这些变量来设置元素的样式。

到此这篇关于vue利用指令实现快速设置元素的高度的文章就介绍到这了,更多相关vue指令设置元素高度内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue 前端实现登陆拦截及axios 拦截器的使用

    Vue 前端实现登陆拦截及axios 拦截器的使用

    这篇文章主要介绍了Vue 前端实现登陆拦截及axios 拦截器的使用,通过这个项目学习如何实现一个前端项目中所需要的 登录及拦截、登出、token失效的拦截及对应 axios 拦截器的使用。需要的朋友可以参考下
    2019-07-07
  • Vue中的vue-resource示例详解

    Vue中的vue-resource示例详解

    Vue与后台Api进行交互通常是利用vue-resource来实现的,本质上vue-resource是通过http来完成AJAX请求相应的。这篇文章主要介绍了Vue中的vue-resource示例详解,需要的朋友可以参考下
    2018-11-11
  • Vue路由传递query参数两种方式

    Vue路由传递query参数两种方式

    路由是可以传递参数的,一般使用query进行传参,有两种方式,本温酒通过代码示例给大家介绍这两种传递方式,感兴趣的小伙伴可以参考阅读
    2023-06-06
  • vue 单页应用和多页应用的优劣

    vue 单页应用和多页应用的优劣

    这篇文章主要介绍了vue 单页应用和多页应用的优劣,帮助大家更好的理解和使用vue,感兴趣的朋友可以了解下
    2020-10-10
  • Vue3启用gzip压缩nginx配置详解

    Vue3启用gzip压缩nginx配置详解

    这篇文章主要为大家介绍了Vue3启用gzip压缩时nginx配置gzip示例详解详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • vue使用高德地图实现添加点标记和获取点击位置信息的示例代码

    vue使用高德地图实现添加点标记和获取点击位置信息的示例代码

    这篇文章主要介绍了vue使用高德地图实现添加点标记和获取点击位置信息的示例代码,文中补充介绍了高德vue-amap使用(一)标记点位获取地址及经纬度,本文结合示例代码给大家介绍的非常详细,需要的朋友参考下吧
    2024-01-01
  • Vue中注册全局组件的三种方式

    Vue中注册全局组件的三种方式

    这篇文章主要介绍了Vue中注册全局组件的三种方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-11-11
  • vue cli 3.0 使用全过程解析

    vue cli 3.0 使用全过程解析

    这篇文章主要介绍了vue-cli 3.0 使用全过程,本文通过项目实例相结合的形式给大家介绍的非常详细,需要的朋友可以参考下
    2018-06-06
  • vue init webpack 建vue项目报错的解决方法

    vue init webpack 建vue项目报错的解决方法

    今天小编就为大家分享一篇vue init webpack 建vue项目报错的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • vue实现移动端的开关按钮

    vue实现移动端的开关按钮

    这篇文章主要为大家详细介绍了vue实现移动端的开关按钮,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02

最新评论