5 ตัวอย่าง HTM+CSS ทำได้ ไม่ต้องใช้ JavaScript

เดียวนี้พลังของ HTML+CSS ไปไกลมากแล้วไม่ใช่เพียงแค่ทำหน้าตาแสดงผลได้อย่างเดียว แต่มีลูกเล่นเพิ่มเติมให้กับคนใช้เว็บด้วย ซึ่งก่อนหน้านั้นความสามารถลูกเล่นต่าง ๆ เราจำเป็นต้องใช้ JavaScript มาช่วย

การที่เราเขียนเพียงแค่ HTML+CSS นั้นช่วยทำให้โค้ดของเราเรียบง่ายขึ้น ง่ายต่อการบำรุงรักษา และมักจะมีประสิทธิภาพมากกว่า วิธีคิดนี้มาจากหลักการพื้นฐานในการพัฒนาเว็บที่เรียกว่า "กฎของการใช้น้อยที่สุด" (Rule of Least Power)

กฎของการใช้น้อยที่สุด

กฎของการใช้น้อยที่สุดนั้นเรียบง่าย ใช้ภาษาที่มีพลังน้อยที่สุดที่เหมาะสมกับงาน ในการพัฒนาเว็บ นี่หมายถึงการเลือกใช้ HTML แทน CSS และใช้ CSS แทน JavaScript เมื่อเป็นไปได้ เหตุผลที่อยู่เบื้องหลังคือ

  • HTML เป็นภาษาที่อธิบายได้และมีน้ำหนักเบา เหมาะสำหรับการจัดโครงสร้างเนื้อหา
  • CSS ก็เป็นภาษาที่อธิบายได้เช่นกัน ใช้สำหรับการตกแต่ง มีตัวเลือกในการจัดเลย์เอาต์และการโต้ตอบมากมายที่ไม่จำเป็นต้องใช้ JavaScript
  • JavaScript แม้จะมีพลังมาก แต่ก็เพิ่มความซับซ้อน มีต้นทุนด้านประสิทธิภาพ และมีความเป็นไปได้ที่จะเกิดข้อผิดพลาดได้มากเช่นกัน

ดังนั้น เรามาดูตัวอย่าง GitHub repository ที่จะแสดงให้เห็นถึงบ้างอย่างที่อาจเคยใช้ JavaScript แต่สามารถทำให้ได้ผลลัพธ์ที่ดีกว่าด้วย HTML และ CSS เพียงอย่างเดียว ตัวอย่างเหล่านี้จะแสดงให้เห็นว่าเราสามารถทำให้โค้ดเรียบง่ายขึ้นในขณะที่ยังคงรักษาฟังก์ชันการทำงานและประสิทธิภาพได้อย่างไร

ตัวอย่าง 1: Custom Switches (Checkboxes without JS)

devto-html-css/custom-switches at main · mrinasugosh/devto-html-css
Contribute to mrinasugosh/devto-html-css development by creating an account on GitHub.

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);
}

ตัวอย่าง 2: Auto Suggest with <datalist>

devto-html-css/auto-suggest at main · mrinasugosh/devto-html-css
Contribute to mrinasugosh/devto-html-css development by creating an account on 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>

CSS

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

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

ตัวอย่าง 3: Smooth Scrolling with CSS

devto-html-css/smooth-scrolling at main · mrinasugosh/devto-html-css
Contribute to mrinasugosh/devto-html-css development by creating an account on 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>

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;
}

ตัวอย่าง 4: Accordions <details> และ <summary>

devto-html-css/accordions at main · mrinasugosh/devto-html-css
Contribute to mrinasugosh/devto-html-css development by creating an account on GitHub.

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;
}

ตัวอย่าง 5: Scroll-Triggered Animations with CSS

devto-html-css/scroll-animations at main · mrinasugosh/devto-html-css
Contribute to mrinasugosh/devto-html-css development by creating an account on 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>

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);
}

ยกเลิกความซับซ้อนด้วย HTML และ CSS

มีหลายกรณีที่เราสามารถหลีกเลี่ยงความซับซ้อนของ JavaScript ได้โดยการใช้ฟีเจอร์ที่มีอยู่ของ HTML และ CSS ซึ่งมันจะช่วยให้โค้ดของเราง่ายต่อการบำรุงรักษาและอ่านง่ายขึ้น ซึ่งพอมาดูโดยรวมแล้วมันเป็น "การใช้น้อยที่สุด" เพื่อทำให้ดีออกมาที่สุด โดยไม่จำเป็นต้องพึ่งพา JavaScript ที่ซับซ้อน

ลองไปปรับใช้กันดูนะ 😃

Thanks: https://dev.to/tinymce/5-essential-html-and-css-tricks-to-ditch-javascript-40kh