Как установить диапазон дат в календаре?

У меня есть календарь. Могли бы вы подсказать, как задать диапазон выделения при клике? Например, если я нажимаю на числа 7, 8, 9, 10, нужно, чтобы числа 8 и 9 выделялись серым цветом, тогда как 9 и 10 оставались черными.
  • 10 декабря 2024 г. 20:43
Ответы на вопрос 1
Чтобы установить диапазон дат в календаре, вам нужно отслеживать состояние выделенных дат и изменять стили в зависимости от кликов. Вот общая идея реализации такого функционала с использованием JavaScript и CSS:

### HTML
```html
<div id="calendar">
    <div class="day" data-date="2023-10-07">7</div>
    <div class="day" data-date="2023-10-08">8</div>
    <div class="day" data-date="2023-10-09">9</div>
    <div class="day" data-date="2023-10-10">10</div>
</div>
```

### CSS
```css
.day {
    display: inline-block;
    width: 30px;
    height: 30px;
    text-align: center;
    line-height: 30px;
    cursor: pointer;
}

.selected {
    background-color: gray;
}

.default {
    background-color: black;
    color: white;
}
```

### JavaScript
```javascript
const days = document.querySelectorAll('.day');
let selectedDay = null;

days.forEach(day => {
    day.addEventListener('click', () => {
        const currentDate = day.getAttribute('data-date');

        // Снятие выделения, если кликнули на уже выделенную дату
        if (selectedDay === currentDate) {
            resetSelection();
            selectedDay = null;
            return;
        }

        if (selectedDay === null) {
            // Первое выделение
            selectedDay = currentDate;
            day.classList.add('default');
        } else {
            // Выделение диапазона
            const startDate = new Date(selectedDay);
            const endDate = new Date(currentDate);
            const oneDay = 24 * 60 * 60 * 1000;

            if (startDate > endDate) {
                // Меняем порядок дат
                [startDate, endDate] = [endDate, startDate];
            }

            resetSelection();

            for (let d = startDate; d <= endDate; d.setDate(d.getDate() + 1)) {
                const formattedDate = d.toISOString().split('T')[0];
                const dayElement = document.querySelector(`.day[data-date="${formattedDate}"]`);
                if (dayElement) {
                    if (formattedDate !== startDate.toISOString().split('T')[0] && formattedDate !== endDate.toISOString().split('T')[0]) {
                        dayElement.classList.add('selected');
                    } else {
                        dayElement.classList.add('default');
                    }
                }
            }

            selectedDay = currentDate; // обновляем выделенный день
        }
    });
});

function resetSelection() {
    days.forEach(day => {
        day.classList.remove('selected', 'default');
    });
}
```

### Объяснение
1. **HTML**: Создаем календарь с днями, задавая каждому элементу атрибут `data-date` с соответствующей датой.
2. **CSS**: Создаем стили для выделения (серый фон) и для стандартного состояния (черный фон).
3. **JavaScript**:
   - Обрабатываем клики по дням.
   - Если кликнули на уже выделенный день, снимаем выделение.
   - Если кликнули на новый день, определяем диапазон от предыдущей выделенной даты до текущей.
   - Обновляем классы стилей для каждого дня в диапазоне.

Проверьте код, он должен корректно выделять диапазон дат согласно вашему описанию.
Похожие вопросы