חזרה למאמרים

Web Design

פונקציות טריגונומטריות ב-CSS: מפריסה מעגלית עד אנימציות בלי שורת JavaScript

איך להשתמש ב-sin, cos ו-tan ב-CSS מודרני כדי ליצור תפריטים מעגליים, פריסות דינמיות ואפקטים ויזואליים מורכבים בלבד.

2 דקות קריאהCSS · UI Design · Web Development · Trigonometry · Frontend

TL;DR

במקום לחשב קואורדינטות ב-JavaScript או לנחש אחוזים ב-CSS, דפדפנים תומכים כיום ב-sin(), cos() ו-tan() נייטיב. אפשר לבנות תפריטים מעגליים, גרפים דינמיים ואפקטים בתנועה ב-CSS נקי בלבד.

בשבוע שעבר שדרגתי מערכת ניהול עבור סטודיו לעיצוב בתל אביב. המעצבת ביקשה תפריט כלים מעגלי שנפתח מסביב לכפתור הראשי. בעבר, הבקשה הזו הייתה מביאה איתה מאה שורות של JavaScript, מאזיני אירועים לשינויי גודל מסך וחוב ביצועים מציק. היום? סיימתי את זה ב-12 שורות CSS.

לפני: ימי ה-JavaScript והאבסולוט הקשיח

כדי לחשב מיקום של רכיבים על גבי מעגל בעבר, היינו חייבים לבחור בין שתי רעות:

  1. להגדיר מיקומים קשיחים בפיקסלים לכל כפתור בנפרד (אפס גמישות, שובר מובייל).
  2. להריץ לולאה ב-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 נתמכות בכל הדפדפנים?
כן. התמיכה מלאה בכל הדפדפנים המובילים (Chrome, Safari, Firefox, Edge) ללא צורך ב-Prefixes.
מה היתרון בשימוש ב-CSS בלבד לעומת JavaScript בחישובי מיקום?
חיסכון בעומס על ה-Main Thread, מניעת Reflows מיותרים, ביצועי אנימציה של 60fps וקוד קריא בהרבה.
האם מותר לשלב משתני CSS בתוך sin() ו-cos()?
בהחלט. זה הכוח האמיתי של השיטה — מגדירים משתנה כמו index או total, וה-CSS מחשב את הזווית והמיקום אוטומטית.
AB

כתב

אדיר בן יעקב · Adir Ben Yaakov

מקים JustBetterSite, סוכנות בניית אתרים ושיווק דיגיטלי בתל אביב. מתמחה ב-GEO (Generative Engine Optimization) — בנייה של אתרים שמופיעים בתשובות של ChatGPT, Claude, Perplexity ו-Gemini, לא רק בגוגל.

עוד עליי →

להמשך הקריאה

מאמרים קשורים