Vue 3.0 语义学 实例详解
#表单
当创建一个表单,你可能使用到以下几个元素:<form>
、<label>
、<input>
、<textarea>
和 <button>
。
标签通常放置在表单字段的顶部或左侧:
<form action="/dataCollectionLocation" method="post" autocomplete="on"> <div v-for="item in formItems" :key="item.id" class="form-item"> <label :for="item.id">{{ item.label }}: </label> <input :type="item.type" :id="item.id" :name="item.id" v-model="item.value" /> </div> <button type="submit">Submit</button> </form>
完整实例:
<template> <div id="app" class="demo"> <h1>Simple Form</h1> <form action="/dataCollectionLocation" method="post" autocomplete='on'> <div v-for="item in formItems" :key="item.id" class='form-item'> <label :for="item.id">{{ item.label }}: </label> <input :type="item.type" :id="item.id" :name="item.id" v-model="item.value"> </div> <button type="submit">Submit</button> </form> </div> </template> <script> export default { data() { return { formItems: [ { label: 'First Name', id: 'first-name', type: 'text', value: '' }, { label: 'Last Name', id: 'last-name', type: 'text', value: '' }, { label: 'Email', id: 'email', type: 'email', value: '' }, ] }; } }; </script> <style> .demo { font-family: sans-serif; border: 1px solid #eee; border-radius: 2px; padding: 20px 30px; margin-top: 1em; margin-bottom: 40px; user-select: none; overflow-x: auto; } .form-item { margin: 1em auto; } .form-item label { display: block; } button { font-size: 1em; } </style>
注意如何在表单元素中包含 autocomplete='on'
,它将应用于表单中的所有输入。你也可以为每个输入设置不同的自动完成属性的值。
#标签
提供标签以描述所有表单控件的用途;链接 for
和 id
:
<label for="name">Name</label> <input type="text" name="name" id="name" v-model="name" />
完整实例:
<!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Vue 3.0 语义学</title> <script src="https://unpkg.com/vue@3.0.0/dist/vue.global.js"></script> <style> </style> </head> <body> <script> <template> <form class="demo" action="/dataCollectionLocation" method="post" autocomplete="on"> <div class="form-item"> <label for="name">Name:</label> <input type="text" name="name" id="name" v-model="name" /> </div> <button type="submit">Submit</button> </form> </template> <script> export default { data() { return { name: "" }; } }; </script> <style> .demo { font-family: sans-serif; border: 1px solid #eee; border-radius: 2px; padding: 20px 30px; margin-top: 1em; margin-bottom: 40px; user-select: none; overflow-x: auto; } .form-item { margin: 1em auto; } .form-item label { display: block; } button { font-size: 1em; } </style> </script> </body> </html>
可以使用本站在线JavaScript测试工具测试上述代码运行效果:http://www.phpcodeweb.com/runjs.html
如果你在 chrome 开发工具中检查这个元素,并打开 Elements 选项卡中的 Accessibility 选项卡,你将看到输入是如何从标签中获取其名称的:
警告:
虽然你可能已经看到这样包装输入字段的标签:
<label> Name: <input type="text" name="name" id="name" v-model="name" /> </label>
辅助技术更好地支持用匹配的 id 显式设置标签。
#aria-label
你也可以给输入一个带有aria-label
的可访问名称。
<label for="name">Name</label> <input type="text" name="name" id="name" v-model="name" :aria-label="nameLabel" />
完整实例:
<!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Vue 3.0 语义学</title> <script src="https://unpkg.com/vue@3.0.0/dist/vue.global.js"></script> <style> </style> </head> <body> <script> <template> <form class="demo" action="/dataCollectionLocation" method="post" autocomplete="on"> <div class="form-item"> <label for="name">Name:</label> <input type="text" name="name" id="name" v-model="name" :aria-label="nameLabel"/> </div> <button type="submit">Submit</button> </form> </template> <script> export default { data() { return { name: "", nameLabel: "This label will take over the accessible name" }; } }; </script> <style> .demo { font-family: sans-serif; border: 1px solid #eee; border-radius: 2px; padding: 20px 30px; margin-top: 1em; margin-bottom: 40px; user-select: none; overflow-x: auto; } .form-item { margin: 1em auto; } .form-item label { display: block; } button { font-size: 1em; } </style> </script> </body> </html>
可以使用本站在线JavaScript测试工具测试上述代码运行效果:http://www.phpcodeweb.com/runjs.html
请随意在 Chrome DevTools 中检查此元素,以查看可访问名称是如何更改的:
#aria-labelledby
使用 aria-labelledby
类似于 aria-label
,除非标签文本在屏幕上可见。它通过 id
与其他元素配对,你可以链接多个 id
:
<form class="demo" action="/dataCollectionLocation" method="post" autocomplete="on" > <h1 id="billing">Billing</h1> <div class="form-item"> <label for="name">Name:</label> <input type="text" name="name" id="name" v-model="name" aria-labelledby="billing name" /> </div> <button type="submit">Submit</button> </form>
完整实例:
<!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Vue 3.0 语义学</title> <script src="https://unpkg.com/vue@3.0.0/dist/vue.global.js"></script> <style> </style> </head> <body> <script> <template> <form class="demo" action="/dataCollectionLocation" method="post" autocomplete="on"> <h1 id="billing">Billing</h1> <div class="form-item"> <label for="name">Name:</label> <input type="text" name="name" id="name" v-model="name" aria-labelledby="billing name"/> </div> <button type="submit">Submit</button> </form> </template> <script> export default { data() { return { name: "" }; } }; </script> <style> .demo { font-family: sans-serif; border: 1px solid #eee; border-radius: 2px; padding: 20px 30px; margin-top: 1em; margin-bottom: 40px; user-select: none; overflow-x: auto; } .form-item { margin: 1em auto; } .form-item label { display: block; } button { font-size: 1em; } #billing { margin: 0; } </style> </script> </body> </html>
可以使用本站在线JavaScript测试工具测试上述代码运行效果:http://www.phpcodeweb.com/runjs.html
#aria-describedby
aria-describedby 的用法与 aria-labelledby
相同,预期提供了用户可能需要的附加信息的描述。这可用于描述任何输入的标准:
<form class="demo" action="/dataCollectionLocation" method="post" autocomplete="on" > <h1 id="billing">Billing</h1> <div class="form-item"> <label for="name">Full Name:</label> <input type="text" name="name" id="name" v-model="name" aria-labelledby="billing name" aria-describedby="nameDescription" /> <p id="nameDescription">Please provide first and last name.</p> </div> <button type="submit">Submit</button> </form>
完整实例:
<!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Vue 3.0 语义学</title> <script src="https://unpkg.com/vue@3.0.0/dist/vue.global.js"></script> <style> </style> </head> <body> <script> <template> <form class="demo" action="/dataCollectionLocation" method="post" autocomplete="on"> <h1 id="billing">Billing</h1> <div class="form-item"> <label for="name">Full Name:</label> <input type="text" name="name" id="name" v-model="name" aria-labelledby="billing name" aria-describedby="nameDescription"/> <p id="nameDescription">Please provide first and last name.</p> </div> <button type="submit">Submit</button> </form> </template> <script> export default { data() { return { name: "" }; } }; </script> <style> .demo { font-family: sans-serif; border: 1px solid #eee; border-radius: 2px; padding: 20px 30px; margin-top: 1em; margin-bottom: 40px; user-select: none; overflow-x: auto; } .form-item { margin: 1em auto; } .form-item label { display: block; } button { font-size: 1em; } #billing { margin: 0; } </style> </script> </body> </html>
可以使用本站在线JavaScript测试工具测试上述代码运行效果:http://www.phpcodeweb.com/runjs.html
你可以通过使用 Chrome 开发工具来查看说明:
#占位符
避免使用占位符,因为它们可能会混淆许多用户。
占位符的一个问题是默认情况下它们不符合颜色对比标准;修复颜色对比度会使占位符看起来像输入字段中预填充的数据。查看以下示例,可以看到满足颜色对比度条件的姓氏占位符看起来像预填充的数据:
完整实例:
<!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Vue 3.0 语义学</title> <script src="https://unpkg.com/vue@3.0.0/dist/vue.global.js"></script> <style> </style> </head> <body> <script> <template> <form class="demo" action="/dataCollectionLocation" method="post" autocomplete="on"> <div v-for="item in formItems" :key="item.id" class='form-item'> <label :for="item.id">{{ item.label }}: </label> <input type="text" :id="item.id" :name="item.id" v-model="item.value" :placeholder="item.placeholder"> </div> <button type="submit">Submit</button> </form> </template> <script> export default { data() { return { formItems: [ { label: "First Name", id: "firstName", value: "", placeholder: "Evan" }, { label: "Last Name", id: "lastName", value: "", placeholder: "You" } ] }; } }; </script> <style> .demo { font-family: sans-serif; border: 1px solid #eee; border-radius: 2px; padding: 20px 30px; margin-top: 1em; margin-bottom: 40px; user-select: none; overflow-x: auto; } .form-item { margin: 1em auto; } .form-item label { display: block; } button { font-size: 1em; } /* https://www.www.phpcodeweb.com/howto/howto_css_placeholder.asp */ #lastName::placeholder { /* Chrome, Firefox, Opera, Safari 10.1+ */ color: black; opacity: 1; /* Firefox */ } #lastName:-ms-input-placeholder { /* Internet Explorer 10-11 */ color: black; } #lastName::-ms-input-placeholder { /* Microsoft Edge */ color: black; } </style> </script> </body> </html>
可以使用本站在线JavaScript测试工具测试上述代码运行效果:http://www.phpcodeweb.com/runjs.html
最好提供用户在任何输入之外填写表单所需的所有信息。
#操作指南
为输入字段添加说明时,请确保将其正确链接到输入。你可以提供附加指令并在 aria-labelledby
内绑定多个 id。这使得设计更加灵活。
<fieldset> <legend>Using aria-labelledby</legend> <label id="date-label" for="date">Current Date:</label> <input type="date" name="date" id="date" aria-labelledby="date-label date-instructions" /> <p id="date-instructions">MM/DD/YYYY</p> </fieldset>
或者,你可以用 aria-describedby
将指令附加到输入。
<fieldset> <legend>Using aria-describedby</legend> <label id="dob" for="dob">Date of Birth:</label> <input type="date" name="dob" id="dob" aria-describedby="dob-instructions" /> <p id="dob-instructions">MM/DD/YYYY</p> </fieldset>
完整实例:
<!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Vue 3.0 语义学</title> <script src="https://unpkg.com/vue@3.0.0/dist/vue.global.js"></script> <style> </style> </head> <body> <script> <template> <div> <form class="demo" action="/dataCollectionLocation" method="post" autocomplete="on"> <fieldset> <legend>Using aria-labelledby</legend> <label id="date-label" for="date">Current Date:</label> <input type="date" name="date" id="date" aria-labelledby="date-label date-instructions" /> <p id="date-instructions">MM/DD/YYYY</p> </fieldset> <fieldset> <legend>Using aria-describedby</legend> <label id="dob" for="dob">Date of Birth:</label> <input type="date" name="dob" id="dob" aria-describedby="dob-instructions" /> <p id="dob-instructions">MM/DD/YYYY</p> </fieldset> </form> </div> </template> <style> .demo { font-family: sans-serif; border: 1px solid #eee; border-radius: 2px; padding: 20px 30px; margin-top: 1em; margin-bottom: 40px; user-select: none; overflow-x: auto; } .form-item { margin: 1em auto; } .form-item label { display: block; } button { font-size: 1em; } fieldset { margin: 1em auto; } </style> </script> </body> </html>
可以使用本站在线JavaScript测试工具测试上述代码运行效果:http://www.phpcodeweb.com/runjs.html
#隐藏内容
通常不建议直观地隐藏标签,即使输入具有可访问的名称。但是,如果输入的功能可以与周围的内容一起理解,那么我们可以隐藏视觉标签。
让我们看看这个搜索字段:
<form role="search"> <label for="search" class="hidden-visually">Search: </label> <input type="text" name="search" id="search" v-model="search" /> <button type="submit">Search</button> </form>
我们可以这样做,因为搜索按钮将帮助可视化用户识别输入字段的用途。
我们可以使用 CSS 直观地隐藏元素,但可以将它们用于辅助技术:
.hidden-visually { position: absolute; overflow: hidden; white-space: nowrap; margin: 0; padding: 0; height: 1px; width: 1px; clip: rect(0 0 0 0); clip-path: inset(100%); }
完整实例:
<!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Vue 3.0 语义学</title> <script src="https://unpkg.com/vue@3.0.0/dist/vue.global.js"></script> <style> </style> </head> <body> <script> <template> <form class="demo" role="search" action="/dataCollectionLocation" method="post"> <label for="search" class="hidden-visually">Search: </label> <input type="text" name="search" id="search" v-model="search" /> <button type="submit">Search</button> </form> </template> <script> export default { data() { return { search: "" }; } }; </script> <style> .demo { font-family: sans-serif; border: 1px solid #eee; border-radius: 2px; padding: 20px 30px; margin-top: 1em; margin-bottom: 40px; user-select: none; overflow-x: auto; } .hidden-visually { position: absolute; overflow: hidden; white-space: nowrap; margin: 0; padding: 0; height: 1px; width: 1px; clip: rect(0 0 0 0); clip-path: inset(100%); } button { font-size: 1em; } </style> </script> </body> </html>
可以使用本站在线JavaScript测试工具测试上述代码运行效果:http://www.phpcodeweb.com/runjs.html
#aria-hidden="true"
添加 aria hidden="true"
将隐藏辅助技术中的元素,但使其在视觉上对其他用户可用。不要把它用在可聚焦的元素上,纯粹用于装饰性的、复制的或屏幕外的内容上。
<p>This is not hidden from screen readers.</p> <p aria-hidden="true">This is hidden from screen readers.</p>
#按钮
在表单中使用按钮时,必须设置类型以防止提交表单。
也可以使用输入创建按钮:
<form action="/dataCollectionLocation" method="post" autocomplete="on"> <!-- Buttons --> <button type="button">Cancel</button> <button type="submit">Submit</button> <!-- Input buttons --> <input type="button" value="Cancel" /> <input type="submit" value="Submit" /> </form>
完整实例:
<!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Vue 3.0 语义学</title> <script src="https://unpkg.com/vue@3.0.0/dist/vue.global.js"></script> <style> </style> </head> <body> <script> <template> <form class="demo" action="/dataCollectionLocation" method="post" autocomplete="on"> <h1>Buttons</h1> <div class="form-item"> <label for="name">Name:</label> <input type="text" name="name" id="name" v-model="name" /> </div> <!-- Buttons --> <div class="btnTypes"> <h2>Buttons</h2> <button type="button">Cancel</button> <button type="submit">Submit</button> </div> <!-- Input buttons --> <div class="btnTypes"> <h2>Input Buttons</h2> <input type="button" value="Cancel"> <input type="submit" value="Submit"> </div> </form> </template> <script> export default { data() { return { name: "" }; } }; </script> <style> .demo { font-family: sans-serif; border: 1px solid #eee; border-radius: 2px; padding: 20px 30px; margin-top: 1em; margin-bottom: 40px; user-select: none; overflow-x: auto; } .form-item { margin: 1em auto; } .form-item label { display: block; } button { font-size: 1em; } .btnTypes { margin: 2em auto; } </style> </script> </body> </html>
可以使用本站在线JavaScript测试工具测试上述代码运行效果:http://www.phpcodeweb.com/runjs.html
#功能图像
你可以使用此技术创建功能图像。
- Input 字段
- 这些图像将作为表单上的提交类型按钮
<form role="search"> <label for="search" class="hidden-visually">Search: </label> <input type="text" name="search" id="search" v-model="search" /> <input type="image" class="btnImg" src="https://img.icons8.com/search" rel="external nofollow" alt="Search" /> </form>
- 图标
<form role="search"> <label for="searchIcon" class="hidden-visually">Search: </label> <input type="text" name="searchIcon" id="searchIcon" v-model="searchIcon" /> <button type="submit"> <i class="fas fa-search" aria-hidden="true"></i> <span class="hidden-visually">Search</span> </button> </form>
完整实例:
<!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Vue 3.0 语义学</title> <script src="https://unpkg.com/vue@3.0.0/dist/vue.global.js"></script> <style> </style> </head> <body> <script> <template> <div class="demo"> <h1> Functional Images </h1> <form role="search"> <label for="search" class="hidden-visually">Search: </label> <input type="text" name="search" id="search" v-model="search"> <input type="image" class="btnImg" src="https://img.icons8.com/search" alt="Search"> </form> <form role="search"> <label for="searchIcon" class="hidden-visually">Search: </label> <input type="text" name="searchIcon" id="searchIcon" v-model="searchIcon"> <button type="submit"> <i class="fas fa-search" aria-hidden="true"></i> <span class="hidden-visually">Search</span> </button> </form> </div> </template> <script> export default { data() { return { search: "", searchIcon: "" }; } }; </script> <style> .demo { font-family: sans-serif; border: 1px solid #eee; border-radius: 2px; padding: 20px 30px; margin-top: 1em; margin-bottom: 40px; user-select: none; overflow-x: auto; } * { font-size: 1em; } .hidden-visually { position: absolute; overflow: hidden; white-space: nowrap; margin: 0; padding: 0; height: 1px; width: 1px; clip: rect(0 0 0 0); clip-path: inset(100%); } .btnImg{ height: 1em } form[role=search] { margin: 2em 0; } </style> </script> </body> </html>
可以使用本站在线JavaScript测试工具测试上述代码运行效果:http://www.phpcodeweb.com/runjs.html
相关阅读
-
无相关信息