You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js 13.5.3中Tailwind样式被未知样式覆盖致日历标记异常

日历事件日期样式不生效问题

我正在开发一款可标记指定事件日期的日历应用,事件日期的标记颜色根据事件类型而定,使用的是Next.js 13.5.3版本。样式规则和事件日期、类型信息都定义在data.ts文件中,文件内容如下:

import { EventType, IEvent, TEventTypeStyles } from "./types";

export const eventsData: { date: string; type: EventType }[] = [
  { date: "2023-09-12", type: "Abs" },
  { date: "2023-09-20", type: "Ejc" },
  { date: "2023-01-11", type: "Rty" },
];

export const events: IEvent[] = eventsData.map((eventData) => ({
  ...eventData,
  date: new Date(eventData.date),
}));

export const eventTypeStyles: TEventTypeStyles = {
  Ejc: {
    borderColor: "border-orange-600",
    hoverBorderColor: "hover:border-orange-300",
  },
  Abs: {
    borderColor: "border-green-600",
    hoverBorderColor: "hover:border-green-300",
  },
  Rty: {
    borderColor: "border-red-600",
    hoverBorderColor: "hover:border-red-300",
  },
};

客户端组件Calendar.tsx的代码如下:

"use client";

import { CalendarProps } from "@/types";
import React, { useState } from "react";
import { isSameDay } from "@/lib/isSameDay";
import { eventTypeStyles, events } from "@/data";

export default function Calendar({ currentDate }: CalendarProps) {
  // console.log("event", eventTypeStyles);
  const [currentDateState, setCurrentDateState] = useState(currentDate);
  const today = new Date();

  const specialEvents = events;

  const daysInMonth = new Date(
    currentDateState.getFullYear(),
    currentDateState.getMonth() + 1,
    0
  ).getDate();

  const firstDay = new Date(
    currentDateState.getFullYear(),
    currentDateState.getMonth(),
    1
  ).getDay();

  const weeks = [];
  let currentWeek = [];
  for (let i = 0; i < firstDay; i++) {
    currentWeek.push(null);
  }
  for (let day = 1; day <= daysInMonth; day++) {
    if (currentWeek.length === 7) {
      weeks.push(currentWeek);
      currentWeek = [];
    }
    currentWeek.push(day);
  }
  if (currentWeek.length > 0) {
    while (currentWeek.length < 7) {
      currentWeek.push(null);
    }
    weeks.push(currentWeek);
  }

  const prevMonth = () => {
    const previousMonthDate = new Date(
      currentDateState.getFullYear(),
      currentDateState.getMonth() - 1,
      1
    );
    setCurrentDateState(previousMonthDate);
  };

  const nextMonth = () => {
    const nextMonthDate = new Date(
      currentDateState.getFullYear(),
      currentDateState.getMonth() + 1,
      1
    );
    setCurrentDateState(nextMonthDate);
  };

  return (
    <div>
      <div className="flex justify-between mb-2">
        <button onClick={prevMonth}>Previous</button>
        <h1 className="text-xl font-semibold">
          {currentDateState.toLocaleDateString("en-US", {
            month: "long",
            year: "numeric",
          })}
        </h1>
        <button onClick={nextMonth}>Next</button>
      </div>
      <table className="table-auto">
        <thead>
          <tr>
            {["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"].map((day) => (
              <th key={day} className="text-center p-2">
                {day}
              </th>
            ))}
          </tr>
        </thead>
        <tbody>
          {weeks.map((week, weekIndex) => (
            <tr key={weekIndex}>
              {week.map((day, dayIndex) => {
                // Ensure 'day' is a number and not null
                if (typeof day !== "number") {
                  return <td key={dayIndex} className={`text-center p-2`}></td>;
                }

                const todayDate = new Date(
                  currentDateState.getFullYear(),
                  currentDateState.getMonth(),
                  day
                );

                const specialEvent = specialEvents.find((event) =>
                  isSameDay(event.date, todayDate)
                );

                const isSpecialEventDate = !!specialEvent;

                const isToday =
                  todayDate.getDate() === today.getDate() &&
                  todayDate.getMonth() === today.getMonth() &&
                  todayDate.getFullYear() === today.getFullYear();

                return (
                  <td
                    key={dayIndex}
                    className={`text-center p-2 ${
                      isSpecialEventDate
                        ? `border-b-4 ${
                            eventTypeStyles[specialEvent.type].borderColor
                          } ${
                            eventTypeStyles[specialEvent.type].hoverBorderColor
                          }`
                        : isToday
                        ? "bg-yellow-300"
                        : "hover:bg-gray-200"
                    }`}
                  >
                    {day}
                  </td>
                );
              })}
            </tr>
          ))}
        </tbody>
      </table>
    </div>
  );
}

日历元素截图

目前遇到的问题是:事件日期没有按照设定的颜色标记,而是显示灰色。通过Chrome开发者工具查看发现,自定义样式已经被应用,但被一段未知来源的全局样式覆盖,这段样式代码是:

*, ::before, ::after {
    box-sizing: border-box;
    border-width: 0;
    border-style: solid;
    border-color: #e5e7eb;
}

我并没有添加过任何全局CSS。

内容的提问来源于stack exchange,提问作者Fahad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 23:32:03