Νοημοσύνη δεδομένων Πλάτωνα.
Κάθετη Αναζήτηση & Αι.

Δημιουργία ημερολογίων με γνώμονα την προσβασιμότητα και τη διεθνοποίηση

Ημερομηνία:

Κάνοντας μια γρήγορη αναζήτηση εδώ στο CSS-Tricks δείχνει πόσοι διαφορετικοί τρόποι υπάρχουν για να προσεγγίσετε τα ημερολόγια. Κάποιοι δείχνουν πώς Το CSS Grid μπορεί να δημιουργήσει τη διάταξη αποτελεσματικά. Κάποιοι προσπαθούν να φέρνουν πραγματικά δεδομένα στο μείγμα. Μερικοί βασίζονται σε ένα πλαίσιο να βοηθήσει στην κρατική διαχείριση.

Υπάρχουν πολλές σκέψεις κατά τη δημιουργία ενός στοιχείου ημερολογίου — πολύ περισσότερο από αυτό που καλύπτεται στα άρθρα που συνέδεσα. Αν το καλοσκεφτείτε, τα ημερολόγια είναι γεμάτα αποχρώσεις, από το χειρισμό των ζωνών ώρας και των μορφών ημερομηνίας μέχρι την τοπική προσαρμογή και ακόμη και τη διασφάλιση της ροής των ημερομηνιών από τον ένα μήνα στον άλλο… και αυτό είναι πριν καν λάβουμε υπόψη την προσβασιμότητα και τις πρόσθετες εκτιμήσεις διάταξης ανάλογα με το πού βρίσκεται το ημερολόγιο εμφανίζεται και τι όχι.

Πολλοί προγραμματιστές φοβούνται το Date() αντικείμενο και μείνετε με παλιότερες βιβλιοθήκες όπως moment.js. Όμως, ενώ υπάρχουν πολλά "gotchas" όσον αφορά τις ημερομηνίες και τη μορφοποίηση, η JavaScript έχει πολλά δροσερά API και πράγματα για να βοηθήσει!

Ημερολογιακό πλέγμα Ιανουαρίου 2023.

Δεν θέλω να δημιουργήσω ξανά τον τροχό εδώ, αλλά θα σας δείξω πώς μπορούμε να δημιουργήσουμε ένα καλό ημερολόγιο με JavaScript βανίλιας. Θα εξετάσουμε προσιτότητα, χρησιμοποιώντας σημασιολογική σήμανση και φιλική προς τον αναγνώστη οθόνης <time> -ετικέτες — καθώς και διεθνοποίηση και μορφοποίηση, Με τη χρήση του Intl.Locale, Intl.DateTimeFormat και Intl.NumberFormat-API.

Με άλλα λόγια, φτιάχνουμε ένα ημερολόγιο… μόνο χωρίς τις επιπλέον εξαρτήσεις που συνήθως βλέπετε να χρησιμοποιούνται σε ένα σεμινάριο όπως αυτό, και με ορισμένες από τις αποχρώσεις που μπορεί να μην βλέπετε συνήθως. Και, στη διαδικασία, ελπίζω να κερδίσετε μια νέα εκτίμηση για νεότερα πράγματα που μπορεί να κάνει η JavaScript, ενώ θα έχετε μια ιδέα για τα είδη των πραγμάτων που περνάνε από το μυαλό μου όταν συνθέτω κάτι τέτοιο μαζί.

Πρώτα, ονοματοδοσία

Πώς πρέπει να ονομάζουμε στοιχείο του ημερολογίου μας; Στη μητρική μου γλώσσα, θα ονομαζόταν "στοιχείο kalender", οπότε ας το χρησιμοποιήσουμε και ας το συντομεύσουμε σε "Kal-El" - επίσης γνωστό ως Το όνομα του Σούπερμαν στον πλανήτη Κρύπτον.

Ας δημιουργήσουμε μια συνάρτηση για να ξεκινήσουν τα πράγματα:

function kalEl(settings = {}) { ... }

Αυτή η μέθοδος θα αποδοθεί ένα μόνο μήνα. Αργότερα θα καλέσουμε αυτή τη μέθοδο από [...Array(12).keys()] να αποδώσει έναν ολόκληρο χρόνο.

Αρχικά στοιχεία και διεθνοποίηση

Ένα από τα κοινά πράγματα που κάνει ένα τυπικό διαδικτυακό ημερολόγιο είναι να επισημαίνει την τρέχουσα ημερομηνία. Ας δημιουργήσουμε λοιπόν μια αναφορά για αυτό:

const today = new Date();

Στη συνέχεια, θα δημιουργήσουμε ένα "αντικείμενο διαμόρφωσης" που θα συγχωνεύσουμε με το προαιρετικό settings αντικείμενο της κύριας μεθόδου:

const config = Object.assign( { locale: (document.documentElement.getAttribute('lang') || 'en-US'), today: { day: today.getDate(), month: today.getMonth(), year: today.getFullYear() } }, settings
);

Ελέγχουμε αν το ριζικό στοιχείο (<html>) περιέχει α lang-ιδιότητα με τοπικός πληροφορίες? Διαφορετικά, θα επιστρέψουμε στη χρήση en-US. Αυτό είναι το πρώτο βήμα προς την κατεύθυνση διεθνοποίηση του ημερολογίου.

Πρέπει επίσης να καθορίσουμε ποιος μήνας θα εμφανίζεται αρχικά κατά την απόδοση του ημερολογίου. Γι' αυτό επεκτείναμε το config αντικείμενο με το πρωτεύον date. Με αυτόν τον τρόπο, εάν δεν προβλέπεται ημερομηνία στο settings αντικείμενο, θα χρησιμοποιήσουμε το today αναφορά αντί για:

const date = config.date ? new Date(config.date) : today;

Χρειαζόμαστε λίγες περισσότερες πληροφορίες για να μορφοποιήσουμε σωστά το ημερολόγιο με βάση τις τοπικές ρυθμίσεις. Για παράδειγμα, μπορεί να μην γνωρίζουμε αν η πρώτη ημέρα της εβδομάδας είναι Κυριακή ή Δευτέρα, ανάλογα με την τοποθεσία. Αν έχουμε τις πληροφορίες, τέλεια! Αλλά αν όχι, θα το ενημερώσουμε χρησιμοποιώντας το Intl.Locale API. Το API έχει ένα weekInfo αντικείμενο που επιστρέφει a firstDay ακίνητο που μας δίνει ακριβώς αυτό που ψάχνουμε χωρίς καμία ταλαιπωρία. Μπορούμε επίσης να μάθουμε ποιες ημέρες της εβδομάδας έχουν αντιστοιχιστεί στο weekend:

if (!config.info) config.info = new Intl.Locale(config.locale).weekInfo || { firstDay: 7, weekend: [6, 7] };

Και πάλι, δημιουργούμε εναλλακτικές λύσεις. Η «πρώτη μέρα» της εβδομάδας για en-US είναι Κυριακή, άρα είναι προεπιλεγμένη η τιμή του 7. Αυτό είναι λίγο μπερδεμένο, καθώς το getDay μέθοδος στο JavaScript επιστρέφει τις ημέρες ως [0-6], Όπου 0 είναι Κυριακή… μη με ρωτήσετε γιατί. Ως εκ τούτου, τα Σαββατοκύριακα είναι Σάββατο και Κυριακή [6, 7].

Πριν είχαμε το Intl.Locale API και του weekInfo μέθοδο, ήταν αρκετά δύσκολο να δημιουργήσετε ένα διεθνές ημερολόγιο χωρίς πολλά **αντικείμενα και πίνακες με πληροφορίες για κάθε τοποθεσία ή περιοχή. Στις μέρες μας, είναι εύκολο. Αν περάσουμε μέσα en-GB, η μέθοδος επιστρέφει:

// en-GB
{ firstDay: 1, weekend: [6, 7], minimalDays: 4
}

Σε μια χώρα όπως το Μπρουνέι (ms-BN), το Σαββατοκύριακο είναι Παρασκευή και Κυριακή:

// ms-BN
{ firstDay: 7, weekend: [5, 7], minimalDays: 1
}

Ίσως αναρωτιέστε τι είναι αυτό minimalDays ιδιοκτησία είναι. Αυτό είναι το λιγότερες ημέρες που απαιτούνται την πρώτη εβδομάδα ενός μήνα για να υπολογίζονται ως πλήρης εβδομάδα. Σε ορισμένες περιοχές, μπορεί να είναι μόνο μια μέρα. Για άλλους, μπορεί να είναι ολόκληρες επτά ημέρες.

Στη συνέχεια, θα δημιουργήσουμε ένα render μέθοδο μέσα μας kalEl-μέθοδος:

const render = (date, locale) => { ... }

Χρειαζόμαστε ακόμα κάποια δεδομένα για να εργαστούμε πριν αποδώσουμε οτιδήποτε:

const month = date.getMonth();
const year = date.getFullYear();
const numOfDays = new Date(year, month + 1, 0).getDate();
const renderToday = (year === config.today.year) && (month === config.today.month);

Το τελευταίο είναι α Boolean που ελέγχει αν today υπάρχει τον μήνα που πρόκειται να αποδώσουμε.

Σημασιολογική σήμανση

Θα εμβαθύνουμε στην απόδοση σε λίγο. Αλλά πρώτα, θέλω να βεβαιωθώ ότι οι λεπτομέρειες που ρυθμίζουμε έχουν σημασιολογικές ετικέτες HTML που σχετίζονται με αυτές. Η ρύθμιση του από το κουτί μας παρέχει πλεονεκτήματα προσβασιμότητας από την αρχή.

Περιτύλιγμα ημερολογίου

Πρώτον, έχουμε το μη σημασιολογικό περιτύλιγμα: <kal-el>. Αυτό είναι εντάξει γιατί δεν υπάρχει σημασιολογική <calendar> ετικέτα ή κάτι τέτοιο. Αν δεν φτιάχναμε ένα προσαρμοσμένο στοιχείο, <article> μπορεί να είναι το πιο κατάλληλο στοιχείο αφού το ημερολόγιο θα μπορούσε να σταθεί στη δική του σελίδα.

Ονόματα μηνών

Η <time> Το στοιχείο θα είναι σημαντικό για εμάς γιατί βοηθά στη μετάφραση των ημερομηνιών σε μια μορφή που οι αναγνώστες οθόνης και οι μηχανές αναζήτησης μπορούν να αναλύσουν με μεγαλύτερη ακρίβεια και συνέπεια. Για παράδειγμα, δείτε πώς μπορούμε να μεταφέρουμε το "Ιανουάριος 2023" στη σήμανση:

<time datetime="2023-01">January <i>2023</i></time>

Ονόματα ημερών

Η σειρά πάνω από τις ημερομηνίες του ημερολογίου που περιέχει τα ονόματα των ημερών της εβδομάδας μπορεί να είναι δύσκολη. Είναι ιδανικό αν μπορούμε να γράψουμε τα πλήρη ονόματα για κάθε μέρα — π.χ. Κυριακή, Δευτέρα, Τρίτη κ.λπ. — αλλά αυτό μπορεί να καταλαμβάνει πολύ χώρο. Λοιπόν, ας συντομεύσουμε τα ονόματα προς το παρόν μέσα σε ένα <ol> όπου κάθε μέρα είναι α <li>:

<ol> <li><abbr title="Sunday">Sun</abbr></li> <li><abbr title="Monday">Mon</abbr></li> <!-- etc. -->
</ol>

Θα μπορούσαμε να δυσκολευτούμε με το CSS για να πάρουμε το καλύτερο και από τους δύο κόσμους. Για παράδειγμα, αν τροποποιούσαμε τη σήμανση κάπως ως εξής:

<ol> <li> <abbr title="S">Sunday</abbr> </li>
</ol>

…λαμβάνουμε τα πλήρη ονόματα από προεπιλογή. Μπορούμε στη συνέχεια να "κρύψουμε" το πλήρες όνομα όταν τελειώσει ο χώρος και να εμφανίσουμε το title χαρακτηριστικό αντί για:

@media all and (max-width: 800px) { li abbr::after { content: attr(title); }
}

Όμως, δεν πάμε έτσι γιατί το Intl.DateTimeFormat Το API μπορεί να βοηθήσει και εδώ. Θα φτάσουμε σε αυτό στην επόμενη ενότητα όταν καλύψουμε την απόδοση.

Αριθμοί ημερών

Κάθε ημερομηνία στο πλέγμα του ημερολογίου λαμβάνει έναν αριθμό. Κάθε αριθμός είναι ένα στοιχείο λίστας (<li>) σε μια ταξινομημένη λίστα (<ol>), και το ενσωματωμένο <time> η ετικέτα αναδιπλώνει τον πραγματικό αριθμό.

<li> <time datetime="2023-01-01">1</time>
</li>

Και ενώ δεν σκοπεύω να κάνω κάποιο styling ακόμα, ξέρω ότι θα ήθελα κάποιο τρόπο να διαμορφώσω τους αριθμούς των ημερομηνιών. Αυτό είναι δυνατό ως έχει, αλλά θέλω επίσης να μπορώ να διαμορφώνω τους αριθμούς της εβδομάδας διαφορετικά από τους αριθμούς του Σαββατοκύριακου, αν χρειάζεται. Λοιπόν, πρόκειται να συμπεριλάβω data-* γνωρίσματα ειδικά για αυτό: data-weekend και data-today.

Αριθμοί εβδομάδας

Υπάρχουν 52 εβδομάδες το χρόνο, μερικές φορές 53. Αν και δεν είναι πολύ συνηθισμένο, μπορεί να είναι ωραίο να εμφανίζεται ο αριθμός για μια δεδομένη εβδομάδα στο ημερολόγιο για πρόσθετο πλαίσιο. Μου αρέσει να το έχω τώρα, ακόμα κι αν δεν τελειώσω να το χρησιμοποιήσω. Αλλά θα το χρησιμοποιήσουμε πλήρως σε αυτό το σεμινάριο.

Θα χρησιμοποιήσουμε α data-weeknumber χαρακτηριστικό ως άγκιστρο στυλ και συμπεριλάβετέ το στη σήμανση για κάθε ημερομηνία που είναι το πρώτο ραντεβού της εβδομάδας.

<li data-day="7" data-weeknumber="1" data-weekend=""> <time datetime="2023-01-08">8</time>
</li>

απόδοση

Ας βάλουμε το ημερολόγιο σε μια σελίδα! Το ξέρουμε ήδη <kal-el> είναι το όνομα του προσαρμοσμένου στοιχείου μας. Το πρώτο πράγμα που πρέπει να ρυθμίσουμε είναι να ρυθμίσουμε το firstDay ιδιοκτησία σε αυτό, ώστε το ημερολόγιο να γνωρίζει εάν η Κυριακή ή κάποια άλλη μέρα είναι η πρώτη ημέρα της εβδομάδας.

<kal-el data-firstday="${ config.info.firstDay }">

Θα χρησιμοποιούμε πρότυπο κυριολεκτικά για απόδοση της σήμανσης. Για να μορφοποιήσουμε τις ημερομηνίες για ένα διεθνές κοινό, θα χρησιμοποιήσουμε το Intl.DateTimeFormat API, χρησιμοποιώντας ξανά το locale διευκρινίσαμε νωρίτερα.

Ο μήνας και το έτος

Όταν καλούμε το month, μπορούμε να ορίσουμε αν θέλουμε να χρησιμοποιήσουμε το long όνομα (π.χ. Φεβρουάριος) ή το short όνομα (π.χ. Φεβ.). Ας χρησιμοποιήσουμε το long όνομα αφού είναι ο τίτλος πάνω από το ημερολόγιο:

<time datetime="${year}-${(pad(month))}"> ${new Intl.DateTimeFormat( locale, { month:'long'}).format(date)} <i>${year}</i>
</time>

Ονόματα της εβδομάδας

Για τις καθημερινές που εμφανίζονται πάνω από το πλέγμα των ημερομηνιών, χρειαζόμαστε και τα δύο long (π.χ. «Κυριακή») και short (συντομογραφία, δηλ. «Ήλιος») ονόματα. Με αυτόν τον τρόπο, μπορούμε να χρησιμοποιήσουμε το "σύντομο" όνομα όταν το ημερολόγιο είναι μικρό σε χώρο:

Intl.DateTimeFormat([locale], { weekday: 'long' })
Intl.DateTimeFormat([locale], { weekday: 'short' })

Ας φτιάξουμε μια μικρή βοηθητική μέθοδο που διευκολύνει λίγο την κλήση καθεμιάς:

const weekdays = (firstDay, locale) => { const date = new Date(0); const arr = [...Array(7).keys()].map(i => { date.setDate(5 + i) return { long: new Intl.DateTimeFormat([locale], { weekday: 'long'}).format(date), short: new Intl.DateTimeFormat([locale], { weekday: 'short'}).format(date) } }) for (let i = 0; i < 8 - firstDay; i++) arr.splice(0, 0, arr.pop()); return arr;
}

Δείτε πώς το επικαλούμαστε αυτό στο πρότυπο:

<ol> ${weekdays(config.info.firstDay,locale).map(name => ` <li> <abbr title="${name.long}">${name.short}</abbr> </li>`).join('') }
</ol>

Αριθμοί ημερών

Και τέλος, οι μέρες, τυλιγμένες σε ένα <ol> στοιχείο:

${[...Array(numOfDays).keys()].map(i => { const cur = new Date(year, month, i + 1); let day = cur.getDay(); if (day === 0) day = 7; const today = renderToday && (config.today.day === i + 1) ? ' data-today':''; return ` <li data-day="${day}"${today}${i === 0 || day === config.info.firstDay ? ` data-weeknumber="${new Intl.NumberFormat(locale).format(getWeek(cur))}"`:''}${config.info.weekend.includes(day) ? ` data-weekend`:''}> <time datetime="${year}-${(pad(month))}-${pad(i)}" tabindex="0"> ${new Intl.NumberFormat(locale).format(i + 1)} </time> </li>`
}).join('')}

Ας το αναλύσουμε:

  1. Δημιουργούμε έναν "εικονικό" πίνακα, με βάση τη μεταβλητή "αριθμός ημερών", τον οποίο θα χρησιμοποιήσουμε για να επαναλάβουμε.
  2. Δημιουργούμε ένα day μεταβλητή για την τρέχουσα ημέρα στην επανάληψη.
  3. Διορθώνουμε την απόκλιση μεταξύ των Intl.Locale API και getDay().
  4. Εάν η day είναι ίσο με today, προσθέτουμε α data-* αποδίδουν.
  5. Τέλος, επιστρέφουμε το <li> στοιχείο ως συμβολοσειρά με συγχωνευμένα δεδομένα.
  6. tabindex="0" κάνει το στοιχείο εστιασμένο, όταν χρησιμοποιείτε πλοήγηση με πληκτρολόγιο, μετά από οποιεσδήποτε θετικές τιμές ευρετηρίου καρτελών (Σημείωση: θα πρέπει να ποτέ προσθέτω θετικός tabindex-values)

Προς την «κουμπώστε» τους αριθμούς στο datetime χαρακτηριστικό, χρησιμοποιούμε μια μικρή βοηθητική μέθοδο:

const pad = (val) => (val + 1).toString().padStart(2, '0');

Αριθμός εβδομάδας

Και πάλι, ο «αριθμός της εβδομάδας» είναι όπου μια εβδομάδα εμπίπτει σε ένα ημερολόγιο 52 εβδομάδων. Χρησιμοποιούμε μια μικρή βοηθητική μέθοδο και για αυτό:

function getWeek(cur) { const date = new Date(cur.getTime()); date.setHours(0, 0, 0, 0); date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7); const week = new Date(date.getFullYear(), 0, 4); return 1 + Math.round(((date.getTime() - week.getTime()) / 86400000 - 3 + (week.getDay() + 6) % 7) / 7);
}

Δεν το έγραψα αυτό getWeek-μέθοδος. Είναι μια καθαρισμένη έκδοση του αυτό το σενάριο.

Και τέλος! Χάρη στο Intl.Locale, Intl.DateTimeFormat και Intl.NumberFormat API, μπορούμε πλέον απλώς να αλλάξουμε τα lang-ιδιότητα του <html> στοιχείο για την αλλαγή του περιβάλλοντος του ημερολογίου με βάση την τρέχουσα περιοχή:

Ημερολογιακό πλέγμα Ιανουαρίου 2023.
de-DE
Ημερολογιακό πλέγμα Ιανουαρίου 2023.
fa-IR
Ημερολογιακό πλέγμα Ιανουαρίου 2023.
zh-Hans-CN-u-nu-hanidec

Διαμόρφωση του ημερολογίου

Ίσως θυμάστε πώς όλες οι μέρες είναι μόνο μία <ol> με στοιχεία λίστας. Για να τα διαμορφώσουμε σε ένα ευανάγνωστο ημερολόγιο, βουτάμε στον υπέροχο κόσμο του CSS Grid. Στην πραγματικότητα, μπορούμε να επαναχρησιμοποιήσουμε το ίδιο πλέγμα από ένα αρχικό πρότυπο ημερολογίου εδώ στο CSS-Tricks, αλλά ενημέρωσε ένα smidge με το :is() σχεσιακό ψευδο για τη βελτιστοποίηση του κώδικα.

Σημειώστε ότι στην πορεία ορίζω διαμορφώσιμες μεταβλητές CSS (και τους τοποθετώ με πρόθεμα ---kalel- για αποφυγή συγκρούσεων).

kal-el :is(ol, ul) { display: grid; font-size: var(--kalel-fz, small); grid-row-gap: var(--kalel-row-gap, .33em); grid-template-columns: var(--kalel-gtc, repeat(7, 1fr)); list-style: none; margin: unset; padding: unset; position: relative;
}
Πλέγμα ημερολογίου επτά στηλών με εμφανιζόμενες γραμμές πλέγματος.

Ας σχεδιάσουμε περιγράμματα γύρω από τους αριθμούς ημερομηνίας για να τους βοηθήσουμε να διαχωριστούν οπτικά:

kal-el :is(ol, ul) li { border-color: var(--kalel-li-bdc, hsl(0, 0%, 80%)); border-style: var(--kalel-li-bds, solid); border-width: var(--kalel-li-bdw, 0 0 1px 0); grid-column: var(--kalel-li-gc, initial); text-align: var(--kalel-li-tal, end); }

Το πλέγμα των επτά στηλών λειτουργεί καλά όταν είναι η πρώτη ημέρα του μήνα Επίσης την πρώτη ημέρα της εβδομάδας για την επιλεγμένη τοποθεσία). Αλλά αυτό είναι η εξαίρεση παρά ο κανόνας. Τις περισσότερες φορές, θα χρειαστεί να αλλάξουμε την πρώτη ημέρα του μήνα σε διαφορετική καθημερινή.

Εμφάνιση της πρώτης ημέρας του μήνα που πέφτει Πέμπτη.

Θυμηθείτε όλα τα επιπλέον data-* χαρακτηριστικά που ορίσαμε κατά τη σύνταξη της σήμανσής μας; Μπορούμε να συνδέσουμε αυτά για να ενημερώσουμε ποια στήλη πλέγματος (--kalel-li-gc) ο αριθμός της πρώτης ημερομηνίας του μήνα τοποθετείται στις:

[data-firstday="1"] [data-day="3"]:first-child { --kalel-li-gc: 1 / 4;
}

Σε αυτήν την περίπτωση, εκτείνουμε από την πρώτη στήλη πλέγματος στην τέταρτη στήλη πλέγματος — η οποία θα «σπρώξει» αυτόματα το επόμενο στοιχείο (Ημέρα 2) στην πέμπτη στήλη πλέγματος και ούτω καθεξής.

Ας προσθέσουμε λίγο στυλ στην «τρέχουσα» ημερομηνία, ώστε να ξεχωρίζει. Αυτά είναι απλά τα στυλ μου. Εδώ μπορείτε να κάνετε ό,τι θέλετε.

[data-today] { --kalel-day-bdrs: 50%; --kalel-day-bg: hsl(0, 86%, 40%); --kalel-day-hover-bgc: hsl(0, 86%, 70%); --kalel-day-c: #fff;
}

Μου αρέσει η ιδέα να διαμορφώνω τους αριθμούς ημερομηνίας για τα Σαββατοκύριακα διαφορετικά από τις καθημερινές. Θα χρησιμοποιήσω ένα κοκκινωπό χρώμα για να τα διαμορφώσω. Σημειώστε ότι μπορούμε να φτάσουμε για το :not() ψευδο-κλάση για να τα επιλέξετε ενώ αφήνετε μόνη την τρέχουσα ημερομηνία:

[data-weekend]:not([data-today]) { --kalel-day-c: var(--kalel-weekend-c, hsl(0, 86%, 46%));
}

Α, και ας μην ξεχνάμε τους αριθμούς της εβδομάδας που προηγούνται του πρώτου αριθμού ραντεβού κάθε εβδομάδας. Χρησιμοποιήσαμε α data-weeknumber χαρακτηριστικό στη σήμανση για αυτό, αλλά οι αριθμοί δεν θα εμφανίζονται στην πραγματικότητα εκτός και αν τους αποκαλύψουμε με CSS, κάτι που μπορούμε να κάνουμε στο ::before ψευδοστοιχείο:

[data-weeknumber]::before { display: var(--kalel-weeknumber-d, inline-block); content: attr(data-weeknumber); position: absolute; inset-inline-start: 0; /* additional styles */
}

Τελειώσαμε τεχνικά σε αυτό το σημείο! Μπορούμε να αποδώσουμε ένα πλέγμα ημερολογίου που εμφανίζει τις ημερομηνίες για τον τρέχοντα μήνα, συμπληρωμένο με σκέψεις για τον εντοπισμό των δεδομένων ανά τοπική ρύθμιση και διασφαλίζοντας ότι το ημερολόγιο χρησιμοποιεί σωστή σημασιολογία. Και το μόνο που χρησιμοποιήσαμε ήταν βανίλια JavaScript και CSS!

Αλλά ας το πάρουμε αυτό ένα ακόμη βήμα...

Απόδοση ενός ολόκληρου έτους

Ίσως χρειαστεί να εμφανίσετε ένα πλήρες έτος ημερομηνιών! Επομένως, αντί να αποδώσετε τον τρέχοντα μήνα, ίσως θέλετε να εμφανίσετε όλα τα πλέγματα των μηνών για το τρέχον έτος.

Λοιπόν, το ωραίο με την προσέγγιση που χρησιμοποιούμε είναι ότι μπορούμε να καλέσουμε το render μεθοδεύσουμε όσες φορές θέλουμε και απλώς αλλάζουμε τον ακέραιο αριθμό που προσδιορίζει τον μήνα σε κάθε περίπτωση. Ας το ονομάσουμε 12 φορές με βάση το τρέχον έτος.

τόσο απλό όσο καλώντας το render-μέθοδος 12 φορές, και απλώς αλλάξτε τον ακέραιο για month - i:

[...Array(12).keys()].map(i => render( new Date(date.getFullYear(), i, date.getDate()), config.locale, date.getMonth() )
).join('')

Είναι πιθανώς καλή ιδέα να δημιουργήσετε ένα νέο γονικό περιτύλιγμα για το έτος απόδοσης. Κάθε πλέγμα ημερολογίου είναι ένα <kal-el> στοιχείο. Ας καλέσουμε το νέο γονικό περιτύλιγμα <jor-el>, Όπου Jor-El είναι το όνομα του πατέρα του Kal-El.

<jor-el id="app" data-year="true"> <kal-el data-firstday="7"> <!-- etc. --> </kal-el> <!-- other months -->
</jor-el>

Μπορούμε να χρησιμοποιήσουμε <jor-el> να δημιουργήσουμε ένα πλέγμα για τα πλέγματα μας. Meta λοιπόν!

jor-el { background: var(--jorel-bg, none); display: var(--jorel-d, grid); gap: var(--jorel-gap, 2.5rem); grid-template-columns: var(--jorel-gtc, repeat(auto-fill, minmax(320px, 1fr))); padding: var(--jorel-p, 0);
}

Τελικό demo

Μπόνους: Ημερολόγιο κομφετί

Διάβασα ένα εξαιρετικό βιβλίο που ονομάζεται Δημιουργία και Σπάσιμο του Πλέγματος τις προάλλες και έπεσα πάνω σε αυτή την όμορφη «Πρωτοχρονιάτικη αφίσα»:

πηγή: Making and Breaking the Grid (2η Έκδοση) του Timothy Samara

Σκέφτηκα ότι θα μπορούσαμε να κάνουμε κάτι παρόμοιο χωρίς να αλλάξουμε τίποτα στο HTML ή το JavaScript. Πήρα το θάρρος να συμπεριλάβω πλήρη ονόματα για μήνες και αριθμούς αντί για ονόματα ημερών, για να το κάνω πιο ευανάγνωστο. Απολαμβάνω!

spot_img

Τελευταία Νοημοσύνη

spot_img

Συνομιλία με μας

Γεια σου! Πώς μπορώ να σε βοηθήσω?