Web Design
פונקציות טריגונומטריות ב-CSS: מפריסה מעגלית עד אנימציות בלי שורת JavaScript
איך להשתמש ב-sin, cos ו-tan ב-CSS מודרני כדי ליצור תפריטים מעגליים, פריסות דינמיות ואפקטים ויזואליים מורכבים בלבד.
TL;DR
במקום לחשב קואורדינטות ב-JavaScript או לנחש אחוזים ב-CSS, דפדפנים תומכים כיום ב-sin(), cos() ו-tan() נייטיב. אפשר לבנות תפריטים מעגליים, גרפים דינמיים ואפקטים בתנועה ב-CSS נקי בלבד.
בשבוע שעבר שדרגתי מערכת ניהול עבור סטודיו לעיצוב בתל אביב. המעצבת ביקשה תפריט כלים מעגלי שנפתח מסביב לכפתור הראשי. בעבר, הבקשה הזו הייתה מביאה איתה מאה שורות של JavaScript, מאזיני אירועים לשינויי גודל מסך וחוב ביצועים מציק. היום? סיימתי את זה ב-12 שורות CSS.
לפני: ימי ה-JavaScript והאבסולוט הקשיח
כדי לחשב מיקום של רכיבים על גבי מעגל בעבר, היינו חייבים לבחור בין שתי רעות:
- להגדיר מיקומים קשיחים בפיקסלים לכל כפתור בנפרד (אפס גמישות, שובר מובייל).
- להריץ לולאה ב-JavaScript שמשתמשת ב-
Math.sin()ו-Math.cos(), ומזריקה Inline Styles לכל אלמנט ב-DOM.
התוצאה הייתה קוד מסורבל. בכל פעם שהוספנו פריט לתפריט, היינו חייבים לחשב מחדש את הזוויות ב-JS, לעדכן את המערך ולייצר Reflows שפגעו בחלקות האנימציה.
אחרי: מתמטיקה טהורה ישירות ב-CSS
ברגע שנכנסו פונקציות הטריגונומטריה הנייטיב ל-CSS, כל הבלגן הזה נעלם.
- הגדרה · CSS Trigonometric Functions
סדרה של פונקציות מתמטיות מובנות ב-CSS (
sin(),cos(),tan(),asin(),acos(),atan(),atan2()) המאפשרות לחשב זוויות ומרחקים ישירות בתוך הצהרות סטייל.
הנה איך הטרנספורמציה הזו נראית בפועל:
| היבט | השיטה הישנה (JS + CSS) | השיטה המודרנית (CSS Trig) |
|---|---|---|
| חישוב מיקום | לולאת JS על DOM Elements | פונקציית calc() פשוטה ב-CSS |
| שינוי כמות פריטים | עדכון מערכים וחישוב מחדש ב-JS | שינוי משתנה --total בודד |
| עומס על ה-Main Thread | גבוה (חישובי JS ברינדור) | אפסי (מטופל מנוע ה-Render) |
| תחזוקה | קוד מפוצל בין קבצים | קוד סטייל נקי במקום אחד |
איך בונים תפריט מעגלי ב-CSS נקי?
הטריק מתחיל בהגדרת שני משתנים בבסיס האלמנטים: מספר הפריטים הכללי (--total), והאינדקס של הפריט הספציפי (--index).
בסך הכל שורה אחת של חישוב זווית:
--angle: calc(360deg / var(--total) * var(--index));
מכאן, גזירת קואורדינטות X ו-Y היא משחק ילדים:
--x: calc(cos(var(--angle)) * var(--radius));
--y: calc(sin(var(--angle)) * var(--radius));
מציבים את הנתונים ב-transform: translate(var(--x), var(--y)) והאלמנט קופץ בדיוק למקום שלו בסיבוב המעגל.
💡
אין שום צורך ב-JS בשביל גיאומטריה. הגדרת משתני CSS נקיים מאפשרת לדפדפן להרים את כל המתמטיקה בעצמו.
גלים ואפקטים בתנועה ללא ספריות חיצוניות
טריגונומטריה אינה מיועדת רק לפריסה סטטית. כשמשלבים אותה עם keyframes, מקבלים תנועה גלית טבעית לחלוטין.
במקום ליצור פראמציות מורכבות עבור גל טקסט או כדורים מקפצים, אפשר להשתמש ב-sin() בתוך הלולאה. הסינוס מייצר התנהגות מתונה בקצוות, בדיוק כמו תנועת מטוטלת בעולם האמיתי.
משתמשים ב-sin() ליצירת Easing פנימי: במקום ease-in-out סטנדרטי, אפשר לחשב מיקום מדויק לפי זווית הזמן ב-calc() ולקבל שליטה מלאה בפיזיקה של האנימציה.
סיכום
המעבר לפונקציות מתמטיות ב-CSS מייצג את הדרך שבה אנחנו בונים ממשקים. קוד שפעם דרש ספריות כבדות נכתב עכשיו בשורות סטייל ספורות.
תבדקו את הקוד שלכם. אם יש לכם חישובי מיקום ב-JavaScript — זה הזמן לנקות אותם.
שאלות נפוצות
כל מה שעוד רצית לדעת
האם פונקציות טריגונומטריות ב-CSS נתמכות בכל הדפדפנים?
מה היתרון בשימוש ב-CSS בלבד לעומת JavaScript בחישובי מיקום?
האם מותר לשלב משתני CSS בתוך sin() ו-cos()?
כתב
אדיר בן יעקב · Adir Ben Yaakov
מקים JustBetterSite, סוכנות בניית אתרים ושיווק דיגיטלי בתל אביב. מתמחה ב-GEO (Generative Engine Optimization) — בנייה של אתרים שמופיעים בתשובות של ChatGPT, Claude, Perplexity ו-Gemini, לא רק בגוגל.
עוד עליי →להמשך הקריאה
מאמרים קשורים
Web Design
CSS contrast-color() מול JavaScript: איך לעצב ממשק דינמי ונגיש ב-2026
השוואה מעשית בין פונקציית contrast-color() ב-CSS לבין פתרונות JavaScript ישנים. גלו איך לייצר ניגודיות נגישה ואוטומטית ללא סקריפטים כבדים.
המשךWeb Design
איך לפשט מצב כהה ב-CSS עם פונקציית light-dark ב-2026
מדריך פרקטי לשימוש בפונקציית light-dark() החדשה ב-CSS. למדו איך להחליף עשרות Media Queries בשורת קוד אחת ולשמור על קוד נקי ומודולרי.
המשךWeb Design
מהפכת has ב-CSS: איך ביטלתי עשרות שורות JavaScript
מדריך מעשי לשימוש בסלקטור CSS :has ליצירת רכיבי UI דינמיים. איך לעצב כרטיסים, טפסים ומצבי ממשק מתקדמים ישירות ב-CSS ללא תלות ב-JavaScript.
המשך