פרויקט זה יעזור לך לחדד את כישורי החזית שלך וללמד אותך כיצד לבנות ממשק באמצעות תקני אינטרנט מרכזיים.

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

פרויקט אחד שאתה יכול להתחיל איתו הוא ספר מתכונים, אותו אתה יכול להפעיל בדפדפן כמו גוגל כרום או פיירפוקס.

בספר המתכונים, הצד השמאלי של דף האינטרנט כולל קטע שבו המשתמש יכול להוסיף מתכונים חדשים. בצד ימין של העמוד, המשתמש יכול להציג ולחפש מתכונים קיימים.

כיצד לבקש מהמשתמש להוסיף מתכון חדש

הוסף את התוכן הראשוני לקובצי HTML, CSS ו-JavaScript. אם אתה לא מכיר מושגי פיתוח אתרים, יש הרבה מקומות שבהם אתה יכול ללמוד פיתוח אתרים באינטרנט.

אתה יכול גם לצפות בדוגמה המלאה של ספר המתכונים בזה ריפו של GitHub.

  1. הוסף את מבנה ה-HTML הבסיסי בקובץ HTML חדש בשם index.html:
    html>
    <html>
    <רֹאשׁ>
    <כותרת>אפליקציית מתכוניםכותרת>
    רֹאשׁ>
    <גוּף>
    <nav>
    <h1>אפליקציית מתכוניםh1>
    nav>
    <divמעמד="מְכוֹלָה">
    תוכן כאן
    div>
    גוּף>
    html>
  2. בתוך מחלקת המכולה, הפרד את הדף לעמודה שמאלית ועמודה ימנית:
    <divמעמד="עמודה שמאל">

    div>
    <divמעמד="עמודה ימנית">

    div>

  3. בתוך העמודה השמאלית, הוסף טופס למשתמש להוספת מתכון חדש. המשתמש יכול להזין את שם המתכון, רשימת המרכיבים ושיטה:
    instagram viewer
    <h3>הוסף מתכוןh3>

    <טופס>
    <תוויתל="שם מתכון">שֵׁם:תווית>
    <קֶלֶטסוּג="טֶקסט"תְעוּדַת זֶהוּת="שם מתכון"נדרש>
    <br />

    <תוויתל="מרכיבי מתכון">רכיבים:תווית>
    <אזור טקסטתְעוּדַת זֶהוּת="מרכיבי מתכון"שורות="5"נדרש>אזור טקסט>
    <br />

    <תוויתל="מתכונים-שיטת">שיטה:תווית>
    <אזור טקסטתְעוּדַת זֶהוּת="מתכונים-שיטת"שורות="5"נדרש>אזור טקסט>
    <br />

    <לַחְצָןסוּג="שלח">הוסף מתכוןלַחְצָן>
    טופס>

  4. בתג head של קובץ ה-HTML, הוסף קישור לקובץ CSS חדש בשם styles.css. צור את הקובץ באותה תיקיה כמו קובץ ה-HTML שלך:
    <קישורrel="גיליון סגנונות"href="styles.css">
  5. בתוך קובץ ה-CSS, הוסף קצת סגנון עבור הדף הכולל:
    גוּף {
    משפחת גופן: פונט סאנס סריף;
    }

    nav {
    צבע רקע: #333;
    עמדה: תוקן;
    חלק עליון: 0;
    רוֹחַב: 100%;
    ריפוד: 20פיקסלים;
    שמאלה: 0;
    צֶבַע: לבן;
    יישור טקסט: מֶרְכָּז;
    }

    .מְכוֹלָה {
    לְהַצִיג: לְהַגמִישׁ;
    כיוון הגמיש: שׁוּרָה;
    להצדיק-תוכן: רווח-בין;
    שולים: 150פיקסלים 5%;
    }

    עמודה שמאל {
    רוֹחַב: 25%;
    }

    .עמודה ימנית {
    רוֹחַב: 65%;
    }

  6. הוסף קצת סטיילינג עבור הוסף מתכונים טופס:
    טופס {
    לְהַצִיג: לְהַגמִישׁ;
    כיוון הגמיש: טור;
    }

    תווית {
    שוליים-תחתית: 10פיקסלים;
    }

    קֶלֶט[סוג="טֶקסט"], אזור טקסט {
    ריפוד: 10פיקסלים;
    שוליים-תחתית: 10פיקסלים;
    גבול-רדיוס: 5פיקסלים;
    גבול: 1פיקסליםמוצק#ccc;
    רוֹחַב: 100%;
    גודל קופסא: תיבת גבול;
    }

    לַחְצָן[סוג="שלח"] {
    ריפוד: 10פיקסלים;
    צבע רקע: #3338;
    צֶבַע: #fff;
    גבול: אף אחד;
    גבול-רדיוס: 5פיקסלים;
    סַמָן: מַצבִּיעַ;
    }

  7. בתחתית תג הגוף בקובץ ה-HTML שלך, הוסף קישור לקובץ JavaScript בשם script.js. צור את הקובץ באותה תיקיה:
    <גוּף>
    תוֹכֶן
    <תַסרִיטsrc="script.js">תַסרִיט>
    גוּף>
  8. בתוך script.js, השתמש בשיטת querySelector כדי לחצות את ה-DOM וקבל את אלמנט הטופס מהדף.
    const טופס = מסמך.querySelector('טופס');
  9. צור מערך חדש לאחסון מתכונים שהמשתמש מזין בטופס:
    לתת מתכונים = [];
  10. בפונקציה חדשה, קבל את השם, המרכיבים ושדות השיטה שהוזנו באמצעות הטופס. אתה יכול גם ליישם אימות טפסים בצד הלקוח כדי למנוע קלטות לא חוקיות, או לבדוק אם כבר קיים מתכון.
    פוּנקצִיָהhandleSubmit(מִקרֶה) {
    // מנע התנהגות ברירת מחדל של שליחת טופס
    event.preventDefault();

    // קבל את שם המתכון, המרכיבים וערכי קלט השיטה
    const nameInput = מסמך.querySelector('#שם-מתכון');
    const ingrInput = מסמך.querySelector('#מתכון-מרכיבים');
    const methodInput = מסמך.querySelector('#מתכונים-שיטה');
    const name = nameInput.value.trim();
    const ingredients = ingrInput.value.trim().split(',').מַפָּה(אני => i.trim());
    const method = methodInput.value.trim();
    }
  11. אם הקלטים תקפים, הוסף אותם למערך המתכונים:
    אם (שם && ingredients.length > 0 && שיטה) {
    const newRecipe = { שם, מרכיבים, שיטה };
    recepts.push (מתכון חדש);
    }
  12. נקה את הקלט בטופס:
    nameInput.value = '';
    ingrInput.value = '';
    methodInput.value = '';
  13. לאחר הפונקציה handleSubmit(), הוסף מאזין אירועים כדי לקרוא לפונקציה כאשר המשתמש שולח את הטופס:
    form.addEventListener('שלח', handleSubmit);
  14. פתח את index.html בדפדפן והצג את הטופס בצד שמאל:

כיצד להציג מתכונים שנוספו

ניתן להציג את המתכונים המאוחסנים במערך המתכונים בצד ימין של העמוד.

  1. בקובץ ה-HTML, הוסף div כדי להציג את רשימת המתכונים בעמודה הימנית. הוסף div נוסף כדי להציג הודעה אם אין מתכונים:
    <divמעמד="עמודה ימנית">
    <divתְעוּדַת זֶהוּת="רשימת מתכונים">div>
    <divתְעוּדַת זֶהוּת="בלי מתכונים">אין לך מתכונים.div>
    div>
  2. הוסף קצת עיצוב CSS לרשימת המתכונים:
    #רשימת מתכונים {
    לְהַצִיג: רֶשֶׁת;
    עמודות-תבנית-רשת: חזור(התאמה אוטומטית, מינימום מקסימום(300פיקסלים, 1fr));
    רשת-פער: 20פיקסלים;
    }

    #ללא מתכונים {
    לְהַצִיג: לְהַגמִישׁ;
    צבע רקע: #FFCCCC;
    ריפוד: 20פיקסלים;
    גבול-רדיוס: 8פיקסלים;
    שוליים למעלה: 44פיקסלים;
    }

  3. בחלק העליון של קובץ JavaScript, קבל את רכיבי ה-HTML המשמשים להצגת רשימת המתכונים והודעת השגיאה:
    const רשימת מתכונים = מסמך.querySelector('#רשימת מתכונים');
    const אין מתכונים = מסמך.getElementById('בלי מתכונים');
  4. בתוך פונקציה חדשה, עברו בלולאה דרך כל מתכון במערך המתכונים. עבור כל מתכון, צור div חדש כדי להציג את המתכון הזה:
    פוּנקצִיָהמציג מתכונים() {
    recipeList.innerHTML = '';
    recipes.forEach((מתכון, אינדקס) => {
    const recipeDiv ​​= מסמך‎.createElement('div');
    });
    }
  5. הוסף קצת תוכן ל-div המתכון האישי כדי להציג את השם, המרכיבים והשיטה. ה-div יכלול גם כפתור מחיקה. תוסיף את הפונקציונליות הזו בשלבים מאוחרים יותר:
    recipeDiv.innerHTML = `

    ${recipe.name}</h3>

    <חָזָק>רכיבים:חָזָק></p>


      ${recipe.ingredients.map(ingr =>`
    • ${ingr}
    • `
      ).לְהִצְטַרֵף('')}
      </ul>

      <חָזָק>שיטה:חָזָק></p>

      ${recipe.method}</p>

  6. הוסף מחלקה לסגנון ה-div:
    recipeDiv.classList.add('מתכון');
  7. הוסף את ה-div החדש לרכיב HTML של receptList:
    recipeList.appendChild (recipeDiv);
  8. הוסף את הסגנון של המחלקה בקובץ ה-CSS:
    .מתכון {
    גבול: 1פיקסליםמוצק#ccc;
    ריפוד: 10פיקסלים;
    גבול-רדיוס: 5פיקסלים;
    צל קופסא: 0 2פיקסלים 4פיקסליםrgba(0,0,0,.2);
    }

    .מתכוןh3 {
    שוליים למעלה: 0;
    שוליים-תחתית: 10פיקסלים;
    }

    .מתכוןul {
    שולים: 0;
    ריפוד: 0;
    בסגנון רשימה: אף אחד;
    }

    .מתכוןulלי {
    שוליים-תחתית: 5פיקסלים;
    }

  9. בדוק אם יש יותר ממתכון אחד. אם כן, הסתר את הודעת השגיאה:
    noRecipes.style.display = recipes.length > 0? 'none': 'flex';
  10. קרא לפונקציה החדשה בתוך הפונקציה handleSubmit() לאחר הוספת המתכון החדש למערך המתכונים:
    displayRecipes();
  11. פתח את index.html בדפדפן:
  12. הוסף מתכונים לרשימה וצפה בהם מופיעים בצד ימין:

כיצד למחוק מתכונים

אתה יכול למחוק מתכונים על ידי לחיצה על לִמְחוֹק לחצן מתחת להוראות של מתכון.

  1. הוסף קצת סגנון CSS עבור כפתור המחיקה:
    .מחק-לחצן {
    צבע רקע: #dc3545;
    צֶבַע: #fff;
    גבול: אף אחד;
    גבול-רדיוס: 5פיקסלים;
    ריפוד: 5פיקסלים 10פיקסלים;
    סַמָן: מַצבִּיעַ;
    }

    .מחק-לחצן:לְרַחֵף {
    צבע רקע: #c82333;
    }

  2. בקובץ JavaScript, הוסף פונקציה חדשה למחיקת מתכון:
    פוּנקצִיָהhandleDelete(מִקרֶה) {

    }

  3. באמצעות אירוע JavaScript, מצא את האינדקס של המתכון שהמשתמש לחץ עליו:
    אם (event.target.classList.contains('לחצן מחיקה')) {
    const index = event.target.dataset.index;
    }
  4. השתמש באינדקס כדי למחוק את המתכון שנבחר ממערך המתכונים:
    recepts.splice (אינדקס, 1);
  5. רענן את רשימת המתכונים המוצגת בעמוד:
    displayRecipes();
  6. הוסף מאזין אירועים כדי לקרוא לפונקציה handleDelete() כאשר המשתמש לוחץ על כפתור המחיקה:
    recipeList.addEventListener('נְקִישָׁה', handleDelete);
  7. פתח את index.html בדפדפן. הוסף מתכון לצפייה בכפתור המחיקה:

איך לחפש מתכונים

ניתן לחפש מתכונים באמצעות סרגל החיפוש כדי לבדוק אם קיים מתכון מסוים.

  1. בתוך העמודה הימנית, הוסף סרגל חיפוש לפני רשימת המתכונים:
    <divתְעוּדַת זֶהוּת="מדור חיפוש">
    <h3>רשימת מתכוניםh3>
    <תוויתל="תיבת חיפוש">לחפש:תווית>
    <קֶלֶטסוּג="טֶקסט"תְעוּדַת זֶהוּת="תיבת חיפוש">
    div>
  2. הוסף סגנון CSS עבור תווית סרגל החיפוש:
    תווית[עבור="תיבת חיפוש"] {
    לְהַצִיג: לַחסוֹם;
    שוליים-תחתית: 10פיקסלים;
    }
  3. ב-script.js, קבל את רכיב ה-HTML של תיבת החיפוש:
    const תיבת חיפוש = מסמך.getElementById('תיבת חיפוש');
  4. בתוך פונקציה חדשה, צור מערך חדש המכיל מתכונים ששמם תואם לקלט החיפוש:
    פוּנקצִיָהלחפש(שאילתא) {
    const filteredRecipes = recipes.filter(מתכון => {
    לַחֲזוֹר recipe.name.toLowerCase().includes (query.toLowerCase());
    });
    }
  5. נקה את רשימת המתכונים המוצגת כעת על המסך:
    recipeList.innerHTML = '';
  6. עברו בלולאה בכל מתכון מסונן התואם את תוצאת החיפוש, וצור רכיב div חדש:
    filteredRecipes.forEach(מתכון => {
    const מתכוןEl = מסמך‎.createElement('div');
    });
  7. הוסף את תוכן ה-HTML של המתכון המסונן ל-div:
    recipeEl.innerHTML = `

    ${recipe.name}</h3>

    <חָזָק>רכיבים:חָזָק></p>


      ${recipe.ingredients.map(ingr =>`
    • ${ingr}
    • `
      ).לְהִצְטַרֵף('')}
      </ul>

      <חָזָק>שיטה:חָזָק></p>

      ${recipe.method}</p>

  8. הוסף את אותה מחלקת מתכונים לעיצוב עקבי. הוסף את ה-div החדש לרשימה המוצגת בעמוד:
    recipeEl.classList.add('מתכון');
    recipeList.appendChild (recipeEl);
  9. הוסף מאזין אירועים כדי לקרוא לפונקציית החיפוש() כאשר המשתמש מקליד בסרגל החיפוש:
    searchBox.addEventListener('קֶלֶט', event => חיפוש (event.target.value));
  10. בתוך הפונקציה handleDelete(), נקה את תיבת החיפוש אם המשתמש מוחק פריט, כדי לרענן את הרשימה:
    searchBox.value = '';
  11. פתח את index.html בדפדפן אינטרנט כדי להציג את סרגל החיפוש החדש, והוסף כמה מתכונים:
  12. הוסף שם מתכון לסרגל החיפוש כדי לסנן את רשימת המתכונים:

יצירת פרויקטים עם HTML, CSS ו-JavaScript

פרויקט זה מדגים כיצד לבנות ממשק קצה עבור ספר מתכונים פשוט. שים לב שאין שרת אחורי והאפליקציה לא מחזיקה נתונים; אם תרענן את הדף, תאבד את השינויים שלך. הרחבה אפשרית אחת שתוכל לעבוד עליה היא מנגנון לשמירה וטעינת נתונים באמצעות localStorage.

כדי לשפר את כישורי פיתוח האינטרנט שלך, המשך לחקור פרויקטים מהנים אחרים שאתה יכול ליצור במחשב שלך.