nav 表示网站的导航,但不一定所有的导航都需要用 nav 来实现,建议仅用来实现比较重要的导航,例如网页页脚的链接列表,直接 footer 即可。另外,每个页面可以有多个 nav。ul 表示无序列表, ol 表示有序列表。ul,ol 多数出现正在行文中间,它的上文多数在提示:要列举某些项。不要给所有并列关系,递进关系都加上 ul, ol 标签。
pre, samp, code - 预设置
pre 标签,表示这部分内容是预先排版过的,不需要浏览器进行排版。samp 标签表示一段计算机程序的示例输出。code 标签表示一段代码。
1 2 3 4 5 6
<pre> <samp> GET /home.html HTTP/1.1 Host: www.example.org </samp> </pre>
1 2 3 4 5 6 7 8 9 10 11 12
<pre> <code> <html> <head> <title>Example.org – The World Wide Web</title> </head> <body> <p>The World Wide Web, abbreviated as WWW and commonly known ...</p> </body> </html> </code> </pre>
在产品里,HTML 用于描述软件界面多过富文本时,因为软件界面里的东西,实际上几乎是没有语义的。比如说,我们做了一个购物车功能,购物车这个按钮,我们一定要用Button吗?实际上我觉得没必要,因为这个场景里面,跟表单中的Button,其实已经相差很远了,所以,在任何软件界面的场景中,可以直接使用 div 和 span。
// 根据点击 btn 的 class 属性绑定不同的事件回调 bindEvent() { this.el.addEventListener('click', event => { let el = event.target; let id = el.dataset.id; if (el.classList.contains('todo-delete')) { deleteTodo(id); } elseif (el.classList.contains('todo-update')) { updateTodo(el, id); } elseif (el.classList.contains('todo-add')) { addTodo(el); } });
// 点击 add 时,把新的 todo 添加到 model 中 constaddTodo = el => { let input = el.parentElement.querySelector('.input-add'); let value = input.value; if (value !== '') { let data = this.model.data; data.push({ id: data.length, value: value, }); this.model.data = data; } };
// 点击 delete 时,把对应 todo 从 model 中删除 constdeleteTodo = id => { this.model.data = this.model.data.filter(todo => { return id !== String(todo.id); }); };