التطبيق · فصل ٣

مثال بـ CSS Modules

CSS Modules · open class · chevron
🎯 الهدف: تقفل وتفتح قائمة فرعية بتبديل كلاس، من غير قياس ارتفاع.

مفيش حساب height في الجافاسكربت. زرار بيقلب حالة، والكلاس open بيحوّل الصف من 0fr لـ 1fr.

Sidebar.module.css
.submenuWrapper {  display: grid;  grid-template-rows: 0fr;  transition: grid-template-rows 0.3s ease;}.submenuWrapper.open {  grid-template-rows: 1fr;}.submenuContent {  overflow: hidden;}.item {  padding: 8px 16px;}.chevron {  transition: transform 0.3s ease;}.chevron.open {  transform: rotate(180deg);}
Sidebar.jsx
import { useState } from "react";import styles from "./Sidebar.module.css";export default function Sidebar() {  const [open, setOpen] = useState(false);  return (    <div>      <button onClick={() => setOpen(!open)} className={styles.item}>        Settings        <span className={`${styles.chevron} ${open ? styles.open : ""}`}>▾</span>      </button>      <div className={`${styles.submenuWrapper} ${open ? styles.open : ""}`}>        <div className={styles.submenuContent}>          <div className={styles.item}>Profile</div>          <div className={styles.item}>Billing</div>          <div className={styles.item}>Security</div>        </div>      </div>    </div>  );}

الزرار بيقلب open. الغلاف ياخد الكلاس فيكبر صفه. المحتوى مقصوص فيبان تدريجيًا مهما كان عدد العناصر.

لو المتصفح طالب حركة أقل، حط الحركة جوه prefers-reduced-motion: no-preference، أو قصّر المدة لصفر. راجع دعم الانتقال على grid-template-rows في الدوكس لو بتستهدف متصفح قديم.

خلّصت الفصل لما

🧠 اختبر نفسك
١) إيه الكلاس اللي بيفتح القائمة؟
open على الغلاف. بيحوّل grid-template-rows من 0fr لـ 1fr.
٢) ليه منجمعش الكلاسات كنص chevron open؟
لأن CSS Modules بتبدّل الأسماء. لازم تستخدم styles.chevron و styles.open.
٣) لو زودت عنصر رابع، محتاج أغيّر رقم ارتفاع؟
لأ. 1fr بياخد ارتفاع المحتوى لوحده.