您在需要网页上的按钮供用户点击时使用它,对吧?好吧,不幸的是,它比这要复杂一些。不过也并不太糟糕,让我们来弄清楚吧。
它看起来像这样
<button>
Do Something
</button>
点击网站上的某个东西最常见的结果是什么?移动到一个新的 URL,就像点击一个链接(一个 <a href="/example/"></a>
)元素。
<button>
元素本身无法做到这一点。多年来,一直有关于允许“任意位置的 href”的各种 讨论,但什么也没发生。
点击按钮确实会执行某些操作,当在自然环境中使用时...
按钮是一个表单元素
网页表单有提交按钮。您可以这样想
<form action="/" method="post">
<input type="submit" value="Submit">
</form>
<form>
中的 <button>
元素默认情况下与上面的提交输入行为完全相同。
<form action="/" method="post">
<button>Submit</button>
</form>
无论 UX 多么糟糕,表单也可以有重置按钮。您可以通过将默认提交类型更改为重置来复制此行为。
<form action="/" method="post">
<button type="reset">Reset</button>
</form>
点击该按钮将清除所有其他输入(和文本区域),以及父 <form>
。
按钮可以包含内容
使用 <button>
的主要原因是它同时具有开始和结束(</button>
)标签。这意味着里面可以有内容。一个常见的用例是
<button>
<img src="tiny_birthday_cake.png" alt="">
Submit
</button>
虽然输入可以是 <input type="image">
,但这种混合内容很难实现。
您可能可以将任何 HTML 放入按钮中,但 MDN 指出 按钮的“允许内容”仅限于 “短语内容”。短语内容是 HTML 元素的有限子集,它“定义文本及其包含的标记。短语内容的运行组成段落。”
伪元素 也可以使用。
让我们将样式化 <button>
留到以后再谈,但不同的浏览器通常会对按钮应用特殊的样式。您需要保留这种样式,以便默认样式生效,或者彻底删除它,以便您的新样式在所有浏览器中保持一致。
让我们考虑一下:“如果按钮没有有意义的 href,它就是一个 <button>”
我最近说我喜欢 这种说法。这是我开始写这篇文章的原因。当时,我在想我如何喜欢它的语义。就像
<a href="#0">
I'm kinda sick of doing this for buttons.
</a>
那里没有有意义的 href。0 只是为了防止页面跳转,因为 ID 不能以数字开头.
很有可能,像上面这样的 HTML 意味着:我将使用 JavaScript 使点击它执行某些操作。不知何故,这感觉比 <div>
更好,因为您获得了光标变化以及其他默认样式。
如果您不喜欢这些没有意义的 href,<button>
似乎是一个不错的选择。但不幸的是,在 <form>
上下文之外,<button>
也同样没有意义。
<button>
Outside of a <form>, I'm just as useless.
</button>
但 <button> 感觉更好
即使 <button>
在没有 JavaScript 帮助的情况下,在表单之外什么也不做,它仍然对您可以点击以执行更改页面以外操作的事物感觉更好。虚假的 href 链接绝对感觉不对。
好的。然后我们用 JavaScript 插入它。
这可能是最好的解决方案。如果可点击元素要执行任何操作都需要 JavaScript,那么它可能根本不应该存在,除非 JavaScript 运行。我们可以执行
// 1. Create the button
var button = document.createElement("button");
button.innerHTML = "Do Something";
// 2. Append somewhere
var body = document.getElementsByTagName("body")[0];
body.appendChild(button);
// 3. Add event handler
button.addEventListener ("click", function() {
alert("did something");
});
您可以轻松地将“添加按钮”作为 JavaScript 工作流程的一部分。
何时链接更有意义
如果可以在该链接上添加任何有意义的 href,那么请务必使用锚点。即使您用 JavaScript 覆盖了这种行为。这是渐进式增强最棒的体现。例如
- 搜索按钮通常会触发一个类型提前的 ajax 搜索小部件 - 但 href 可以直接指向 /search/ 页面。
- 发布按钮会触发用户创建内容的发布的下一阶段 - 但 href 可以直接指向 /publish/ 页面。
- 缩略图按钮会打开一个包含较大版本的灯箱 - 但 href 可以直接指向该较大版本的 URL。
如果什么都不合适,请使用 JavaScript 插入按钮。
可访问性问题
假设使用锚点链接确实有意义。在您为自己的渐进式增强能力拍拍手后,还需要考虑可访问性。
您可能想,我懂!
<a href="#meaningful" class="button" role="button">
I'm good
</a>
但您还没有完全脱离困境。 MDN 解释得很清楚
警告:在使用按钮角色标记链接时要小心。预计按钮将使用空格键触发,而预计链接将通过回车键触发。换句话说,当链接被用作按钮时,仅仅添加 role=”button”是不够的。还需要添加一个键事件处理程序,该处理程序监听空格键以与本机按钮保持一致。
明白了吗?您使用不同的键激活链接和按钮,因此请考虑这一点。
继续吧,以正确的方式创建可点击的东西。
好文章。我也发现自己经常使用带有死链接的
<a>
标签,而我很容易使用<button>
代替,尤其是在考虑移动开发时。除了将按钮与表单一起使用外,正如我提到的,在大多数情况下,我并没有看到太多好处,除非您想要它自带的默认样式(或者喜欢对按钮使用 <button> 标签的语义)。
我喜欢“如果按钮没有有意义的 href,它就是一个 <button>” 这种说法,但我通常在这些情况下使用 <div> 而不是 <button>。我注意到使用 <div> 作为按钮的唯一缺点是您必须将 CSS 设置为“cursor:pointer”,否则它在某些移动设备(如 iPhone)上将无法点击。尽管如此,我通常更喜欢使用 <div> 而不是按钮,因为我不喜欢重置按钮的默认样式。
Greg,
使用 div 完全不可访问。它无法通过键盘获得焦点,并且辅助技术无法将其宣布为按钮。Div 没有意义,许多用户无法使用。
然后您还应该为所有“按钮 div”添加 role=button 和有效的“tabindex”,以使其真正像按钮一样工作(例如,对于键盘用户来说是可访问的等等...)。
您仍然无法访问像 :active 这样的 css 属性...
真的值得吗?
我同意 Flunch 的观点。为了正确地模拟原生 < button > 的功能,通常需要花费比重置样式更多的时间,而且也更容易在不知情的情况下出现错误。我认为大多数用户可以与之交互的原生元素都是如此。如果你没有准备好研究所有可访问性影响并测试你的 hack 是否在所有浏览器、设备和辅助技术上都能正常工作,那么你最好还是对语义元素进行样式化(即使这样也有挑战)。
这是一个很棒的技巧,谢谢!在我使用 <div> 添加 :hover/:active 状态的所有情况下,从来没有出现过问题,因为无论如何我都要对这些状态进行样式化(更改文本颜色,添加 box-shadow 等)。但是,使用 <a> 标签就出现了问题,因为我需要删除下划线、蓝色、活动时的红色和访问过的链接的紫色。:visited 选择器是链接所具有的 <div> 所没有的,它不是一个问题,因为它在使用这种方法的情况下不会给用户带来任何好处。
对于 <button>,我还需要重置其他样式,以及一些有趣的跨浏览器问题,比如这个:http://doctype.com/submit-element-text-moves-over-few-points-active-firefox-only,这些问题调试起来很麻烦。
另外,添加两个空格键和回车键来执行函数。
即使你做了所有这些额外的工作,语音控制应用程序 Nuance Natural Speak 也不会识别“按钮”,因为它不读取可访问性 API,也不关心 ARIA (role=button)。它只读取 DOM,并查找按钮或 a 元素。
请使用
<button>
!只要存在这个问题:http://stackoverflow.com/questions/3110564/remove-the-complete-styling-of-an-html-button- <button> 就不是一个可接受的选择,除非你能够接受这种行为(我不能)。不过,我将考虑根据本文的建议,在必要时使用 <a> 标签。如果这意味着我能控制元素在不同浏览器中的功能,我乐意做所有额外的工作。冒着显得不敏感的风险(可能现在说太晚了),为什么 Nuance Natural Speak 无法识别可访问性 API 和 role=button 是开发人员的责任?难道不应该怪他们没有改进自己的付费服务吗?
只是关于评论的一个附注:“ID 不能以数字开头”……现在在 HTML5 中,ID 可以是任何非空格字符,并且可以以任何想要的字符开头。
就标准而言,这可能是正确的,但我最近遇到了 Sass 错误,试图编译包含以数字开头的 ID 的 CSS。
只是提醒一下。
这是真的,但如果你想使用 CSS 通过 ID 对该元素进行样式化,那么你就没有办法了。CSS ID 选择器中的 ID 不能以数字开头。
无论如何,在任何语言中,创建以数字开头的变量名或 ID 都是不明智的。
T.J. Crowder 写道
幸运的是,你有办法。
当你仔细阅读规范中你链接的这部分内容时,你会注意到其中描述了在这些情况下该怎么做。
与在给定上下文中具有特殊含义的字符一样,你需要对其进行转义,正如 MaxArt 已经指出的那样。
出于实际原因,建议标识符以字母开头。
罗马数字 FTW。
非常棒的文章,你解释标签和按钮标签的区别的方式非常巧妙。
关于链接和按钮的可访问性问题,这是一篇相关且非常详细的文章
http://www.csskarma.com/blog/polybutton/
这是一篇好文章,开头极具误导性。按钮存在于 HTML 中是为了发送表单或触发脚本功能,而锚元素并非用于此目的。这意味着使用按钮来模仿链接是因为它的外观,而不是它的语义含义。
将 BUTTON 视为交互的 DIV。它没有预定义的行为方式——你必须通过将其添加到表单中或应用事件处理程序来使其调用脚本,才能为其添加行为方式。使用按钮来实现 href 就如同使用带有 javascript: href 的链接一样糟糕。
我重新阅读了好几遍。我觉得我理解了你的意思。我觉得我想要表达的观点和你在这里表达的一样。但如果我毁了互联网,或者其他什么,请见谅。
Greg:DIV 也不是键盘可访问的——这是链接和按钮内置的功能。
啊,知道了。我想知道有多少用例需要考虑这一点,自从我小时候被没收了鼠标以来,我再也没有用过键盘上的 Tab 键来导航页面了。
我一直没有使用
href="#0"
,怎么会这样?感谢这篇文章!我每次都会犹豫......
你可以使用 href=”#nogo” 代替 :)
href="#?"
也是一个不错的选择!我喜欢它,因为它就像 URL 栏中的一个熟悉的朋友。我更喜欢 <a href=”javascript:;”></a> 这种不太吸引人的方法。
Greg,那你真是幸运,你没有残疾,不能使用鼠标。“对我来说有效”并不是可访问性的工作方式。
Greg 可能想看看这篇文章:http://webaim.org/articles/visual/blind
Greg 会看看文章。你可以回复评论,而不是开始一个全新的评论,这样可以避免每次都引用我的名字。我知道屏幕阅读器也存在,我想我本可以换一种方式表达。我相信确实存在一些网站,无论你为图像添加多少 alt 标签,都无法为所有用户提供可访问性。对于新闻网站、博客等为用户提供足够内容,让盲人对他们感兴趣的网站来说,可访问性无疑是一个需要考虑的问题。对于其他网站,比如 codepen.io,我不认为这会是一个问题,因为盲人不太可能从该网站获得任何有价值的东西,因此他们不会想要修改该网站以使其对屏幕阅读器可访问。
这里另一个令人担忧的提示是使用链接来触发表单提交,比如保存按钮。使用 GET 进行表单提交(比如 save/ 这样的链接)是一个巨大的安全问题,因为没有任何东西可以阻止我从 CLI 而不是你的页面进行提交。这就是为什么大多数 CMS 中都使用按钮的原因。
关于使用 GET 进行表单提交,这可能会导致那些预取页面中现有链接的浏览器出现问题。据我所知,如果你使用按钮,就不会出现这个问题。
没错,Mike。我记得 Google 曾经为 IE 和 Firefox 提供过 web accellerator 工具栏(很久以前),它可以预取链接。打开一个旧的 WordPress 网站时,它会删除你的整个数据库,因为“删除文章”只是一个链接。
这是公平的。通常情况下,让保存操作成为 GET 不是一个好主意。我会将其更改为更现实的东西。但我认为要点仍然存在,它指的是指向某个地方的 href,该地方会执行与 JavaScript 驱动的操作相同的事情。
按钮没有 href,而且从来不打算有 href。这就是这里的混淆之处。我们一直在混淆按钮和锚点的用途。
锚点:提供指向另一个位置的链接,指向另一个文档或页面中的目标。
按钮:要么提交表单数据,并定义一旦发送数据应该执行什么操作(例如,添加、删除、更新都包含在同一个表单中),要么作为 JavaScript 需要交互元素。
使用带有大量 GET 参数的 href 是一个非常糟糕的想法,因为链接会被索引。这就是为什么 a 标签不能作为按钮使用。
如果按钮只是简单地重定向到另一个页面,那么要么需要在表单字段中定义要跳转的 URL,要么需要使用 JavaScript 和 document.location。
按钮和锚点对于可访问性来说都非常棒,因为它们支持多种输入格式(触摸、点击、键盘)。如果想以可访问的方式在 HTML 中触发脚本功能,按钮是首选元素,没有其他元素可以做到这一点。
如果以下情况,这一切根本就不是问题:
a) 老 IE 在样式按钮或真正支持它们时不会出现双重提交的怪癖。
b) 锚点不会允许内联事件处理程序或 "javascript:" 伪协议。
只是想补充一下,IOS 上的 Chrome 有预加载页面的选项。
请参见:移动版 Chrome 的带宽管理
很棒。我在项目中很久以前就开始使用
<button>
,这样我就可以使用图标等。根据我自己的测试,我得出了相同的结论,它在 IE7+ 中始终有效,但我很高兴它现在是官方的了 :)。这是一个案例……嘿嘿嘿 :D
如果你在 .NET Framework 中工作,请注意。大多数页面都是表单,使用按钮会导致回调,除非你在按钮点击操作中显式阻止它。这总是让我在 SharePoint 开发中感到困惑。
只有在你使用 ASP.NET WebForms 时才会这样。MVC 和 Razor 页面不需要那种笨拙的破坏网页的过去方法……
嗨,Eric,我认为覆盖默认行为(提交 .NET 表单)最简单的方法是使用
如果你想让它回退到 "submit" 以实现渐进增强,你不应该这样做,但我喜欢它用于 Chris 所描述的 "使用 JS 执行某些操作" 类型的按钮。我发现这比总是要在点击操作中阻止默认行为更简单。
Rodney 在下面提到了它作为表单外按钮的修复方法,但它也解决了我们的 .NET 问题。
如果我想使用 input type=”submit”,但我的表单块中也有执行其他操作的按钮……这些额外的按钮会像提交按钮一样工作吗?
例如,一个带有动态数量的输入行的表单,比如点击一个按钮添加另一个浏览框以进行多个文件上传。
如果你的按钮都在表单内,但有些按钮不是用于提交,则在这些按钮上使用
type=button
。这将抑制提交行为。在 CSS 中测试
content: "warning…" ;
@Heydon,谢谢。
这意味着我们应该写;<button type=”button” role=”button” … 这看起来很奇怪,它是一个按钮元素,该死的。
如果是这样,我会发现仅仅使用一个自动将这些属性添加到页面上每个 <button> 元素的 js 脚本会更容易,除非它专门指定了 type submit。或者,包含在团队遵循的编码规范中。
我通常会有一个表单作为 jquery 函数的一部分提交,因此按钮更有意义,可以避免默认的 SUBMIT 操作。按钮元素也为手风琴或其他 javascript 控件提供了很好的触发器。
首先,我完全同意 Chris H 在他的评论中所说的内容,其次它是
role="button"
,而不是aria-role="button"
:)谢谢,我已经修复了。这可能会令人困惑,因为它们通常被称为 "ARIA 角色",并且许多属性确实以
aria-
开头,但role
却没有。据我所知,按钮中可以放置的内容没有限制……
button
元素可以 包含短语内容,因此有很多东西你不能放在里面。例如,任何流内容,比如blockquote
、div
、p
、nav
、hr
等。好的,上面的第一段被标记为引用,但上面没有显示。
确实有一个限制,在您链接的同一个地方指定:"必须没有交互式内容后代。"。
嘿,Chris,我知道这有点偏离主题,但还有另一种方法可以为以数字开头的元素创建选择器
这将匹配所有 id 为 "123hello" 的元素。除了您在链接的文章中建议的其他方法之外
但这应该也受 IE6 支持……对于那些仍然不得不使用它的人! (我为他们的灵魂祈祷。)
顺便说一句,我最近越来越多的使用
<button>
,但问题是它们默认情况下被浏览器大量使用,因此你可能永远不知道将使用什么样式,并且你可能希望重置。直到appearance
样式属性被普遍采用。 ugh。关于链接或按钮的讨论中没有提到的一种情况是状态。我真的很喜欢在某些情况下简单地禁用触发器元素的可能性。要使用链接做到这一点,需要更多代码,这些代码不容易维护。
当它是一个链接时,应该使用链接。当它不是一个链接时,应该使用按钮。
请注意,
<button>
的默认类型是 "submit"。如果你想使用<button>
来调用除了提交/重置表单以外的操作,请正确指定它:<button type="button">
。Internet Explorer(至少到 IE9,我没有检查过更新版本)在遇到表单外的提交
<button>
时会把事情搞砸。当按钮被点击时,它会尝试提交上一个表单(如果可用)。这可能难以调试。啊,你抢先了……
参考
在 HTML5 中,在表单之外使用 a 标签是完全有效的,并且对于 tab 顺序、可访问性等来说是一个更好的选择。空链接在语义上是误导的。
重要!你真的必须指定一个 type 属性(通常是 type=”button”),因为 IE8- 假设它是一个提交按钮,如果你没有指定……
我喜欢这种方法
但是现在在 javascript 中有属于标记的内容!那么翻译呢?CMS 可编辑的按钮标签呢?解决这个问题的最佳实践是什么?将字符串作为 js 变量输出到标记中的 ?
可能是 JavaScript 模板,特别是如果你要做很多这种操作。
嘿,Chris
你说 "ID 不能以数字开头",但我认为这有点不准确。
在样式表或 html style 元素中,任何 css 选择器都不能以数字开头,是的。
但在 html 属性(id=” 或 class=”) 中是可以的。
因此,你的示例 html 代码是好的且有效的(验证器中没有错误)
为了做到这一点,我们在 css 中有转义字符:
# {/*nice styles */}
我认为
抱歉,我在 css 选择器中遗漏了转义字符
#
将
var body = document.getElementsByTagName("body")[0]
存储起来而不是直接调用document.body
有什么特别的原因吗?我考虑过这个问题,然后记不起有没有方法直接访问
body
,而不必查询它。我对 DOM 的理解是 NEWB。我相信document.body
更好。在较新的浏览器中,也有
document.head
。可惜 IE8(或 Firefox 3.x,但无论如何)不支持它。相反,
document.body
从很久以前就支持了。请记住,根据文档的准备状态,它可能尚未定义。嘿 CHRIS,好文章!
我也在同一页面上使用“button”用于操作,使用“a”用于链接。
; )
在最近的一个网站上,我们使用了
<button>
元素,里面有内容,点击按钮后会显示出来。这是一个合理的用例,因为我们希望整个内容块都是可点击的。它在所有测试过的环境中都能正常工作,但嵌套在按钮内的链接在 Internet Explorer 8 中无法点击。IE8(及更低版本,很可能)不会在
<button>
元素内部注册点击事件,因此按钮内的链接不受支持。示例代码
我尝试跟踪点击的目标,但 IE8 仅将按钮注册为点击。我甚至尝试获取点击的坐标,并将它与按钮内链接的坐标进行比较。但是,最简单的解决方案是用
<div>
替换<button>
。如果其他人也遇到这个问题,就留下它。
我认为这有点道理。你在另一个可点击元素内有一个可点击元素。虽然你可能为此有自己的理由,但它看起来更像一个有缺陷的 UX 界面。
微软认为破坏默认行为是可以的。这很正常。
@Chris
假设我们在表单中有一个以下按钮元素
<button name="test" value="val1">val2</button>
哪个值test变量将保存
val1
或val2
Chris 的文章很好。它只是证实了我一直以来的信念:“优先使用原生 HTML 元素而不是 ARIA 角色”。因此,如果你有一个按钮,就让它成为一个按钮,不要放置一个带有 role=”button” 的链接,从语义和性能方面来说,这都是更好的选择。
<button onclick="ajaxload(this.firstChild.getAttribute('href'))"><a href="/stuff">转到内容</a></button>
怎么样?:D
感谢你的信息,Chris!我经常在内心进行同样的讨论,但你增加了更多深度和信息。我不知道不同的键盘触发器,这是非常重要的。
我还想分享今天遇到的一个问题。在 IE 8(可能还有其他浏览器 - 我没有尝试过),当一个按钮处于
:active
状态时,它会添加一些格式以呈现“3D 按压”效果,将文本向右和向下移动 1 像素,并将背景位置向左和向上移动 1 像素。似乎也添加了一些边距。真正干净地解决它的唯一方法是使用<a>
。 (你可以对button:active
进行一些样式设置以撤消其中一些,但这在我的情况下不起作用,因为我有一个:after
,它也被弄乱了)。因为我使用按钮在页面上触发操作,而不是进行导航,所以我想使用
<button>
,但由于我不得不切换,我正在考虑将它们包装在<menu>
列表中以获得更多语义。真实故事
在我的 HTML 模型中,我使用:
<button class="btn">搜索产品</button>
。将 HTML 交给海外开发人员,现在按钮变成了:
<input type="submit" value="Search Products" class="btn">
¬¬
伙计!
好文章。仍然想知道是什么让它对许多开发人员如此有吸引力 ^^
仍然想知道是什么让
<input type="submit">
对许多开发人员如此有吸引力 ^^(忘记使用内联代码)因为他们不知道有一个叫做
<button>
的 HTML 元素,所以他们一直使用他们知道的唯一东西(而且许多人仍然只知道),<input type="submit">
。好吧,按钮可以使用空格键或回车键触发,对吧?
@Brecht
对
<input type="submit">
的偏好是普遍使用的,因为<button>
在 Internet Explorer 中存在臭名昭著的错误。我不记得在旧版本的 IE 中
<button>
有任何重大错误/问题。但是有。请参阅此处“注释”部分https://mdn.org.cn/en-US/docs/Web/HTML/Element/button
确实,我现在明白了。我一起工作的 Web 程序员从未提到过此事。
不确定 MDN 中的信息是否在 8 年(甚至更久)前就已记录。如果当时有,那就非常有帮助了。
你关于“重置”按钮的说明有点误导性
<
form>。
重置按钮实际上是一个非常强大的工具,如果使用得当 - 它会将表单重置为加载状态。因此,如果我正在编辑一个带有现有值的现有表单(例如编辑现有数据库条目),单击“重置”会将值设置回原值 - 而不是清除它们。同样,如果使用得当,这可以为用户在表单上犯错时节省时间。
每次看到重置按钮位于提交按钮旁边时,我都会向用户体验、可用性和交互设计之神祈祷,希望启迪用户正确地对准他们的光标和粗手指,点击/轻触那个荣耀的提交按钮。
要让表单中的按钮元素不表现得像按钮,你也可以这样做
<button type="button>操作</button>
这将阻止它尝试提交你的表单,而且比添加 jquery 的
preventDefault();
方法快得多。我在文章中遗漏了一点,那就是(对我来说)在表单中使用按钮更有意义,因为它们允许我指定一个与按钮上显示的文本不同的值。因此,可以执行以下操作
这是有效的,因为只有使用过的按钮的值才会发送到服务器。我不确定它是否应该这样使用,但它对我来说非常有用。这不仅无法用
input
来实现,而且它使后端编程变得容易很多,因为你可以重新设置按钮文本而不影响发送到服务器的代码。在多语言环境中也非常有用。我学到了一个新技巧。谢谢!
不客气!
Chris,好文章!如果我们不通过 JavaScript 创建按钮,而只是使用“no-js”body 类方法将它们“display:none”呢?你认为这会导致任何问题吗?
Chris,我认为混合内容层(HTML)和行为层(JS)不是一个好主意,或者至少不是你所指的最佳解决方案。除了它不能很好地扩展,如果你关心可访问性,你可能也要关心那些没有启用 JavaScript 的人。
我认为,随着网络的发展,并非所有 HTML 元素都必须具有预定义的行为。比如说,并非所有按钮都必须在没有 JS 的情况下执行某些操作,例如提交、重置等。
我认为你对 JavaScript 的作用太过教条化。我们在这里讨论的是一个按钮,如果没有 JavaScript,它根本没有任何功能。让它出现在页面上本身就是对可访问性不利的事情。关于扩展性,我不确定你的想法是什么。我可以很好地想象我应用程序中的一个 JavaScript 文件,它使用一个很好的可扩展模板处理在需要的位置注入按钮。
有时成为一个 Web 程序员真的会让你头疼,按钮标签一直是许多人的困扰。希望随着 Web 标准的不断发展(微软,请努力跟上),按钮方面的问题不会像过去那样普遍。
随着当今响应式设计的发展,它们应该是一个增强用户体验的方面,而网站开发者无需付出任何努力 - 我们不应该在当今时代还要进行这样的黑客攻击和调试,对吧?
免责声明:我不必担心 IE8 及更低版本。
我为所有移动设备(除黑莓和Opera Mini外,所有智能手机和平板电脑)开发移动网页。从一年前我继承的代码库开始,将充当按钮的链接转换为按钮类型=按钮,缩减了代码库,并且许多设备特定的问题都消失了,从那时起一直非常顺利。
是的,<button>标签不适用于旧版本的IE浏览器,Greg链接的问题特指<input type=”button”>,它与<button type=”button”>不相同,正如Chris所指出的那样,你通常需要在表单的上下文中定义类型,<button>将默认设置为类型提交,因此在表单内的任何位置按回车键都会有后果。
我所有的按钮都可以在点击、轻触、空格键和回车键上本地触发,并且都可以聚焦,可以在没有tabindex的情况下进行访问,也可以进行制表符操作。我不需要像为充当按钮的按钮样式化链接那样监听按键事件或阻止默认行为。
我强烈建议,如果你不需要支持旧版本的浏览器,当我提到支持时,我的意思是让它看起来完全一样。现在,大多数客户都可以接受在表格上看起来更好、更实用的网站,而不是让IE8及以下版本看起来一样好。
是的,按钮样式可能需要使用CSS重置,但这不应该是一个大问题。
还值得注意的是,虽然你可能不需要担心508合规性,但这样做出乎意料地会让支持所有各种设备变得更容易。
例如,当我提到更容易时,我指的是我不需要监听轻触事件。我所做的一切都是点击,按键事件将调用点击,轻触事件将调用点击,假设我为任务使用了正确的元素(和属性)。
我最近学到的一点是,我不能在iOS设备上自动播放声音。它必须来自用户点击/轻触,以允许声音第一次播放,你不能通过javascript调用点击,它必须来自用户,这对508来说很好,因为用户有机会让屏幕读取,然后选择点击。
这篇文章对我来说真是太及时了。我之前没有考虑过的一些东西。我刚开始使用
<button>
,我需要学习一些东西。当它在IE8中无法使用时,我开始慌了,但这很容易修复。除了所有提到的实用原因之外,它比使用输入或样式化的锚标签感觉好多了。谢谢,Chris。我同意你写的大部分观点。虽然我对你在“链接更合理的情况”部分描述的一件事感到非常惊讶。
我严重怀疑这适用于链接标签,即使你试图为它提供一个有意义的href。你能澄清一下这部分吗?有点误导性:)
form
标签的action
属性包含URL(通常情况下),浏览器将在提交后默认加载此URL。好的,那不是一个很好的例子,抱歉。这个例子应该是一个由提交按钮触发的类型提前的ajax-searchy输入,但它是作为一个真正的
<form>
(如你所建议的)构建的,具有一个action
属性,该属性指向一个页面,该页面在服务器端执行其需要做的事情并渲染一个有用的页面。这是渐进式增强的典范,真的。我刚读了你链接的文章“ID不能以数字开头”,你说“类标识符可以以数字开头”!!这并不正确。我知道,因为在我意识到我不能这样做之前,我尝试过多次让类名以数字开头。所以这是个错误还是有办法让它生效?
我知道几种语言,但我记不起任何语言允许在变量/ID名称开头使用数字。
请注意,你放在HTML页面上的所有内容都将变成“DOM”中的某些东西......这意味着语言、代码、ID、变量名等。
应尽一切努力避免ID以数字开头,即使你发现浏览器或情况允许它工作,你也应该谨慎行事。
PS:对于那些使用JS在页面上循环遍历元素的人,例如#myRow1、#myRow2...那么1)只需将数字放在末尾,2)或者,不要使用ID,学习更好的方法来循环遍历这些元素,使用“选择器”和类似.each()函数的函数,使用JS库(例如jQuery)。
ID和类可以轻松地以数字开头(任何非空格字符,包括所有unicode字符)。只需转义特定字符或使用unicode代码点,如前面所述:https://css-tricks.org.cn/use-button-element/#comment-1066440
这是根据HTML规范。只有HTML <=4对这些属性有限制。
至于HTML源代码成为DOM的问题;DOM完全能够处理unicode。特殊字符是所有语言词法分析器/解析器处理的问题。它们处理的方式都一样:转义。特殊字符只有在作为文本序列化时才是特殊的。当读入它们的内存结构(如DOM或AST或其他)时,它们并没有什么特殊之处。它们只是一些字符(或标记)。
我忘了说我说的只是css类名。
我不确定我是否理解你的意思。我认为你指的是HTML类属性(因为没有css类这样的东西)。
但HTML规范指出,
id
和class
属性具有相同的字符要求;当然,除了id
不能包含空格,而class
是一系列规范分隔的标记。但这些标记本身遵循相同的规则。也就是说,任何字符都是有效的(在任何位置),除了空格。因此,类名选择器中的前导数字需要使用与id选择器相同的规则进行转义:使用unicode代码点。
关于CSS和JS中转义标记的详细说明
不错!+10,因为这是一个完整的解释,我读了太多毫无意义的文章,这篇包含了我需要的所有东西。
在我的工作中,每个人都使用一些“脏代码”只是为了在按钮中放置一张图片,甚至使用表格来使它像他们想要的那样适合,并使用里面的链接将用户发送到另一个页面。
我遇到了问题,因为当按钮位于表单内时,它总是“提交”表单,但我们并没有“提交”任何东西,现在我们使用javascript或jquery管理表单的值,然后使用xajax发送它。
为了防止按钮提交它所在的表单,它需要将‘type’属性设置为‘button’。 https://mdn.org.cn/en-US/docs/Web/HTML/Element/button?redirectlocale=en-US&redirectslug=HTML%2FElement%2Fbutton#attr-type
但我建议不要让你的整个表单都依赖JavaScript。相反,表单应该在没有JS的情况下正常工作。使用JS来增强表单并通过Ajax提交;但不要让它成为必需的。