Menu

HTML iframe: הטמעת עמודים, סרטונים ומפות

האלמנט <iframe> מציג עמוד אינטרנט אחר בתוך העמוד שלכם. למדו את המאפיינים שצריך (src, title, width, height), איך מטמיעים סרטוני YouTube ומפות, איך הופכים iframe לרספונסיבי, איך sandbox מגביל את מה שהוא יכול לעשות, ולמה חלק מהאתרים מסרבים להיטען בתוכו.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

איך משתמשים ב-iframe

<iframe> מציג עמוד אחר בתוך העמוד שלכם. תנו לו את כתובת העמוד ב-src, title שמתאר אותו, וגודל:

<iframe src="https://example.com/" title="Example site" width="600" height="400"></iframe>

המסגרת טוענת את העמוד כמסמך נפרד, עם עיצוב וסקריפטים משלו. הדוגמאות בעמוד הזה משתמשות ב-srcdoc במקום src, שמכניס את ה-HTML של המסגרת ישירות למאפיין, כך שהן עובדות בלי לטעון אתר אחר:

הפסקה החיצונית כחולה ומודגשת; הפסקה שבתוך המסגרת לא, למרות שאותו כלל p נמצא בעמוד. עיצוב אף פעם לא חוצה את גבול המסגרת, לאף כיוון. הגבול של ברירת המחדל וגודל ברירת המחדל של 300×150 מגיעים מהדפדפן; המאפיינים width ו-height גוברים על הגודל.

הטמעת סרטון YouTube או מפה

אתרי וידאו ושירותי מפות נותנים לכם קוד iframe מוכן. ב-YouTube, לחצו על Share, ואז על Embed:

<iframe width="560" height="315"
  src="https://www.youtube.com/embed/VIDEO_ID"
  title="YouTube video player"
  allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
  allowfullscreen></iframe>

ב-Google Maps, פתחו את המקום, לחצו על Share, ואז על Embed a map, והעתיקו את ה-iframe באותה צורה. השאירו את ה-title (קוראי מסך מכריזים עליו כשנכנסים למסגרת) והחליפו גדלים קבועים ב-CSS הרספונסיבי שלמטה. המאפיין allow מעניק למסגרת יכולות כמו ניגון אוטומטי או מסך מלא, שכבויות כברירת מחדל בעמודים מוטמעים.

גודל, גבול ו-iframe רספונסיבי

קודי הטמעה שמועתקים משתמשים בגדלים קבועים בפיקסלים, שחורגים מהמסך בטלפונים. width: 100% יחד עם aspect-ratio גורמים למסגרת למלא את המכל שלה ולשמור על הצורה שלה, ו-border: 0 מסיר את גבול ה-inset של ברירת המחדל:

שנו את max-width: 480px לערך אחר והמסגרת תשמור על צורת 16:9 שלה בכל רוחב. הסירו את border: 0 כדי לראות את גבול ברירת המחדל של הדפדפן. המאפיינים הישנים frameborder, scrolling ו-marginheight מיושנים; השתמשו ב-CSS.

sandbox: הגבלת מה שהמסגרת יכולה לעשות

מסגרת יכולה להריץ סקריפטים, לשלוח טפסים ולפתוח חלונות קופצים כמו כל עמוד. המאפיין sandbox לוקח ממנה את היכולות האלה; sandbox ריק חוסם כמעט הכל, וכל מילת מפתח מחזירה יכולת אחת. שתי המסגרות שלמטה מקבלות את אותו HTML עם סקריפט קטן:

המסגרת הראשונה שומרת על טקסט ה-placeholder שלה כי הסקריפט שלה אף פעם לא רץ (הקונסול של Chrome רושם עבורה הודעת "Blocked script execution"). השתמשו ב-sandbox בכל פעם שאתם מציגים במסגרת תוכן שאתם לא סומכים עליו לגמרי, כמו HTML שמשתמשים כתבו, והוסיפו רק את מילות המפתח שהוא צריך:

מילת מפתחמתירה
allow-scriptsהרצת JavaScript
allow-formsשליחת טפסים
allow-popupswindow.open וקישורי target="_blank"
allow-modalsalert(), confirm() ו-prompt()
allow-same-originהתייחסות לתוכן כאל המקור האמיתי שלו (cookies, אחסון)
allow-top-navigationניווט של הלשונית כולה הרחק מהעמוד שלכם

לעולם אל תשלבו allow-scripts ו-allow-same-origin עבור תוכן מהמקור שלכם: הסקריפט שבמסגרת יוכל אז להסיר את ה-sandbox של עצמו.

תקשורת עם מסגרת: postMessage

העמוד החיצוני והמסגרת הם מסמכים נפרדים. כשהמקורות שלהם שונים הם לא יכולים לגעת ב-DOM אחד של השני, אבל הם יכולים לשלוח הודעות. הקלידו הודעה ושלחו אותה לתוך המסגרת:

בקוד אמיתי, העבירו את המקור המדויק של המסגרת (כמו 'https://maps.example.com') במקום '*', ובדקו את e.origin אצל המקבל, כך שהודעות יישלחו רק לאתר שאתם מצפים לו ויתקבלו רק ממנו.

ביצועים ומה קורה כשאתר מסרב

  • טעינה עצלה. הוסיפו loading="lazy" למסגרות שנמצאות רחוק למטה בעמוד; הדפדפן טוען אותן רק כשהקורא גולל קרוב אליהן. כל iframe הוא טעינה מלאה של עמוד, כך שעמוד עם הרבה הטמעות נהיה איטי בלי זה.
  • "Refused to connect". אתרים רבים (בנקים, רוב הרשתות החברתיות, חיפוש Google) שולחים כותרת X-Frame-Options או frame-ancestors שאוסרת הצגה במסגרת, והדפדפן מציג שגיאה במסגרת. העמוד שלכם לא יכול לעקוף את זה. השתמשו בכתובת ההטמעה הרשמית של האתר, או בקישור.
  • נגישות. תמיד הגדירו title. כך קורא מסך נותן שם למסגרת, ובעמוד עם כמה מסגרות בלי כותרת קשה להתמצא.

טעויות נפוצות

  • title חסר. קוראי מסך מכריזים על המסגרת כחסרת שם.
  • רוחב קבוע מקוד הטמעה שהועתק. החליפו אותו ב-width: 100% וב-aspect-ratio.
  • הצגת קובץ וידאו רגיל במסגרת. לקובץ .mp4 משלכם, השתמשו באלמנט video; מסגרות iframe מיועדות לעמודים.
  • אמון בתוכן שבמסגרת. הוסיפו sandbox לכל דבר שלא אתם כתבתם.
  • ציפייה ש-CSS חיצוני יעצב את המסגרת. עצבו את העמוד שבמסגרת מתוכו.

שאלות נפוצות

מה זה iframe ב-HTML?

<iframe> (inline frame, מסגרת מוטבעת) היא תיבה שמציגה עמוד אינטרנט נפרד בתוך העמוד הנוכחי. יש לה מסמך, עיצוב וסקריפטים משלה, ולכן משתמשים בה להטמעות כמו סרטונים, מפות, פרסומות ותצוגות מקדימות של קוד.

איך מטמיעים סרטון YouTube עם iframe?

ב-YouTube, בחרו Share, אחר כך Embed, והעתיקו את הקוד. זה iframe שה-src שלו הוא https://www.youtube.com/embed/ ועוד מזהה הסרטון. השאירו את המאפיינים title ו-allowfullscreen, והשתמשו ב-CSS aspect-ratio: 16 / 9 עם width: 100% כדי להפוך אותו לרספונסיבי.

למה ה-iframe שלי אומר שהאתר סירב להתחבר?

האתר שולח כותרת X-Frame-Options או Content-Security-Policy: frame-ancestors שאוסרת על אתרים אחרים להציג אותו במסגרת. אתרים רבים עושים את זה כדי למנוע clickjacking. אי אפשר לעקוף את זה מהעמוד שלכם; השתמשו בכתובת ההטמעה הרשמית של האתר אם יש לו כזו.

איך מסירים את הגבול של iframe?

הגדירו border: 0 ב-CSS. המאפיין הישן frameborder="0" מיושן, אף שקודי הטמעה רבים שמועתקים עדיין כוללים אותו.

איך הופכים iframe לרספונסיבי?

תנו לו width: 100% ו-aspect-ratio ב-CSS, למשל aspect-ratio: 16 / 9 לווידאו, ואל תגדירו גובה קבוע. ה-iframe משתנה אז יחד עם המכל שלו ושומר על הצורה שלו.

מה עושה המאפיין sandbox על iframe?

מאפיין sandbox ריק חוסם סקריפטים, שליחת טפסים, חלונות קופצים ועוד בתוך המסגרת, ומתייחס לתוכן שלה כאילו הוא מגיע ממקור ייחודי. אחר כך מתירים רק את מה שההטמעה צריכה עם מילות מפתח כמו allow-scripts או allow-forms.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל