CSSチャレンジ3



更新
いくつかのIRLスタッフのために、私は来週の次の挑戦を掲示しています.また、任務のためにより多くの時間があることを意味します.ご迷惑をおかけして申し訳ありません.
それはすでに第3週です、damnは飛行時間か何ですか.先週の投稿です
もはや利用できない記事

これは何
あなたが新しいならば、そこにこんにちは!CSSであなたのスキルを向上させたいです.これは、あなたが提案された機能や要素を再現するように挑戦するだけでそれを行うのを助けることを目的としたシリーズです.私は、ものを造るとき、使用である挑戦を掲示するだけです.だからコードゴルフや不明瞭なもの.
これは毎週の挑戦ですので、毎週月曜日に新しいものが構築されます.また、毎週月曜日の挑戦にすべての提出をまとめます.
あなたが解決策を解決する場合は、コメントの投稿リンク(コメント、コードルズ、jsfiddles、何を好む).

カレンダー
この課題は、カレンダーを作ることです.あなたは純粋なJSのロジックを行うことができます、反応、Vueなど.
JavaScriptで経験していないか、それに対処したくない人のために、ここで、私はすべてをする若干の純粋なJSコードを提供しました、それで、あなたはデザインに集中することができます.ちょうどデザインdocベローに従ってください.

要件
カレンダーを含める必要があります
  • あなたが見ている月を表示するテキスト
  • 選択した月を切り替えるためのボタン
  • 選択した月に戻るボタン
  • 毎月の毎日のイニシャル

  • ので、あなたはそれを行う必要はありません
    var calendarNode = document.querySelector("#calendar");
    
    var currDate = new Date();
    var currYear = currDate.getFullYear();
    var currMonth = currDate.getMonth() + 1;
    
    var selectedYear = currYear;
    var selectedMonth = currMonth;
    var selectedMonthName = getMonthName(selectedYear, selectedMonth);
    var selectedMonthDays = getDayCount(selectedYear, selectedMonth);
    
    renderDOM(selectedYear, selectedMonth);
    
    function getMonthName (year, month) {
        let selectedDate = new Date(year, month-1, 1);
        return selectedDate.toLocaleString('default', { month: 'long' });
    }
    
    function getMonthText () {
        if (selectedYear === currYear)
            return selectedMonthName;
        else
            return selectedMonthName + ", " + selectedYear;
    }
    
    function getDayName (year, month, day) {
        let selectedDate = new Date(year, month-1, day);
        return selectedDate.toLocaleDateString('en-US',{weekday: 'long'});
    }
    
    function getDayCount (year, month) {
        return 32 - new Date(year, month-1, 32).getDate();
    }
    
    function getDaysArray () {
        let emptyFieldsCount = 0;
        let emptyFields = [];
        let days = [];
    
        switch(getDayName(selectedYear, selectedMonth, 1))
        {
            case "Tuesday":
                emptyFieldsCount = 1;
                break;
            case "Wednesday":
                emptyFieldsCount = 2;
                break;
            case "Thursday":
                emptyFieldsCount = 3;
                break;
            case "Friday":
                emptyFieldsCount = 4;
                break;
            case "Saturday":
                emptyFieldsCount = 5;
                break;
            case "Sunday":
                emptyFieldsCount = 6;
                break;
        }
    
        emptyFields = Array(emptyFieldsCount).fill("");
        days = Array.from(Array(selectedMonthDays + 1).keys());
        days.splice(0, 1);
    
        return emptyFields.concat(days);
    }
    
    function renderDOM (year, month) {
      let newCalendarNode = document.createElement("div");
      newCalendarNode.id = "calendar";
      newCalendarNode.className = "calendar";
    
      let dateText = document.createElement("div");
      dateText.append(getMonthText());
      dateText.className = "date-text";
      newCalendarNode.append(dateText);
    
      let leftArrow = document.createElement("div");
      leftArrow.append("«");
      leftArrow.className = "button";
      leftArrow.addEventListener("click", goToPrevMonth);
      newCalendarNode.append(leftArrow);
    
      let curr = document.createElement("div");
      curr.append("📅");
      curr.className = "button";
      curr.addEventListener("click", goToCurrDate);
      newCalendarNode.append(curr);
    
      let rightArrow = document.createElement("div");
      rightArrow.append("»");
      rightArrow.className = "button";
      rightArrow.addEventListener("click", goToNextMonth);
      newCalendarNode.append(rightArrow);
    
      let dayNames = ["M", "T", "W", "T", "F", "S", "S"];
    
      dayNames.forEach((cellText) => {
        let cellNode = document.createElement("div");
        cellNode.className = "cell cell--unselectable";
        cellNode.append(cellText);
        newCalendarNode.append(cellNode);
      });
    
      let days = getDaysArray(year, month);
    
      days.forEach((cellText) => {
        let cellNode = document.createElement("div");
        cellNode.className = "cell";
        cellNode.append(cellText);
        newCalendarNode.append(cellNode);
      });
    
      calendarNode.replaceWith(newCalendarNode);
      calendarNode = document.querySelector("#calendar");
    }
    
    function goToPrevMonth () {
        selectedMonth--;
        if (selectedMonth === 0) {
            selectedMonth = 12;
            selectedYear--;
        }
        selectedMonthDays = getDayCount(selectedYear, selectedMonth);
        selectedMonthName = getMonthName(selectedYear, selectedMonth);
    
        renderDOM(selectedYear, selectedMonth);
    }
    
    function goToNextMonth () {
        selectedMonth++;
        if (selectedMonth === 13) {
            selectedMonth = 0;
            selectedYear++;
        }
        selectedMonthDays = getDayCount(selectedYear, selectedMonth);
        selectedMonthName = getMonthName(selectedYear, selectedMonth);
    
        renderDOM(selectedYear, selectedMonth);
    }
    
    function goToCurrDate () {
        selectedYear = currYear;
        selectedMonth = currMonth;
    
        selectedMonthDays = getDayCount(selectedYear, selectedMonth);
        selectedMonthName = getMonthName(selectedYear, selectedMonth);
    
        renderDOM(selectedYear, selectedMonth);
    }
    

    デザインドキュメント
  • HTMLについて<div id="calendar" class="calendar"></div>
  • the renderDOM 関数は以下のようにしてカレンダーのdivに追加します.
  • テキストを指定します.class="date-text" )
  • ボタンを前に、現在と次の月に行くclass="button" )
  • 各曜日の初期値class="cell cell--unselectable" )
  • 毎月の日付と空のセルの適切な量class="cell" )

  • 続きを読む
    提供されているJSを使用する場合は
  • MDN - grid-auto-flow
  • MDN - grid-column
  • 何をしたいのか
  • MDN - Date
  • MDN - Date.prototype.toLocaleString()
  • MDN - Array.prototype.fill()
  • それは今週の楽しみだ.