مفيش حساب 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 بياخد ارتفاع المحتوى لوحده.