5 个必备 HTML 和 CSS 技巧,告别 JavaScript
让我们来谈谈什么时候不该使用 JavaScript,以及为什么 HTML 和 CSS 通常是更适合做这项工作的工具。这听起来可能有点违反直觉——尤其是对一个 JavaScript 开发者来说——但相信我,到最后你就会明白的!
我并非反对 JavaScript。我整天都在用它编写富文本编辑器。但随着时间的推移,我发现,通过在很多任务中使用 HTML 和 CSS,我的代码实际上可以更简洁、更易于维护,而且通常性能更高。这种方法植根于 Web 开发的核心原则——最小功耗规则。
最小权力规则
最小功率规则很简单:使用最适合任务的、性能最弱的语言。在 Web 开发中,这意味着尽可能使用 HTML 而不是 CSS,使用 CSS 而不是 JavaScript。其逻辑如下:
- HTML具有声明性和轻量性,非常适合构建内容。
- CSS也是声明性的并用于样式,提供许多不需要 JavaScript 的布局和交互选项。
- JavaScript虽然功能强大,但确实带来了复杂性、性能成本和潜在错误。
那么,让我们深入研究一些实际示例,所有这些示例都可以在这个GitHub 仓库中找到。您可能通常使用 JavaScript,但只需使用 HTML 和 CSS 即可获得更好的效果。这些示例演示了如何在保持功能和性能的同时简化代码。
示例 1:自定义开关(无需 JS 的复选框)
我们都创建过自定义开关。通常,这需要大量的 JavaScript 代码来处理点击和切换状态。但本文将教你如何仅使用 HTML 和 CSS 构建一个功能齐全、易于访问的开关。

HTML
<label class="switch">
<input type="checkbox" class="switch-input">
<span class="switch-slider"></span>
</label>
CSS
/* The outer container for the switch */
.switch {
position: relative;
display: inline-block;
width: 60px;
height: 34px;
}
/* The hidden checkbox input */
.switch-input {
opacity: 0;
width: 0;
height: 0;
}
/* The visible slider (background) of the switch */
.switch-slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
transition: .4s;
}
/* The circle (slider button) inside the switch */
.switch-slider:before {
position: absolute;
content: "";
height: 26px;
width: 26px;
left: 4px;
bottom: 4px;
background-color: white;
transition: .4s;
}
/* Pseudo-class that styles the switch when the checkbox is checked */
.switch-input:checked + .switch-slider {
background-color: #2196F3;
}
/* Moves the slider button to the right when the switch is checked */
.switch-input:checked + .switch-slider:before {
transform: translateX(26px);
}
此设置无需 JavaScript 即可创建一个功能齐全的开关,并利用:checked
伪类进行样式更改。此伪类以处于“选中”状态的元素(复选框)为目标。它会触发开关的样式更改,例如在复选框选中时更改背景颜色和移动滑块按钮。
为什么这样做更好:
- 不需要 JavaScript:移动部件更少,出现错误的机会更少。
- 开箱即用:您可以自动获得键盘和鼠标支持,从而更易于维护。
示例 2:自动建议<datalist>
自动完成功能通常使用库或自定义 JavaScript 实现。但使用 HTML<datalist>
元素,您可以轻松创建自动建议输入。

HTML
<input type="text" list="suggestions" placeholder="Choose an option...">
<datalist id="suggestions">
<option value="Open AI">
<option value="Open Source">
<option value="Open Source Software">
</datalist>
CSS
.container {
width: 300px;
display: block;
}
input {
padding: 10px;
font-size: 18px;
width: 100%;
box-sizing: border-box;
}
<datalist>
当用户开始输入文本时,它会提供一个建议列表。无需基于 JavaScript 的自动完成库。
为什么这样做更好:
- 轻量级:内置于浏览器,因此速度更快、更高效。
- 简单:不需要额外的 JS、依赖项或复杂的逻辑。
示例 3:使用 CSS 实现平滑滚动
很多网站都使用 jQuery 或自定义 JavaScript 函数来实现网页的平滑滚动。但现在,我们只需一行 CSS 代码就能实现。

HTML
<nav>
<a href="#section1">Go to Section 1</a>
<a href="#section2">Go to Section 2</a>
<a href="#section3">Go to Section 3</a>
</nav>
<!-- Section 1 -->
<section id="section1">
<h2>Section 1</h2>
</section>
<!-- Section 2 -->
<section id="section2">
<h2>Section 2</h2>
</section>
<!-- Section 3 -->
<section id="section3">
<h2>Section 3</h2>
</section>
CSS
/* Basic styling for sections */
section {
height: 100vh;
padding: 20px;
font-size: 24px;
display: flex;
justify-content: center;
align-items: center;
}
/* Different background colors for each section */
#section1 {
background-color: lightcoral;
}
#section2 {
background-color: lightseagreen;
}
#section3 {
background-color: lightblue;
}
/* Styling for the navigation */
nav {
position: fixed;
top: 10px;
left: 10px;
}
nav a {
display: block;
margin-bottom: 10px;
text-decoration: none;
color: white;
padding: 10px 20px;
background-color: #333;
border-radius: 5px;
}
nav a:hover {
background-color: #555;
}
当用户点击某个部分的锚链接时,这可确保页面顺利滚动到该部分。
为什么这样做更好:
- 更少的代码:用一行 CSS 而不是复杂的 JavaScript 实现平滑滚动,降低代码复杂性。
- 改进的性能:原生 CSS 滚动比基于 JavaScript 的解决方案更快、更高效。
- 浏览器一致性: CSS 确保在各个浏览器和设备上的平滑滚动一致。
示例 4:使用<details>
和的手风琴<summary>
手风琴菜单通常使用 JavaScript 构建,用于切换内容的可见性。但 HTML 提供了<details>
和<summary>
元素,无需额外代码即可实现此功能。

HTML
<details>
<summary>Click to toggle</summary>
<p>This is some content!</p>
</details>
CSS
details {
width: 300px;
background-color: #f9f9f9;
padding: 20px;
border: 1px solid #ddd;
font-size: 18px;
}
summary {
cursor: pointer;
font-size: 20px;
font-weight: bold;
}
details[open] summary {
color: #2196F3;
}
这个简单的标记为我们提供了一个交互式的、可访问的手风琴,它可以打开和关闭,而不需要任何 JavaScript。
为什么更好:
- 原生:这是浏览器的功能,因此速度更快、更可靠。
- ** 可访问:**浏览器为您处理焦点管理和交互模式。
示例 5:使用 CSS 实现滚动触发的动画
基于滚动位置的元素动画通常使用 JavaScript 库来实现。但使用 scroll-margin 属性和 scroll-behavior CSS,您可以创建更流畅、更易用的动画。

HTML
<body>
<!-- Navigation with anchor links -->
<nav style="position:fixed; top:10px; left:10px;">
<a href="#section1">Section 1</a>
<a href="#section2">Section 2</a>
<a href="#section3">Section 3</a>
<a href="#section4">Section 4</a>
</nav>
<!-- Section 1 -->
<section id="section1">
<h2>Welcome to Section 1</h2>
</section>
<!-- Section 2 -->
<section id="section2">
<h2>Welcome to Section 2</h2>
</section>
<!-- Section 3 -->
<section id="section3">
<h2>Welcome to Section 3</h2>
</section>
<!-- Section 4 -->
<section id="section4">
<h2>Welcome to Section 4</h2>
</section>
</body>
CSS
html {
scroll-behavior: smooth;
}
/* Remove body margins */
body {
margin: 0;
}
/* Full viewport height for sections with centered content */
section {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: #f0f0f0;
transition: background-color 0.6s ease-in-out;
}
/* Styling for headings */
section h2 {
font-size: 36px;
margin: 0;
transition: transform 0.6s ease, opacity 0.6s ease;
opacity: 0;
transform: translateY(30px);
}
/* Add margin for scroll snapping */
section:nth-child(odd) {
background-color: #ffcccb;
}
section:nth-child(even) {
background-color: #d0e7ff;
}
/* Scroll-triggered animation */
section:target h2 {
opacity: 1;
transform: translateY(0);
}
为什么这是更好的
- 无需 JavaScript:只需 CSS 即可实现流畅的滚动触发动画。
- 性能:动画由浏览器原生处理,从而实现更流畅、更高效的转换,而无需 JavaScript 的复杂性。
- 更易于维护:使用 CSS 减少了对复杂的 JavaScript 滚动跟踪逻辑的需求,使代码更易于更新和维护。
在很多情况下,您可以通过使用本机浏览器功能和巧妙的 CSS 技巧完全避免 JavaScript 的复杂性。
随着人工智能助手在编码和面向聊天编程领域的崛起,采用和执行更简单的声明式解决方案(例如 HTML 和 CSS)的能力变得更加重要。人工智能工具可以快速生成 JavaScript 代码。但利用 HTML 和 CSS 实现核心功能可以确保代码易于维护且易于理解,无论是对人类还是人工智能而言。通过使用功能最弱的解决方案来完成工作,您不仅可以提高代码的可访问性,还可以使人工智能以更高效、更优化的方式提供帮助。
HTML 和 CSS 提供了强大的工具,用于构建交互式、可访问且响应迅速的 Web 组件,而无需繁琐的 JavaScript。因此,下次您想使用 JavaScript 时,请花点时间考虑一下,使用 HTML 和 CSS 的更简单的解决方案是否也能达到同样的效果,甚至更好。
请查看Github 代码库,获取本文中的所有示例。此外,您还可以访问TinyMCE 博客,获取深入见解、最佳实践和教程,或者立即注册14 天免费试用,开启您的 TinyMCE 之旅。
编码愉快!
鏂囩珷鏉ユ簮锛�https://dev.to/tinymce/5-essential-html-and-css-tricks-to-ditch-javascript-40kh