Snippets Date Picker – Bootstrap 5

🏷️ Extraits & Composants HTML 📅 03/04/2026 08:00:00 👤 Mezgani said
Bootstrap 5 Date Picker Flatpickr Input Date Snippets Html

Exemples de Date Picker natif HTML5 et Date Picker avancé avec Flatpickr, intégrés en Bootstrap 5.

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8" />
    <meta name="copyright" content="MEZGANI Said" />
    <meta name="author" content="AngularForAll" />
    <meta name="robots" content="noindex, nofollow" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Snippets Date Picker Input 01 | AngularForAll</title>
<!-- Bootstrap 5 CSS -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
    <!-- Bootstrap Icons -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
    <!-- Google Fonts -->
    <link href="https://fonts.googleapis.com/css2?family=Inter:opsz,wght@14..32,300;14..32,400;14..32,500;14..32,600;14..32,700;14..32,800&display=swap" rel="stylesheet">
    <!-- Flatpickr - Date Picker Personnalisé -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
    <script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
    <script src="https://cdn.jsdelivr.net/npm/flatpickr/dist/l10n/fr.js"></script>
    
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            font-family: 'Inter', sans-serif;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            min-height: 100vh;
            padding: 2rem;
        }

        .container-custom {
            max-width: 1400px;
            margin: 0 auto;
        }

        /* Header */
        .header {
            text-align: center;
            color: white;
            margin-bottom: 2rem;
            animation: fadeInDown 0.8s ease;
        }

        .header h1 {
            font-size: 2.5rem;
            font-weight: 800;
            margin-bottom: 0.5rem;
        }

        .header p {
            font-size: 1.1rem;
            opacity: 0.95;
        }

        @keyframes fadeInDown {
            from {
                opacity: 0;
                transform: translateY(-30px);
            }
            to {
                opacity: 1;
                transform: translateY(0);
            }
        }

        /* Cards */
        .card-custom {
            background: white;
            border-radius: 20px;
            border: none;
            box-shadow: 0 10px 30px rgba(0,0,0,0.1);
            transition: all 0.3s ease;
            margin-bottom: 1.5rem;
            overflow: hidden;
            animation: fadeInUp 0.6s ease;
        }

        .card-custom:hover {
            transform: translateY(-5px);
            box-shadow: 0 15px 40px rgba(0,0,0,0.15);
        }

        @keyframes fadeInUp {
            from {
                opacity: 0;
                transform: translateY(30px);
            }
            to {
                opacity: 1;
                transform: translateY(0);
            }
        }

        .card-header-custom {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            padding: 1.2rem 1.5rem;
            font-weight: 700;
            font-size: 1.2rem;
        }

        .card-body-custom {
            padding: 1.5rem;
        }

        /* Date picker styles */
        .date-group {
            margin-bottom: 1.5rem;
        }

        .date-group label {
            font-weight: 600;
            margin-bottom: 0.5rem;
            color: #333;
            display: block;
        }

        .date-group label i {
            margin-right: 0.5rem;
            color: #667eea;
        }

        /* Custom input styles */
        input[type="date"] {
            padding: 0.6rem 1rem;
            border: 2px solid #e0e0e0;
            border-radius: 12px;
            transition: all 0.3s;
            font-family: 'Inter', sans-serif;
        }

        input[type="date"]:focus {
            border-color: #667eea;
            outline: none;
            box-shadow: 0 0 0 3px rgba(102,126,234,0.1);
        }

        /* Flatpickr customization */
        .flatpickr-input {
            background-color: white;
            border: 2px solid #e0e0e0;
            border-radius: 12px;
            padding: 0.6rem 1rem;
            font-family: 'Inter', sans-serif;
            transition: all 0.3s;
        }

        .flatpickr-input:focus {
            border-color: #667eea;
            outline: none;
            box-shadow: 0 0 0 3px rgba(102,126,234,0.1);
        }

        /* Badge styles */
        .badge-example {
            background: #f0f0f0;
            color: #667eea;
            padding: 0.3rem 0.8rem;
            border-radius: 20px;
            font-size: 0.7rem;
            font-weight: 600;
            margin-left: 0.5rem;
        }

        /* Code block */
        .code-block {
            background: #f8f9fa;
            border-radius: 12px;
            padding: 1rem;
            margin-top: 1rem;
            font-size: 0.85rem;
            border-left: 4px solid #667eea;
        }

        .code-block pre {
            margin: 0;
            font-family: 'Courier New', monospace;
            color: #2c3e50;
        }

        /* Résultat d'affichage */
        .result-display {
            background: #f8f9fa;
            border-radius: 12px;
            padding: 1rem;
            margin-top: 1rem;
            text-align: center;
            font-size: 0.9rem;
        }

        /* Calendar icon */
        .calendar-icon {
            position: relative;
        }

        .calendar-icon input {
            padding-right: 2.5rem;
        }

        .calendar-icon i {
            position: absolute;
            right: 12px;
            top: 50%;
            transform: translateY(-50%);
            color: #95a5a6;
            pointer-events: none;
        }

        /* Responsive */
        @media (max-width: 768px) {
            body {
                padding: 1rem;
            }
            
            .header h1 {
                font-size: 1.8rem;
            }
            
            .card-body-custom {
                padding: 1rem;
            }
        }

        /* Scrollbar */
        ::-webkit-scrollbar {
            width: 8px;
        }

        ::-webkit-scrollbar-track {
            background: #f1f1f1;
        }

        ::-webkit-scrollbar-thumb {
            background: #888;
            border-radius: 4px;
        }

        ::-webkit-scrollbar-thumb:hover {
            background: #555;
        }
    </style>
</head>
<body>
    <div class="container-custom">
        <!-- Header -->
        <div class="header">
            <h1>
                <i class="bi bi-calendar-date"></i> 
                Date Pickers
            </h1>
            <p>Exemples de date picker natif HTML5 et date picker personnalisé avec Flatpickr</p>
        </div>

        <div class="row">
            <!-- SECTION 1: Date Picker Natif HTML5 -->
            <div class="col-lg-6">
                <div class="card-custom">
                    <div class="card-header-custom">
                        <i class="bi bi-browser-chrome"></i> 
                        Date Picker Natif HTML5
                        <span class="badge-example">Natif</span>
                    </div>
                    <div class="card-body-custom">
                        <div class="date-group">
                            <label>
                                <i class="bi bi-calendar"></i> 
                                Date simple
                            </label>
                            <input type="date" id="nativeDate" class="form-control">
                            <small class="text-muted">Format: YYYY-MM-DD</small>
                        </div>

                        <div class="date-group">
                            <label>
                                <i class="bi bi-clock"></i> 
                                Date et Heure (datetime-local)
                            </label>
                            <input type="datetime-local" id="nativeDateTime" class="form-control">
                            <small class="text-muted">Format: YYYY-MM-DDThh:mm</small>
                        </div>

                        <div class="date-group">
                            <label>
                                <i class="bi bi-calendar-week"></i> 
                                Semaine (week)
                            </label>
                            <input type="week" id="nativeWeek" class="form-control">
                            <small class="text-muted">Format: YYYY-Www</small>
                        </div>

                        <div class="date-group">
                            <label>
                                <i class="bi bi-calendar-month"></i> 
                                Mois (month)
                            </label>
                            <input type="month" id="nativeMonth" class="form-control">
                            <small class="text-muted">Format: YYYY-MM</small>
                        </div>

                        <div class="date-group">
                            <label>
                                <i class="bi bi-clock-history"></i> 
                                Heure (time)
                            </label>
                            <input type="time" id="nativeTime" class="form-control">
                            <small class="text-muted">Format: hh:mm</small>
                        </div>

                        <div class="result-display" id="nativeResult">
                            <i class="bi bi-info-circle"></i> 
                            Sélectionnez une date pour voir le résultat
                        </div>
                    </div>
                </div>

                <div class="card-custom">
                    <div class="card-header-custom">
                        <i class="bi bi-sliders2"></i> 
                        Attributs Spéciaux
                        <span class="badge-example">Contrôles</span>
                    </div>
                    <div class="card-body-custom">
                        <div class="date-group">
                            <label>
                                <i class="bi bi-calendar-minus"></i> 
                                Date min et max
                            </label>
                            <input type="date" id="dateMinMax" class="form-control" 
                                   min="2024-01-01" max="2024-12-31">
                            <small class="text-muted">Plage: 1 Jan 2024 - 31 Déc 2024</small>
                        </div>

                        <div class="date-group">
                            <label>
                                <i class="bi bi-calendar-plus"></i> 
                                Date avec valeur par défaut
                            </label>
                            <input type="date" id="dateDefault" class="form-control" value="2024-06-15">
                            <small class="text-muted">Valeur par défaut: 15 Juin 2024</small>
                        </div>

                        <div class="date-group">
                            <label>
                                <i class="bi bi-ban"></i> 
                                Date désactivée (readonly)
                            </label>
                            <input type="date" id="dateReadonly" class="form-control" 
                                   value="2024-01-01" readonly>
                            <small class="text-muted">Lecture seule - non modifiable</small>
                        </div>

                        <div class="date-group">
                            <label>
                                <i class="bi bi-exclamation-triangle"></i> 
                                Champ requis (required)
                            </label>
                            <input type="date" id="dateRequired" class="form-control" required>
                            <small class="text-muted">Champ obligatoire (validation HTML5)</small>
                        </div>
                    </div>
                </div>
            </div>

            <!-- SECTION 2: Date Picker Personnalisé (Flatpickr) -->
            <div class="col-lg-6">
                <div class="card-custom">
                    <div class="card-header-custom">
                        <i class="bi bi-stars"></i> 
                        Date Picker Personnalisé (Flatpickr)
                        <span class="badge-example">Avancé</span>
                    </div>
                    <div class="card-body-custom">
                        <div class="date-group">
                            <label>
                                <i class="bi bi-calendar"></i> 
                                Date simple avec Flatpickr
                            </label>
                            <input type="text" id="flatpickrDate" class="form-control" placeholder="Sélectionnez une date">
                            <small class="text-muted">Interface moderne et personnalisable</small>
                        </div>

                        <div class="date-group">
                            <label>
                                <i class="bi bi-calendar-range"></i> 
                                Plage de dates
                            </label>
                            <input type="text" id="flatpickrRange" class="form-control" placeholder="Sélectionnez une plage">
                            <small class="text-muted">Sélectionnez plusieurs dates</small>
                        </div>

                        <div class="date-group">
                            <label>
                                <i class="bi bi-clock"></i> 
                                Date et Heure
                            </label>
                            <input type="text" id="flatpickrDateTime" class="form-control" placeholder="Date et heure">
                            <small class="text-muted">Avec sélection de l'heure</small>
                        </div>

                        <div class="date-group">
                            <label>
                                <i class="bi bi-calendar-week"></i> 
                                Sélection par semaine
                            </label>
                            <input type="text" id="flatpickrWeek" class="form-control" placeholder="Sélectionnez une semaine">
                            <small class="text-muted">Sélectionnez une semaine entière</small>
                        </div>

                        <div class="date-group">
                            <label>
                                <i class="bi bi-calendar-month"></i> 
                                Sélection par mois
                            </label>
                            <input type="text" id="flatpickrMonth" class="form-control" placeholder="Sélectionnez un mois">
                            <small class="text-muted">Sélectionnez un mois spécifique</small>
                        </div>

                        <div class="result-display" id="customResult">
                            <i class="bi bi-info-circle"></i> 
                            Sélectionnez une date pour voir le résultat
                        </div>
                    </div>
                </div>

                <div class="card-custom">
                    <div class="card-header-custom">
                        <i class="bi bi-gear"></i> 
                        Options Avancées Flatpickr
                        <span class="badge-example">Configuration</span>
                    </div>
                    <div class="card-body-custom">
                        <div class="date-group">
                            <label>
                                <i class="bi bi-calendar-x"></i> 
                                Dates désactivées
                            </label>
                            <input type="text" id="flatpickrDisabled" class="form-control" placeholder="Dates désactivées">
                            <small class="text-muted">Weekends et jours fériés désactivés</small>
                        </div>

                        <div class="date-group">
                            <label>
                                <i class="bi bi-calendar-check"></i> 
                                Dates disponibles uniquement
                            </label>
                            <input type="text" id="flatpickrEnabled" class="form-control" placeholder="Dates disponibles">
                            <small class="text-muted">Seulement certains jours disponibles</small>
                        </div>

                        <div class="date-group">
                            <label>
                                <i class="bi bi-calculator"></i> 
                                Calcul d'âge
                            </label>
                            <input type="text" id="flatpickrAge" class="form-control" placeholder="Date de naissance">
                            <small class="text-muted">Calcule automatiquement l'âge</small>
                        </div>

                        <div class="date-group">
                            <label>
                                <i class="bi bi-globe"></i> 
                                Format personnalisé
                            </label>
                            <input type="text" id="flatpickrFormat" class="form-control" placeholder="Format français">
                            <small class="text-muted">Format: DD/MM/YYYY</small>
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <!-- SECTION 3: Comparaison et Utilisation -->
        <div class="row">
            <div class="col-12">
                <div class="card-custom">
                    <div class="card-header-custom">
                        <i class="bi bi-code-square"></i> 
                        Code Source et Utilisation
                    </div>
                    <div class="card-body-custom">
                        <ul class="nav nav-tabs mb-3" id="codeTabs" role="tablist">
                            <li class="nav-item" role="presentation">
                                <button class="nav-link active" data-bs-toggle="tab" data-bs-target="#nativeCode" type="button">
                                    <i class="bi bi-browser-chrome"></i> Date Picker Natif
                                </button>
                            </li>
                            <li class="nav-item" role="presentation">
                                <button class="nav-link" data-bs-toggle="tab" data-bs-target="#flatpickrCode" type="button">
                                    <i class="bi bi-stars"></i> Flatpickr
                                </button>
                            </li>
                        </ul>
                        <div class="tab-content">
                            <div class="tab-pane fade show active" id="nativeCode">
                                <div class="code-block">
                                    <pre><code>&lt;!-- Date simple --&gt;
&lt;input type="date" id="nativeDate" class="form-control"&gt;

&lt;!-- Date et heure --&gt;
&lt;input type="datetime-local" id="nativeDateTime" class="form-control"&gt;

&lt;!-- Semaine --&gt;
&lt;input type="week" id="nativeWeek" class="form-control"&gt;

&lt;!-- Mois --&gt;
&lt;input type="month" id="nativeMonth" class="form-control"&gt;

&lt;!-- Heure --&gt;
&lt;input type="time" id="nativeTime" class="form-control"&gt;

&lt;!-- Avec min/max --&gt;
&lt;input type="date" min="2024-01-01" max="2024-12-31"&gt;

&lt;!-- Avec valeur par défaut --&gt;
&lt;input type="date" value="2024-06-15"&gt;</code></pre>
                                </div>
                            </div>
                            <div class="tab-pane fade" id="flatpickrCode">
                                <div class="code-block">
                                    <pre><code>// Initialisation simple
flatpickr("#flatpickrDate", {
    dateFormat: "Y-m-d",
    locale: "fr"
});

// Plage de dates
flatpickr("#flatpickrRange", {
    mode: "range",
    dateFormat: "Y-m-d",
    locale: "fr"
});

// Date et heure
flatpickr("#flatpickrDateTime", {
    enableTime: true,
    dateFormat: "Y-m-d H:i",
    locale: "fr"
});

// Format personnalisé
flatpickr("#flatpickrFormat", {
    dateFormat: "d/m/Y",
    locale: "fr"
});

// Dates désactivées
flatpickr("#flatpickrDisabled", {
    disable: [
        function(date) {
            return date.getDay() === 0 || date.getDay() === 6;
        }
    ],
    locale: "fr"
});</code></pre>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <!-- Bootstrap JS -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
    
    <script>
        // Initialisation des date pickers natifs
        const nativeDate = document.getElementById('nativeDate');
        const nativeDateTime = document.getElementById('nativeDateTime');
        const nativeWeek = document.getElementById('nativeWeek');
        const nativeMonth = document.getElementById('nativeMonth');
        const nativeTime = document.getElementById('nativeTime');
        const nativeResult = document.getElementById('nativeResult');

        function updateNativeResult() {
            const date = nativeDate.value;
            const datetime = nativeDateTime.value;
            const week = nativeWeek.value;
            const month = nativeMonth.value;
            const time = nativeTime.value;
            
            nativeResult.innerHTML = `
                <i class="bi bi-calendar-check"></i> 
                <strong>Valeurs sélectionnées :</strong><br>
                📅 Date: ${date || 'Non sélectionnée'}<br>
                📅📅 Date-Heure: ${datetime || 'Non sélectionnée'}<br>
                📆 Semaine: ${week || 'Non sélectionnée'}<br>
                📆 Mois: ${month || 'Non sélectionné'}<br>
                ⏰ Heure: ${time || 'Non sélectionnée'}
            `;
        }

        nativeDate.addEventListener('change', updateNativeResult);
        nativeDateTime.addEventListener('change', updateNativeResult);
        nativeWeek.addEventListener('change', updateNativeResult);
        nativeMonth.addEventListener('change', updateNativeResult);
        nativeTime.addEventListener('change', updateNativeResult);

        // Initialisation des Flatpickr
        // Date simple
        flatpickr("#flatpickrDate", {
            dateFormat: "Y-m-d",
            locale: "fr",
            onChange: updateFlatpickrResult
        });

        // Plage de dates
        flatpickr("#flatpickrRange", {
            mode: "range",
            dateFormat: "Y-m-d",
            locale: "fr",
            onChange: updateFlatpickrResult
        });

        // Date et heure
        flatpickr("#flatpickrDateTime", {
            enableTime: true,
            dateFormat: "Y-m-d H:i",
            locale: "fr",
            onChange: updateFlatpickrResult
        });

        // Sélection par semaine
        flatpickr("#flatpickrWeek", {
            weekNumbers: true,
            dateFormat: "Y-m-d",
            locale: "fr",
            onChange: function(selectedDates) {
                if (selectedDates.length > 0) {
                    const date = selectedDates[0];
                    const weekNumber = getWeekNumber(date);
                    document.getElementById('customResult').innerHTML = `
                        <i class="bi bi-calendar-week"></i> 
                        Semaine ${weekNumber} de l'année ${date.getFullYear()}
                    `;
                }
            }
        });

        // Sélection par mois
        flatpickr("#flatpickrMonth", {
            plugins: [new monthSelectPlugin({
                shorthand: true,
                dateFormat: "Y-m",
                altFormat: "F Y"
            })],
            dateFormat: "Y-m",
            locale: "fr",
            onChange: updateFlatpickrResult
        });

        // Dates désactivées (weekends)
        flatpickr("#flatpickrDisabled", {
            disable: [
                function(date) {
                    // Désactive les weekends
                    return date.getDay() === 0 || date.getDay() === 6;
                }
            ],
            locale: "fr",
            onChange: updateFlatpickrResult
        });

        // Dates disponibles uniquement
        flatpickr("#flatpickrEnabled", {
            enable: [
                "2024-01-15",
                "2024-01-20",
                "2024-01-25",
                "2024-01-30"
            ],
            locale: "fr",
            onChange: updateFlatpickrResult
        });

        // Calcul d'âge
        flatpickr("#flatpickrAge", {
            maxDate: "today",
            dateFormat: "Y-m-d",
            locale: "fr",
            onChange: function(selectedDates) {
                if (selectedDates.length > 0) {
                    const birthDate = selectedDates[0];
                    const age = calculateAge(birthDate);
                    document.getElementById('customResult').innerHTML = `
                        <i class="bi bi-calculator"></i> 
                        Âge: ${age} ans (né(e) le ${birthDate.toLocaleDateString('fr-FR')})
                    `;
                }
            }
        });

        // Format personnalisé
        flatpickr("#flatpickrFormat", {
            dateFormat: "d/m/Y",
            locale: "fr",
            onChange: updateFlatpickrResult
        });

        function updateFlatpickrResult(selectedDates) {
            const resultDiv = document.getElementById('customResult');
            if (selectedDates.length === 0) {
                resultDiv.innerHTML = `<i class="bi bi-info-circle"></i> Sélectionnez une date pour voir le résultat`;
                return;
            }
            
            if (selectedDates.length === 1) {
                const date = selectedDates[0];
                resultDiv.innerHTML = `
                    <i class="bi bi-calendar-check"></i> 
                    Date sélectionnée: <strong>${date.toLocaleDateString('fr-FR', {
                        weekday: 'long',
                        year: 'numeric',
                        month: 'long',
                        day: 'numeric'
                    })}</strong>
                `;
            } else if (selectedDates.length === 2) {
                const start = selectedDates[0];
                const end = selectedDates[1];
                const diffDays = Math.ceil((end - start) / (1000 * 60 * 60 * 24));
                resultDiv.innerHTML = `
                    <i class="bi bi-calendar-range"></i> 
                    Du <strong>${start.toLocaleDateString('fr-FR')}</strong> au <strong>${end.toLocaleDateString('fr-FR')}</strong><br>
                    Durée: <strong>${diffDays} jours</strong>
                `;
            }
        }

        // Fonctions utilitaires
        function getWeekNumber(date) {
            const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
            const dayNum = d.getUTCDay() || 7;
            d.setUTCDate(d.getUTCDate() + 4 - dayNum);
            const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
            return Math.ceil((((d - yearStart) / 86400000) + 1) / 7);
        }

        function calculateAge(birthDate) {
            const today = new Date();
            let age = today.getFullYear() - birthDate.getFullYear();
            const m = today.getMonth() - birthDate.getMonth();
            if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
                age--;
            }
            return age;
        }

        // Plugin monthSelect pour Flatpickr (simplifié)
        function monthSelectPlugin(pluginConfig) {
            return function(fp) {
                return {
                    onReady() {
                        // Configuration simplifiée pour la sélection par mois
                        fp.config.dateFormat = pluginConfig.dateFormat || "Y-m";
                        fp.config.altFormat = pluginConfig.altFormat || "F Y";
                    }
                };
            };
        }

        // Initialiser les résultats par défaut
        updateNativeResult();
    </script>
</body>
</html>

Ouvrir cet aperçu dans un nouvel onglet du navigateur

🔗 Ouvrir dans le navigateur