5 个必备 HTML 和 CSS 技巧,告别 JavaScript

2025-06-10

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 构建一个功能齐全、易于访问的开关。

自定义开关演示

Github仓库

HTML

<label class="switch">
  <input type="checkbox" class="switch-input">
  <span class="switch-slider"></span>
</label>
Enter fullscreen mode Exit fullscreen mode

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);
}
Enter fullscreen mode Exit fullscreen mode

此设置无需 JavaScript 即可创建一个功能齐全的开关,并利用:checked伪类进行样式更改。此伪类以处于“选中”状态的元素(复选框)为目标。它会触发开关的样式更改,例如在复选框选中时更改背景颜色和移动滑块按钮。

为什么这样做更好:

  • 不需要 JavaScript:移动部件更少,出现错误的机会更少。
  • 开箱即用:您可以自动获得键盘和鼠标支持,从而更易于维护。

示例 2:自动建议<datalist>

自动完成功能通常使用库或自定义 JavaScript 实现。但使用 HTML<datalist>元素,您可以轻松创建自动建议输入。

自动建议演示

Github仓库

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>
Enter fullscreen mode Exit fullscreen mode

CSS

.container {
  width: 300px; 
  display: block; 
}

input {
  padding: 10px;
  font-size: 18px;
  width: 100%;
  box-sizing: border-box;
}
Enter fullscreen mode Exit fullscreen mode

<datalist>当用户开始输入文本时,它会提供一个建议列表。无需基于 JavaScript 的自动完成库。

为什么这样做更好:

  • 轻量级:内置于浏览器,因此速度更快、更高效。
  • 简单:不需要额外的 JS、依赖项或复杂的逻辑。

示例 3:使用 CSS 实现平滑滚动

很多网站都使用 jQuery 或自定义 JavaScript 函数来实现网页的平滑滚动。但现在,我们只需一行 CSS 代码就能实现。

平滑滚动演示

Github仓库

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>
Enter fullscreen mode Exit fullscreen mode

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;
}
Enter fullscreen mode Exit fullscreen mode

当用户点击某个部分的锚链接时,这可确保页面顺利滚动到该部分。

为什么这样做更好:

  • 更少的代码:用一行 CSS 而不是复杂的 JavaScript 实现平滑滚动,降低代码复杂性。
  • 改进的性能:原生 CSS 滚动比基于 JavaScript 的解决方案更快、更高效。
  • 浏览器一致性: CSS 确保在各个浏览器和设备上的平滑滚动一致。

示例 4:使用<details>和的手风琴<summary>

手风琴菜单通常使用 JavaScript 构建,用于切换内容的可见性。但 HTML 提供了<details><summary>元素,无需额外代码即可实现此功能。

手风琴演示

Github仓库

HTML

<details>
  <summary>Click to toggle</summary>
  <p>This is some content!</p>
</details>
Enter fullscreen mode Exit fullscreen mode

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;
}
Enter fullscreen mode Exit fullscreen mode

这个简单的标记为我们提供了一个交互式的、可访问的手风琴,它可以打开和关闭,而不需要任何 JavaScript。

为什么更好:

  • 原生:这是浏览器的功能,因此速度更快、更可靠。
  • ** 可访问:**浏览器为您处理焦点管理和交互模式。

示例 5:使用 CSS 实现滚动触发的动画

基于滚动位置的元素动画通常使用 JavaScript 库来实现。但使用 scroll-margin 属性和 scroll-behavior CSS,您可以创建更流畅、更易用的动画。

滚动动画演示

Github仓库

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>
Enter fullscreen mode Exit fullscreen mode

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);
}
Enter fullscreen mode Exit fullscreen mode

为什么这是更好的

  • 无需 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
PREV
7 种常见的前端安全攻击
NEXT
Hacktoberfest:让我们构建一个 VS Code 扩展讨论:功能和增强功能 #12 添加更好的屏幕截图/GIF #4 添加更多测试 #5 审核和改进 util/workspace #6