模拟元素的title属性,自定义Vue指令
function showTitle(el, title) {
const popover = getPopover()
const popoverStyle = popover.style if (title === undefined) {
popoverStyle.display = 'none'
} else {
const elRect = el.getBoundingClientRect()
const elComputedStyle = window.getComputedStyle(el, null)
const rightOffset = parseInt(elComputedStyle.getPropertyValue('padding-right')) || 0
const topOffset = parseInt(elComputedStyle.getPropertyValue('padding-top')) || 0 popoverStyle.visibility = 'hidden'
popoverStyle.display = 'block'
popover.querySelector('.popover-content').textContent = title
popoverStyle.left = elRect.left - popover.offsetWidth / 2 + (el.offsetWidth - rightOffset) / 2 + 'px'
popoverStyle.top = elRect.top - popover.offsetHeight + topOffset + 'px'
popoverStyle.display = 'block'
popoverStyle.visibility = 'visible'
}
} function getPopover() {
let popover = document.querySelector('.title-popover') if (!popover) {
const tpl = `
<div class="popover title-popover top fade in" style="position:fixed;">
<div class="arrow"></div>
<div class="popover-content"></div>
</div>
`
const fragment = document.createRange().createContextualFragment(tpl) document.body.appendChild(fragment)
popover = document.querySelector('.title-popover')
} return popover
}
export default {
bind(el, binding, vnode) {
// 使用 const 声明一个只读的常量,其值是需要监听的事件类型列表
const events = ['mouseenter', 'mouseleave', 'click']
// 声明一个处理器,以根据不同的事件类型传不同的参数
const handler = (event) => {
if (event.type === 'mouseenter') {
// 显示一个提示框
showTitle(el, binding.value)
} else {
// 隐藏一个提示框
showTitle()
}
} // 在 el 元素上添加事件监听
events.forEach((event) => {
el.addEventListener(event, handler, false)
}) // 在 el 元素上添加一个属性,以在其他钩子进行访问
el.destroy = () => {
// 移除 el 元素上的事件监听
events.forEach((event) => {
el.removeEventListener(event, handler, false)
})
// 移除 el 元素上的 destroy
el.destroy = null
}
},
unbind(el) {
// 移除事件监听和数据绑定
el.destroy()
}
}
使用步骤:
1.建立指令;
2.在要使用的组件中引入并注册指令
import title from '@/directives/title'
directives: {
title
}
3.页面中使用,将原来的:title=""改为v-title:
<a v-for="item in contacts" v-title="item.title" :href="item.link" :style="contactStyle" target="_blank">
<i :class="`fa fa-${item.icon}`"></i>
</a>
指令的基础知识补充:
一个指令定义对象可以提供如下几个钩子函数(均为可选):
bind
:只调用一次,指令第一次绑定到元素时调用,在这里可以进行一次性的初始化设置;inserted
:被绑定元素插入父节点时调用;update
:所在组件的 VNode(虚拟节点)更新时调用,但是可能发生在其子 VNode 更新之前;componentUpdated
:指令所在组件的 VNode 及其子 VNode 全部更新后调用;unbind
:只调用一次,指令与元素解绑时调用,在这里可以移除绑定的事件和其他数据;指令钩子函数会被传入以下参数:
el
:指令所绑定的元素,可以用来操作 DOM ;binding
:一个对象,binding.value
表示指令的绑定值,如v-title="'我是标题'"
中,绑定值为'我是标题'
;vnode
:Vue 编译生成的虚拟节点;oldVnode
:上一个虚拟节点,仅在update
和componentUpdated
钩子中可用。
模拟元素的title属性,自定义Vue指令的更多相关文章
- Spring Cloud实战: 基于Spring Cloud Gateway + vue-element-admin 实现的RBAC权限管理系统,实现网关对RESTful接口方法权限和自定义Vue指令对按钮权限的细粒度控制
一. 前言 信我的哈,明天过年. 这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT ...
- 手写一个关于title属性自定义提示框解决浏览器(IE)不兼容问题
<html> <head> <meta charset="utf-8"> <title>无标题页</title> < ...
- 为元素添加 title 属性
---恢复内容开始--- 可以使用title属性(不要与title元素混淆)为网站上任何部分加上提示标签. ... <ul title="Table of Contents" ...
- 一个能拖动,能调整大小,能更新bind值的vue指令-vuedragx
一. 背景说明 开发一个可自定义组件化门户配置页面,期间采用了vue框架作为前端视图引擎,作为一个刚入手vue的萌新,开发第一个功能就遇到了拦路虎.需要一个拖动并且可改变大小的容器盒子.当时查看vue ...
- 正确使用HTML title属性
如果你想对使用手机,平板电脑和辅助技术的用户隐藏某些内容,而只对键盘用户显示,那么请使用title属性. 细节 HTML的title属性本身有问题.之所以有问题是因为它在一些重要的方面表现的不够好,尽 ...
- vue指令详解和自定义指令
在vue中,指令以v-开头,是一种特殊的自定义行间属性,指令的职责就是其表达式的值改变时相应地将某些行为应用到DOM上 指令使用的示例 在下面的运行结果中可以看到,v-html是可以解析html标签的 ...
- 【CSS进阶】伪元素的妙用2 - 多列均匀布局及title属性效果
最近无论是工作还是自我学习提升都很忙,面对长篇大论的博文总是心有余而力不足,但又不断的接触学习到零碎的但是很有意义的知识点,很想分享给大家,所以本篇可能会很短. 本篇接我另一篇讲述 CSS 伪元素的文 ...
- 自定义类似于Jquery UI Selectable 的Vue指令v-selectable
话不多说,先看效果. 其实就是一个可以按住鼠标进行一个区域内条目选择的功能,相信用过Jquery UI 的都知道这是selectable的功能,然而我们如果用Vue开发的话没有类似的插件,当然你仍然可 ...
- Vue框架(一)——Vue导读、Vue实例(挂载点el、数据data、过滤器filters)、Vue指令(文本指令v-text、事件指令v-on、属性指令v-bind、表单指令v-model)
Vue导读 1.Vue框架 vue是可以独立完成前后端分离式web项目的js框架 三大主流框架之一:Angular.React.Vue vue:结合其他框架优点.轻量级.中文API.数据驱动.双向绑定 ...
随机推荐
- Java:Object类详解
Java的一些特性会让初学者感到困惑,但在有经验的开发者眼中,却是合情合理的.例如,新手可能不会理解Object类.这篇文章分成三个部分讲跟Object类及其方法有关的问题. 上帝类 问:什么是Obj ...
- linux系统编程:守护进程详解及创建,daemon()使用
一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个 ...
- win7 64位的 svchost.exe 占用内存过大的问题
svchost.exe 是用来启动系统服务的,所以某个 svchost.exe 占用内存过大,可能就是它启动的那个服务占用内存过大,所以只要停止并禁用那个服务就行了. 一般来说占用内存最大的服务是 S ...
- .net非托管资源的回收
释放未托管的资源有两种方法 1.析构函数 2.实现System.IDisposable接口 一.析构函数 构造函数可以指定必须在创建类的实例时进行的某些操作,在垃圾收集器删除对象时,也可以调用析构函数 ...
- DNS named.conf文件详解
配置文件: /etc/named.conf /在NAMED.CONF 配置文件中使用//和/* */来进行注释, options { /*OPTIONS选项用来定义一些影响整个DNS服 ...
- 【Python】Python中的深浅拷贝
[转]python 复制(拷贝)对象 -- ::| 分类: Python |举报|字号 订阅 下载LOFTER我的照片书 | 需求: 你想复制一个对象.因为在Python中,无论你把对象做为参数传递, ...
- [Functional Programming] Use Task/Async for Asynchronous Actions
We refactor a standard node callback style workflow into a composed task-based workflow. Original Co ...
- IOS手机使用Fiddler抓获HTTPS报文方法
Configure Fiddler Click Tools > Fiddler Options > Connections. Click the checkbox by Allow rem ...
- 塔防游戏 代码project as 分享
分享 用到的技术为 1. 先进的下载技术 2. mvc 游戏仅仅实现战斗逻辑功能. 简单的 登陆,及选择关卡,战斗,结算. 五脏俱全,各种游戏模块及分层都划分清楚,仅仅要填代码就能够了 哈哈 能够拿 ...
- java基础学习总结——GUI编程(一) 还未仔细阅读
一.AWT介绍