dom元素的tabindex属性介绍及在vue项目中的应用

tabindex属性作用

  1. 让普通dom元素变为可聚焦的元素
  2. 让普通dom元素可以参与顺序键盘导航(通常使用Tab键,因此得名)。

tabindex属性的取值和影响

它接受一个整数作为值,具有不同的结果,具体取决于整数的值:

  • tabindex=负值 (通常是tabindex=“-1”),表示元素是可聚焦的,但是不能通过键盘导航来访问到该元素,用JS做页面小组件内部键盘导航的时候非常有用。
  • tabindex="0" ,表示元素是可聚焦的,并且可以通过键盘导航来聚焦到该元素,它的相对顺序是当前处于的DOM结构来决定的。
  • tabindex=正值,表示元素是可聚焦的,并且可以通过键盘导航来访问到该元素;它的相对顺序按照tabindex 的数值递增而滞后获焦。如果多个元素拥有相同的 tabindex,它们的相对顺序按照他们在当前DOM中的先后顺序决定。

根据键盘序列导航的顺序,值为 0 、非法值、或者没有 tabindex 值的元素应该放置在 tabindex 值为正值的元素后面。

注意:如果我们在 div上设置了 tabindex 属性,它的子元素内容不能使用箭头键来滚动,除非我们在内容上也设置 tabindex查看这篇 fiddle 来理解 tabindex 的滚动影响

tabindex属性的使用

<div
v-if="dialogVisible"
tabindex="1"
class="dialog"
ref="dialog"
@blur="loseFocus"
>
这是一个弹窗
</div>

tabindex属性项目中的应用

需求:有一个默认隐藏的弹窗dialog,当鼠标点击一个button时,让弹窗显示;当用户点击弹窗dialog之外的其他区域时隐藏弹窗(要求不能使用全屏遮罩)

  1. 给弹窗dialog加一个tabindex属性,让其变为可聚焦的元素。tabindex="1"
  2. 给弹窗dialog绑定一个失去焦点的事件。@blur="loseFocus"
  3. button绑定click事件,当click事件触发的时候,让弹窗展示,同时聚焦弹窗。<button @click="handleOpenDialog">打开弹窗同时获取焦点</button>
  4. 在用户点击button时,触发handleOpenDialog函数,在这个函数内控制弹窗的展示,同时让聚焦弹窗。
  5. 在用户点击弹窗dialog之外的区域时,会触发弹窗的失去焦点的事件函数loseFocus
  6. loseFocus函数内控制弹窗的隐藏

详细代码如下:

<template>
<div>
<button @click="handleOpenDialog">打开弹窗同时获取焦点</button>
<div
v-if="dialogVisible"
tabindex="1"
class="dialog"
ref="dialog"
@blur="loseFocus"
>
这是一个弹窗
</div>
</div>
</template> <script lang='ts'>
import { Vue, Component } from "vue-property-decorator"; @Component({
name: "Father"
})
export default class Father extends Vue {
// data
dialogVisible: boolean = false; //是否显示弹窗 /**
* 显示弹窗,同时获取焦点
*/
handleOpenDialog() {
// 显示弹窗
this.dialogVisible = true; // 让弹窗获取焦点
// 第一种写法
// setTimeout(() => {
// (this.$refs.dialog as any).focus();
// }, 0); // 第二种官方写法(推荐)
this.$nextTick(() => {
(this.$refs.dialog as any).focus();
});
} /**
* 弹窗失去焦点, 隐藏弹窗
*/
loseFocus() {
this.dialogVisible = false;
} }
</script> <style lang="scss">
.dialog {
width: 100px;
height: 100px;
border: 1px solid #ccc; &:focus {
outline: 0;
}
}
</style>

备注:如果不想让弹窗聚焦的时候有默认的外边框样式,可以加一段css代码控制样式

.dialog:focus {
outline: 0;
}

效果图

  • 有聚焦默认样式

  • 无聚焦默认样式

dom元素的tabindex属性介绍及在vue项目中的应用的更多相关文章

  1. 如何在Vue项目中,通过点击DOM自动定位VScode中的代码行?

    作者:vivo 互联网大前端团队- Youchen 一.背景 现在大型的 Vue项目基本上都是多人协作开发,并且随着版本的迭代,Vue 项目中的组件数也会越来越多,如果此时让你负责不熟悉的页面功能开发 ...

  2. JQUERY选择和操作DOM元素(利用正则表达式的方法匹配字符串中的一部分)

    JQUERY选择和操作DOM元素(利用正则表达式的方法匹配字符串中的一部分) 1.匹配属性的开头 $("[attributeName^='value']"); 2.匹配属性的结尾 ...

  3. vue项目中遇到的一些问题

    或访问:https://github.com/littleHiuman/experiences-about-vue  欢迎补充! vuex 状态 vue-cli 命令行 vue vue vue-rou ...

  4. scss/less语法以及在vue项目中的使用(转载)

    1.scss与less都是css的预处理器,首先我们的明白为什么要用scss与less,因为css只是一种标记语言,其中并没有函数变量之类的,所以当写复杂的样式时必然存在局限性,不灵活,而scss与l ...

  5. 转:如何在Vue项目中使用vw实现移动端适配

    https://www.w3cplus.com/mobile/vw-layout-in-vue.html 有关于移动端的适配布局一直以来都是众说纷纭,对应的解决方案也是有很多种.在<使用Flex ...

  6. vue项目中postcss-pxtorem的使用及webpack中的配置 css中单位px和em,rem的区别

    移动手机版要求我们在制作嵌入h5的时候去适配不同的手机.适配有多重模式,有flex.百分比等.字体大小的控制也有px.百分比.rem等单位,webpack中 px转rem. vue项目中postcss ...

  7. 在vue项目中使用canvas-nest.js,报parameter 1 is not of type 'Element'

    canvas-nest.js是一款轻量的网页特效,如图: github地址:https://github.com/hustcc/canvas-nest.js 在普通的html项目中,只要将<sc ...

  8. 在Vue项目中使用vw实现移动端适配

    有关于移动端的适配布局一直以来都是众说纷纭,对应的解决方案也是有很多种.在<使用Flexible实现手淘H5页面的终端适配>提出了Flexible的布局方案,随着viewport单位越来越 ...

  9. 如何在Vue项目中使用vw实现移动端适配(转)

    有关于移动端的适配布局一直以来都是众说纷纭,对应的解决方案也是有很多种.在<使用Flexible实现手淘H5页面的终端适配>提出了Flexible的布局方案,随着viewport单位越来越 ...

随机推荐

  1. 测底稳定NIOS开发之一:将nios产生的编程文件转换成jic (连载)

    将nios产生的编程文件转换成jic 前言: 基于某种原因,自从开始fpga开发和nios项目开发中,均为正常使用EDS IDE自带的flash programmer 进行成功的下载固化epcs程序. ...

  2. 最新115道华为、京东、滴滴、美团精选Java面试题整理

    京东面试题 1. 一般sql注入怎么发现触点的,从源码阐述sqlmap如何测试注入点的. 2. masscan扫描端口时靠什么检测,为什么这么快? 请详述. 3. 你写过哪些小工具,你为你使用过的工具 ...

  3. newifi 1.6.13上运行mentohust方案

    newifi最新版的固件,已经无法简单的root和开启ssh了,以下是本人的解决方案. 一·刷上pandorabox系统 1.系统可以到联想NBD社区下载:http://www.newbandeng. ...

  4. 发布一个基于协程和事件循环的c++网络库

    目录 介绍 使用 性能 实现 日志库 协程 协程调度 定时器 Hook RPC实现 项目地址:https://github.com/gatsbyd/melon 介绍 开发服务端程序的一个基本任务是处理 ...

  5. ES6+转ES5(webpack+babel、指定多个js文件、自动注入)

    接续上篇ES6+转ES5,本篇将使用webpack和babel将多个不同目录下指定的多个ES6+语法的js文件编译为ES5,并将编译后的文件配置注入对应的html文件. 所需环境node.npm.设置 ...

  6. LeetCode刷题总结-栈、链表、堆和队列篇

    本文介绍LeetCode上有关栈.链表.堆和队列相关的算法题的考点,推荐刷题20道.具体考点分类如下图: 一.栈 1.数学问题 题号:85. 最大矩形,难度困难 题号:224. 基本计算器,难度困难 ...

  7. 重构 JAVA 聊天室 —— CS 模式的简单架构实现

    前言 自从开始弄起数据挖掘之后,已经很久没写过技术类的博客了,最近学校 JAVA 课设要求实现一个聊天室,想想去年自己已经写了一个了,但是有些要求到的功能我也没实现,但看着原有的代码想了想加功能好像有 ...

  8. 原生JS实现动画函数的封装

    封装了一个JS方法,支持元素的基本动画:宽.高.透明度...等,也支持链式动画和同时运动. 获取元素的属性的函数并进行了兼容性处理: function getStyle(obj, attr) { if ...

  9. zabbix服务深入

    第1章 Grafana自定义图形 1.安装grafana [root@m01 /data/soft]# wget https://dl.grafana.com/oss/release/grafana- ...

  10. python基础之元组讲解

    概念讲解: 1.Python 的元组与列表十分相似,但是元组的元素只可读不可修改: 2.元组使用小括号,列表使用方括号: 3.元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. (1)创建一 ...