禁止连接_chrome不翻译网页

禁止连接_chrome不翻译网页有一天,我在工作中产生了关于如何禁用链接的思考。不知为何,去年我无意添加了一个「disabled」锚点样式。但有一个问题:你无法在 HTML 中真正禁用 链接(拥有合法 href 属性)。更何况,你为什么要禁用它呢?链接是 Web 的基础。 某种意义上,我的同事看起来并…

禁用连接:从入门到放弃

有一天,我在工作中产生了关于如何禁用链接的思考。不知为何,去年我无意添加了一个「disabled」锚点样式。但有一个问题:你无法在 HTML 中真正禁用 <a> 链接(拥有合法 href 属性)。更何况,你为什么要禁用它呢?链接是 Web 的基础。

某种意义上,我的同事看起来并不打算接受这个事实,所以我开始思考如何真正实现它。我知道这将付出很多努力,所以我想证明为了这种非传统的交互并不值得付出努力和代码。但我担心一旦被证明这是可以实现的,他们将无视我的警告继续做类似的尝试。这还没有动摇我,不过我觉得我们可以开始看我的研究了。

第一:

不要这样做。

一个被禁用的链接不能称作一个链接,它只是一段文本。如果需要禁用一个链接的话,你需要重新思考你的设计。

Bootstrap 有一个为锚点标签添加 .disabled 类的例子,我很讨厌这点。虽然他们至少提及了这个类只提供了一个禁用 样式,但这仍然是一种误导。如果你真的想禁用一个链接,你需要做更多的工作而不是只是让它 看起来 被禁用了。

万无一失的办法:移除 href 属性

如果你决定无视我的警告尝试禁用一个链接,那么 移除 href 属性是我所知的最好的办法

官方解释 Hyperlink spec

aarea 元素的 href 属性不是必要的;当这些元素没有 href 属性时,它们将不会解释成超链接。

一个更易理解的定义 MDN

这个属性可以被忽略(从 HTML5 开始支持)以创建一个占位符链接。占位符链接类似传统的超链接,但它不会跳转到任何地方。

下面是用来设置和移除 href 属性的基本 JavaScript 代码:

/* 
 * 用你习惯的方式选择一个链接
 *
 * document.getElementById('MyLink');
 * document.querySelector('.link-class');
 * document.querySelector('[href="https://unfetteredthoughts.net"]');
 */
// 通过移除 href 属性来「禁用」一个链接。
link.href = '';
// 通过设置 href 属性启用链接
link.href = 'https://unfetteredthoughts.net';

为这些链接设置 CSS 样式同样非常简单:

a {
  /* 已禁用的链接样式 */
}
a:link, a:visited { /* or a[href] */
  /* 可访问的链接样式 */
}

这就是你所要做的全部!

这是不够的,我想要更复杂的东西让我看起来更聪明!

如果你不得不为了某些极端情况过度设计,这里有些事情需要考虑。希望你注意并且意识到我将为你展示的东西并不值得为之努力。

首先,我们需要为链接添加样式,让它看起来被禁用了。

.isDisabled {
  color: currentColor;
  cursor: not-allowed;
  opacity: 0.5;
  text-decoration: none;
}
<a class="isDisabled" href="https://unfetteredthoughts.net">Disabled Link</a>

禁止连接_chrome不翻译网页

color 设置成 currentColor 将把字体颜色重置为普通的非链接文本的颜色。同时把鼠标悬停设置为 not-allowed,这样鼠标悬停时就会显示禁用的标识。我们遗漏掉了那些不使用鼠标的用户,他们主要使用触摸和键盘,所以并不会得到这个指示。接下来,将透明度减至 0.5。根据 WCAG,禁用的元素不需要满足颜色对比指南。我认为这是很危险的,因为这基本上是纯文本,减少透明度至 0.5 将使视弱用户难以阅读,这是我讨厌禁用链接的另一个原因。最后,文本的下划线被移除了,因为它通常是一个链接的最佳标识。现在,这 看起来 是一个被禁用的链接了!

但它并没有被真正禁用!用户仍然可以点击、触摸这个链接。我听到你在尖叫 pointer-events

.isDisabled {
  ...
  pointer-events: none;
}

现在,我们完成了所有工作!禁用一个链接已经大功告成!虽然这只是对鼠标用户和触屏用户 真正地 禁用了链接。那么对于不支持 pointer-events 的浏览器怎么办呢?根据 caniuse,Opera Mini 以及 IE 11 以下版本都不支持这个属性。IE 11 以及 Edge 实际上也不支持 pointer-events,除非 display 设置成 block 或者 inline-block。而且,将 pointer-events 设置成 none 将覆盖我们 not-allowed 的指针样式,所以现在鼠标用户将不会得到这个额外的视觉指示,表明链接被禁用。这已经开始崩溃了。现在我们不得不更改我们的标记和 CSS。

.isDisabled {
  cursor: not-allowed;
  opacity: 0.5;
}
.isDisabled > a {
  color: currentColor;
  display: inline-block;  /* 为了 IE11/ MS Edge 的 bug */
  pointer-events: none;
  text-decoration: none;
}
<span class="isDisabled"><a href="https://unfetteredthoughts.net">Disabled Link</a></span>

将一个链接包裹在 <span> 标签中并添加 isDisabled 类给了我们一半禁用视觉样式。一个很好的效果是这个 isDisabled 类是通用的,可以用在其他元素上,例如按钮和表单元素。实际的锚点标签现在有设置为 nonepointer-eventstext-decoration 属性。

那么键盘用户呢?键盘用户会使用回车键激活链接。pointer-events 只用于光标,没有键盘事件。我们还需要防止不支持 pointer-events 的旧浏览器激活链接,现在我们将介绍一些 JavaScript。

引入 JavaScript

// 在用常用方法获取链接之后
link.addEventListener('click', function (event) {
  if (this.parentElement.classList.contains('isDisabled')) {
    event.preventDefault();
  }
});

现在我们的链接 看起来 被禁用了而且不会响应点击、触摸以及回车键。但是我们还没完成!屏幕阅读器用户无法知道这个链接已经被禁用了。我们需要将这个链接描述为被禁用。disabled 属性在链接上不合法,但我们可以使用 aria-disabled="true"

<span class="isDisabled"><a href="https://unfetteredthoughts.net" aria-disabled="true">Disabled Link</a></span>

现在我将利用这个机会根据 aria-disabled 属性设置链接样式。我喜欢使用 ARIA 属性作为 CSS 的钩子,因为拥有不正确的样式的元素可以表现出重要的可访问缺失。

.isDisabled {
  cursor: not-allowed;
  opacity: 0.5;
}
a[aria-disabled="true"] {
  color: currentColor;
  display: inline-block;  /* 为了 IE11/ MS Edge 的 bug */
  pointer-events: none;
  text-decoration: none;
}

现在我们的链接 看起来 被禁用, 表现起来 被禁用, 而且被 描述 成被禁用.

不幸的是,即便链接被描述成被禁用,一些屏幕阅读器(JAWS)仍将宣称这些链接是可点击的。任何一个有点击事件监听器的元素都是这样。这是因为开发者倾向于将非交互元素如 divspan 添加事件监听器从而当做伪交互元素使用。对此我们无能为力。我们为了去除一个链接的所有特征所做的努力都被我们想要愚弄的辅助技术所挫败,讽刺的是,我们之前就想骗过它了。

不过,如果我们将监听器移动到 body 呢?

document.body.addEventListener('click', function (event) {
  // 过滤掉其他元素的点击事件
  if (event.target.nodeName == 'A' && event.target.getAttribute('aria-disabled') == 'true') {
    event.preventDefault();
  }
});

我们完成了吗?其实并没有。有的时候我们需要启用这些链接,所以我们需要添加额外的代码来切换这些状态或行为。

function disableLink(link) {
// 1\. 为父级 span 添加 isDisabled 类
  link.parentElement.classList.add('isDisabled');
// 2\. 保存 href 以便以后添加
  link.setAttribute('data-href', link.href);
// 3\. 移除 href
  link.href = '';
// 4\. 设置 aria-disabled 为 'true'
  link.setAttribute('aria-disabled', 'true');
}
function enableLink(link) {
// 1\. 将父级 span 的 'isDisabled' 类移除
  link.parentElement.classList.remove('isDisabled');
// 2\. 设置 href
  link.href = link.getAttribute('data-href');
// 3\. 移除 'aria-disabled' 属性,比将其设为 false 更好
  link.removeAttribute('aria-disabled');
}

就是这样。我们现在从视觉上、功能上以及语义上为所有的用户禁用了链接。它只用了 10 行 CSS,15 行 JavaScript(包括 body 上的一个监听器)以及 2 个 HTML 元素。

说真的,不要做这样的尝试。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13545.html

(0)

相关推荐

  • Oracle迁移MySQL 8特殊SQL处理「终于解决」

    Oracle迁移MySQL 8特殊SQL处理「终于解决」在Oracle建立一个表 create table nayi_180328_connect_test( dept_id varchar2(50), parent_id varchar2(50), d…

    2023-02-25
    276
  • SpringBoot 同一个接口同时支持 form 表单、form-data、json 的优雅写法[通俗易懂]

    SpringBoot 同一个接口同时支持 form 表单、form-data、json 的优雅写法[通俗易懂]最近重写个项目遇到个比较棘手的问题,老项目是 PHP 接口,这个接口同时兼容 POST json 和 form 表单,更骚的是连 form-data 也兼容。。。因为写 PHP 请求的对接方代码不严谨

    2023-08-19
    119
  • 带你玩转Linux常用命令(8部分)[亲测有效]

    带你玩转Linux常用命令(8部分)[亲测有效]1.vi和vim编辑模式 两者之间功能基本都是一样的,仅仅是vim可以高亮显示 一般:yy(复制)p(粘贴) u(撤销) x(删除单个字母) 编辑:i(光标前)、I(行首)、o(下一行)、O(上一行)

    2023-04-19
    144
  • Mysql之Binlog「终于解决」

    Mysql之Binlog「终于解决」1、简述 binlog 二进制日志文件,这个文件记录了MySQL所有的DML操作。通过binlog日志我们可以做数据恢复,增量备份,主主复制和主从复制等等。 2、Docker中无法使用vim问题解决

    2023-05-24
    143
  • Python常用库总结

    Python常用库总结Python是一门广泛应用于数据科学和机器学习领域的开源编程语言。Python提供了许多有用的构建块,其中一些最重要的构建块是Python库。

    2024-06-10
    57
  • sql查询太慢,如何优化_数据库只有一个模式

    sql查询太慢,如何优化_数据库只有一个模式本文将介绍三种数据库变慢场景的分析与优化方法.

    1、已经定位出的特定慢SQL
    2、整个数据库实例(几乎所有SQL)变慢, 或者某些时候整个数据库实例大面积SQL变慢(大面积抖动)
    3、某些正常情况下

    2023-06-12
    117
  • Python程序员: 用代码实现你想要的功能

    Python程序员: 用代码实现你想要的功能随着互联网的发展,代码已经渐渐成为了一个人在信息时代中的必备技能之一。而Python作为一种简单易学、功能丰富的编程语言,已经成为了各行各业中广泛使用的工具。Python程序员可以用代码实现各种各样的功能:爬取网页数据、解析数据、制作数据可视化图表等等。Python程序员可以做的事情多种多样,本文将介绍几个常见的方面。

    2024-02-11
    99
  • Python实现高效数据处理和分析

    Python实现高效数据处理和分析
    Pandas是Python中一个很重要的数据处理库,提供了类似Excel表格的数据结构,可以用于数据清洗、聚合、重构、分组、统计等操作。使用Pandas创建的数据结构,例如DataFrame、Series等,可以直接读取和写入多种文件格式,包括CSV、HTML、JSON、SQL等。同时,Pandas还提供了灵活和高效的数据读取和写入函数,能够处理非常大的数据集。

    2024-01-06
    107

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注