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. Java开发数据库设计的14个技巧,你知道几个?

    1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对 ...

  2. autocad 二次开发 最小包围圆算法

    autocad 二次开发 最小包围圆算法 主要实现了在模型空间下的得到一个包围所有图元的最小圆,该算法的思路是这样:1.从点集中随机选出两个点作为直径对圆进行初始化.2.判断下一个点p是否在圆中,如果 ...

  3. 如何为.NETCore安装汉化包智能感知

    引言 具体不记得是在群里还是什么地方有人问过,.NETCore有没有汉化包,答案是有,目前微软已经为我们提供了.NETCore多种语言的语言包.下面看看如何安装与使用吧. 在哪下载? 在微软官方下载 ...

  4. 前端day01

    目录 软件开发架构 web服务的本质 HTTP协议 HTML的注释 HTML的文档结构 标签的分类 标签的分类 列表标签 表格标签 软件开发架构 ​ c/s ​ b/s ​ b/s本质也是c/s ​ ...

  5. Linux下搭建HttpRunnerManager接口测试平台

    前言 之前在学习HttpRunner时,我们都是把用例写在 YAML/JSON 中进行维护,使用起来也很方便.其实,现在有不少大佬都喜欢开发自动化测试平台,比如我们今天要搭建的HttpRunnerMa ...

  6. 一些实用的 Laravel 小技巧

    Laravel 中一些常用的小技巧,说不定你就用上了. 1.侧栏 网站一般都有侧栏,用来显示分类,标签,热门文章,热门评论啥的,但是这些侧栏都是相对独立的模块,如果在每一个引入侧栏的视图中都单独导入与 ...

  7. 【转载】单线程Redis性能为何如此之高?

    Redis的优势 性能高不仅跟线程模型有关,它有很多原因,主要有如下3点: 基于内存: 单线程,但IO多路复用的利用率高: 数据结构为高性能优化. 下面分别阐述. Redis的优势:基于内存 性能高低 ...

  8. Git 原理简谈

    Git 本身是一个对 reference 进行管理的数据库,reference 指的是对原始数据的引用.通过对原始数据的追踪,那么就可以做到对版本的控制.Git 使用一个 DAG 存储了整个的refe ...

  9. Android——application全局类的使用

    目录 1.概述 2.Application基类 3.自定义Application类 4.Application的生命周期 5.Application对象的回调函数 6.Application对象的作用 ...

  10. 【重要更新】Senparc.Weixin SDK v6.5 升级说明(支持 .NET Core 3.0 及分布式消息上下文)

    Senparc.Weixin SDK v6.5 开始支持 .NET Core 3.0,并将微信消息上下文进行了大幅度的重构,支持了使用分布式缓存存储上下文信息,这意味着在分布式系统中,现在 Senpa ...