前几天我在 Invision 网站上,出于某种原因,我想获取他们的徽标。 有时候,你可能比谷歌图片搜索或甚至普通网络搜索(例如“Invision 徽标”)并希望找到带有徽标工具包下载的某种品牌页面,能有更好的运气(就像当你高兴地发现它是 SVG 时)。
因此,我右键单击了他们的徽标,希望用 DevTools “检查”它并查看它。
它没有显示上下文菜单,而是触发了一个模态窗口

我很高兴,因为这正是我想要的。
这是一个简单的零依赖方法
查看 CodePen 上 Chris Coyier 的笔 右键单击徽标以显示徽标选项 (@chriscoyier)。
你的应用程序可能已经拥有一个完整的炫酷系统来显示模态窗口。 如果是这样,那么它就更简单了。 将“右键单击”事件(实际上称为 contextmenu
)附加到徽标并执行你的操作。
logo.addEventListener('contextmenu', function(event) {
// do whatever you do to show a modal
}, false);
如果你没有模态窗口系统,那么创建一个简单的系统非常容易。 你需要一个覆盖层和一个模态窗口元素
<div class="overlay" id="overlay"></div>
<div class="modal" id="modal">
<h3>Looking for our logo?</h3>
<p>You clever thing. We've prepared a <a href="#0">.zip you can download</a>.</p>
<p><button id="close-modal-button">Close</button></p>
</div>
以及一个计划
- 右键单击徽标时,显示覆盖层和模态窗口
- 单击关闭按钮时,隐藏它们
没问题
var logo = document.querySelector("#logo");
var button = document.querySelector("#close-modal-button");
var overlay = document.querySelector("#overlay");
var modal = document.querySelector("#modal");
logo.addEventListener('contextmenu', function(event) {
event.preventDefault();
overlay.classList.add("show");
modal.classList.add("show");
}, false);
button.addEventListener('click', function(event) {
event.preventDefault();
overlay.classList.remove("show");
modal.classList.remove("show");
}, false);
最基础的样式
.overlay {
position: fixed;
background: rgba(0, 0, 0, 0.75);
top: 0;
left: 0;
width: 100%;
height: 100%;
display: none;
}
.overlay.show {
display: block;
}
.modal {
position: fixed;
left: 50%;
width: 300px;
margin-left: -150px;
top: 100px;
background: white;
padding: 20px;
text-align: center;
display: none;
}
.modal.show {
display: block;
}
.modal > h3 {
font-size: 26px;
color: #900;
}
永远不要破坏默认的上下文菜单,并用你自己的自定义行为覆盖它 OMG 你是邪恶的巨魔,你本不应该出生
你说得对! 我的天啊,我做了什么! 永远不能改变! 杀人般的尖叫!
这是一个解决获取新闻页面徽标问题的绝佳方法。 许多网站将所有图像拼合在一起,因此很难快速获取它们的徽标。 大多数情况下,我会使用截图工具来获取没有直接图像的地方。 但是,如果源网站或目标网站有非白色背景,则这种方法并不完全有效。
为什么不只是停止在右键单击时传播事件呢?
我通常喜欢这个想法。
但是,这似乎会带来一些可访问性问题。 如果你右键单击以打开一个新标签页/窗口(假设徽标链接到主页),会发生什么? 我同事中使用这种特定方法打开新标签页的人数令人惊讶。 此外,在移动设备上,“上下文菜单”实际上是打开新标签页的唯一方法。
总之,值得考虑。
Command/Control + Click 仍然有效,我相信使用滚轮鼠标的中键单击也应该有效。 只是提一下,否则我同意你的观点。
我总是通过上下文菜单在新标签页中打开链接。
我检查过,Chris 的代码也会影响键盘上下文菜单 :-/
我第一次遇到脚本化的上下文菜单处理程序是在一个艺术家页面上,它试图阻止我检查她的网页(我可以通过菜单栏 -> 编辑进行检查)。
回到正题,我不建议编写上下文菜单的脚本,因为它会破坏许多人的 UX,只为了取悦少数人。
有两种可能的解决方案
不要阻止上下文菜单打开(显示菜单和覆盖层)
在第二次右键单击时显示上下文菜单(YouTube 在视频上这样做)
始终先在这里检查:http://www.brandsoftheworld.com/,以了解矢量选项。 对于小型公司和大型公司,都有矢量文件。
仅仅是出于礼貌。 他们没有 InVision,但如果确实需要矢量,这是一个很棒的工具。
还要记住这一点:https://css-tricks.org.cn/an-interview-with-andy-fitzsimon-about-logomono/
http://logos.wikia.com/wiki/Logopedia 也是一个绝佳的资源,可以了解最新矢量徽标以及许多公司和产品的历史徽标。
啊,你写的时候是在想我吗? <3
我大部分时候都还好。 当你无法长按徽标(我经常这样做)时,在新标签页中打开主页会变得很麻烦。 至少桌面还有替代方法(Ctrl+单击/MB3),但并非所有人都知道或使用它们。
但只是在页脚添加一个链接会害死任何人吗?
[关于] [品牌] [联系]
我同意 Nadya 的观点。 如果网站有先见之明,可以将图像打包在一起方便下载,为什么要隐藏在徽标后面呢。 将工具提示(标题)文本设置为将访问者引导到页面底部的链接。 不要覆盖上下文菜单,将你的善意作为一项功能,并为你的徽标感到自豪。
好吧,所以其他人所说的一切都很好,但你忘记了一件事
键盘可访问性,该死的!
如果你要告诉人们如何开发对话系统,至少告诉他们这很糟糕,任何使用键盘浏览他们网站的人都会永远讨厌他们。 如果你不能自己开发可访问的东西,请尝试使用 jQuery UI 等东西,它已经具有(相对合理的)可访问性。
附言:你应该也用 ARIA 做标记,但这比键盘可访问性(在我作为视力障碍开发者和网页用户的观点中)稍微不那么重要。
大多数键盘都有一个上下文菜单按钮(位于右 Ctrl 左边)。
我可以使用键盘很好地浏览示例
Tab(聚焦徽标)
ContextMenu(打开对话框)
Tab Tab Space(关闭对话框)
但对于更复杂的网站,这将无法正常工作,因为你必须浏览所有内容。 对话框在第一次打开时不会获得焦点,也不会捕获焦点(它是视觉上的模态,所以为什么键盘上没有?)。 这就是我的观点。 对不起,我没有表达得足够清楚。
我记得很久以前(大约 2011 年)在 Aksimet 网站上第一次看到过这个,但出于某种原因,他们停止了这种做法。
撇开不可避免的可访问性问题不谈,它是一个非常有用的功能添加 - 尤其是在它阻止像 Johnny Marketing Exec 这样的人从 Google 中获取低分辨率 PNG 或从 Brands of the World 中获取过时的、矢量化效果差的版本时。
说真的,我在我的代理公司浪费了数小时的时间来修复颜色不正确、缩放比例很差以及错误的徽标,这些徽标是客户在某个 CES 或 MWC 主题演讲或其他活动中要用来让自己尴尬的。50 种蓝色,有人吗?
真的很有创意。应该尽快使用。
感谢 Chris 的文章!
我在 StackOverflow 上投票率最高的答案之一是在右键单击元素时创建个性化菜单,请查看:http://stackoverflow.com/a/20471268
它包含所有花里胡哨的东西,包括这个缺少的一些功能。
单击外部(但不在内部某个地方)时关闭。
使用
data-action
处理内部点击。这是一个略微不同的用例,但许多代码是可重复使用的(
我完全同意“永远不要破坏默认的上下文菜单,并用你自己的自定义行为覆盖它”,我在为 #a11y 设计时了解到这一点。
我永远不会使用它的唯一原因是,需要此功能的用户数量远少于它会给不理解为什么此弹出窗口出现的人带来的困惑或错误。
此外,在页脚或其他地方(在搜索中?)添加指向新闻包、品牌包等的链接,这正是设计师会寻找的东西。
此外,这是一种非标准的导航策略。它是可发现的吗?也许吧,但这是否值得疏远正常用户?对我或我的客户来说,过去从未如此。
最后,这是一条滑坡。考虑任何类型的资源,内容图片、文档、视频等……你有多少地方可以用“预测”用户想要做什么的目标来替换上下文菜单?滑坡很滑,最好不要为了一个非常小用户群的一点微不足道的利益而去接近它们。
这对我来说从来就不是一个真正的问题。
这太棒了!
除了设计师和 web 开发人员之外,没有人会看到这个……而且它非常有用!感谢分享这个可爱的代码片段!
这是一个非常糟糕的想法,我不知道你是如何写出这整篇文章的,却没有意识到你在给很多人建议,让他们为了一个大多数用户(包括我自己)永远不会需要的任意功能来覆盖基本的浏览器功能。太傻了!
我喜欢这个想法。
你仍然可以在这个模态中显示一个指向主页的“_blank”链接。
shift + 右键单击可以解决这个问题。
对于所有说这是一个糟糕主意,它毁了所有与任何东西相关的事的人……你知道它存在于 invision 吗?在 Chris 写这篇文章之前,你有没有注意到过它?
我之前从未听说过这个网站,但我猜你的意思是我们没有遇到问题,所以这不是一个坏主意。
我的担心是,这种事情让我想起微软/苹果/谷歌/Gnome/Ubuntu,为什么决定对界面进行任意更改,因为这符合某个 UI 设计师的个人想法,而不是明智的决定。然后,同样的原则像癌症一样蔓延。
为什么不替换所有链接的所有右键单击菜单呢?未来可能会从相同的 UX 设计师那里出现一个类似的有说服力的论据……
或者页面内容上所有图片的所有右键单击菜单?也许你太年轻,不记得这件事了,但几年前,这在互联网上是一场灾难,目的是阻止人们从网站上“窃取”内容。是的,这很普遍。
想想如果这个想法一直存在并得到认可会怎么样?或者如果浏览器供应商决定直接删除所有右键单击菜单以“给我们更好的体验”?那么,本文中关于右键单击的概念将不再可能。
所以,是的,它很可能会大规模地破坏大量浏览器界面/网站/谁知道是什么,因为开始做这样的事情。
我真心希望老人的智慧永远不会过时,否则我们可能会注定在未来把自己重复到一个无法摆脱的角落。
我会使用
<menu>
和<menuitem>
标签来增强浏览器,而不是破坏它。不幸的是,它仍然缺乏支持。http://codepen.io/lemnis/pen/vGXwdw
浏览器支持:https://caniuse.cn/#feat=menu
感谢将上下文菜单移到 HTML 的底部,以帮助鼓励“在屏幕可见区域内”的最佳实践。