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

Angular中通过TypeScript操作CSS实现日历指定日期范围高亮

Angular日历高亮指定日期范围的实现方案

步骤1:在组件中定义高亮范围并标记日期状态

首先在CalendarComponent中添加要高亮的日期范围,并在生成日历日期项时,为每个日期添加是否在范围内的标记:

export class CalendarComponent implements OnInit {
  week: any = ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"];

  monthSelect: any[] | undefined;
  dateSelect: any;
  title: string | undefined;
  // 定义需要高亮的日期范围
  highlightStart = moment('2023-01-09');
  highlightEnd = moment('2023-05-23');
  highlightRange = moment.range(this.highlightStart, this.highlightEnd);

  constructor() {}

  ngOnInit(): void {
    this.getDaysFromDate(1, 2023);
  }

  getDaysFromDate(month: number, year: number) {
    const startDate = moment(`${year}/${month}/01`);
    const endDate = startDate.clone().endOf('month');
    this.dateSelect = startDate;
    const diffDays = endDate.diff(startDate, 'days', true);
    const numberDays = Math.round(diffDays);
    this.monthSelect = Object.keys([...Array(numberDays)]).map((a: any) => {
      a = parseInt(a) + 1;
      const dayObject = moment(`${year}-${month}-${a}`);
      return {
        name: dayObject.format("dddd"),
        value: a,
        indexWeek: dayObject.isoWeekday(),
        // 标记当前日期是否在高亮范围内
        isInRange: this.highlightRange.contains(dayObject)
      };
    });
  }

  changeMonth(flag: number) {
    if (flag < 0) {
      const prevDate = this.dateSelect.clone().subtract(1, "month");
      this.getDaysFromDate(prevDate.format("MM"), prevDate.format("YYYY"));
    } else {
      const nextDate = this.dateSelect.clone().add(1, "month");
      this.getDaysFromDate(nextDate.format("MM"), nextDate.format("YYYY"));
    }
  }
}

步骤2:在HTML中通过类绑定实现高亮

修改日历日期的渲染元素,使用Angular的[class.类名]语法,根据isInRange状态动态添加background类:

<div class="wrapper-calendar">
  <div class="header-calendar">
    <div>
      <button (click)="changeMonth(-1)" class="btn-prev"><img src="back.png" alt="back"></button>
    </div>
    <h1>{{dateSelect | date:'MMMM yyyy'}}</h1>
    <div>
      <button (click)="changeMonth(1)" class="btn-next"><img src="forward.png" alt="forward"></button>
    </div>
  </div>
  <ol>
    <li *ngFor="let day of week" class="day-name">{{day | slice:0:3}}</li>

    <li [style.gridColumnStart]="first ? day?.indexWeek : 'auto'"
        *ngFor="let day of monthSelect; let first = first"
        [class.background]="day.isInRange">
      <span> {{day?.value}}</span>
    </li>
  </ol>
</div>

步骤3:添加高亮样式

在组件的CSS文件中定义background类的样式,自定义高亮效果:

.background {
  background-color: #cce7ff; /* 自定义背景色 */
  border-radius: 50%; /* 可选,圆形高亮 */
  color: #1976d2; /* 自定义文字颜色 */
}

替代方案:使用方法动态判断

如果不想在生成日期时提前标记,也可以写一个方法实时判断日期是否在范围内:

在TS中添加方法:

isDateInHighlightRange(day: any): boolean {
  const currentDate = moment(`${this.dateSelect.year()}-${this.dateSelect.month()+1}-${day.value}`);
  return this.highlightRange.contains(currentDate);
}

然后HTML中调用方法:

<li [style.gridColumnStart]="first ? day?.indexWeek : 'auto'"
    *ngFor="let day of monthSelect; let first = first"
    [class.background]="isDateInHighlightRange(day)">
  <span> {{day?.value}}</span>
</li>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:30:41