Задать вопрос
@prokopn

Как сделать другого цвета выбранный диапазон в календаре?


Как сделать другого цвета выбранный диапазон в календаре? например: выбрали даты с 7 по 10. 7 и 10 остаются черного цвета, все, что между ними становится серым?
  • Вопрос задан
  • 113 просмотров
Подписаться 1 Средний 7 комментариев
Решения вопроса 1
@Eugene_Zhukov
Front
Если не хочешь использовать date-picker из какого-нибудь фрейма то как сделать свой:
ps. если очень не любишь ; то привыкай, сложно понять где что закончилось именно на хабре

let startDate = null;
let endDate = null;

// в updateInput добавь
for (let i = 0; i < monthDetails.length; i++) {
                    if (monthDetails[i].month === 0) {
                        if (monthDetails[i].date.toString() === cell_date) {
                            // для проверки рейнджа
                            if (!startDate || (startDate && endDate)) {
                                // На первый клик или новый рейндж
                                clearSelection();
                                startDate = monthDetails[i].timestamp;
                                cell.classList.add("isSelected");
                            } else {
                                // Второй клик
                                endDate = monthDetails[i].timestamp;
                                highlightRange();
                            }
                        }
                    }
                }

//хелперы
const clearSelection = () => {
    startDate = null;
    endDate = null;
    document.querySelectorAll(".cell_wrapper").forEach(cell => {
        cell.classList.remove("isSelected", "inRange");
    });
};

const highlightRange = () => {
    if (startDate > endDate) {
        [startDate, endDate] = [endDate, startDate];
    }

    document.querySelectorAll(".cell_wrapper").forEach(cell => {
        if (cell.classList.contains("current")) {
            const cellDate = new Date(year, month, parseInt(cell.textContent)).getTime();
            
            if (cellDate === startDate || cellDate === endDate) {
                cell.classList.add("isSelected");
            } else if (cellDate > startDate && cellDate < endDate) {
                cell.classList.add("inRange");
            }
        }
    });
};

у меня работает, большая часть логики отсюда vueDatePicker , как-то раз очень пригодилось
.cell_wrapper.inRange {
    background-color: #f0f0f0;
    color: #272727;
}

.cell_wrapper.current.inRange {
    background-color: #e0e0e0;
    border-radius: 0;
}

.cell_wrapper.isSelected {
    border-radius: 50%;
    background-color: #272727;
    color: #fff;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@garbagecollected
675a26843d5ae677134831.png

Вот, это работает:

/* #000 - это черные выделеные дни */
.cell_wrapper.cal_date.current.isSelected:not(:is(.isSelected ~ &)) {
  color: #fff;
  background: #000;
}
/* #888888 - это серые выделеные дни  */
.cell_wrapper.cal_date.current.isSelected ~ .isSelected{
  color: #fff;
  background: #888888;
}

/* #000 - это черные выделеные дни  */
.cell_wrapper.cal_date.current.isSelected:not(:has( ~ .isSelected)) {
  color: #fff;
  background: #000;
}


Но сам скрипт календаря - кривой!


Должно быть очевидно хотя бы из-за того, что декабрь 2024 начинается с воскресения. =)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы