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

如何用jQuery根据事件数量调整FullCalendar周视图列宽

FullCalendar 事件重叠问题:按事件数量调整日期列宽解决方案

问题背景

搭建的FullCalendar包含month、twoWeek、agendaDay视图,当某一天同一时段存在多个事件时,事件重叠导致标题和时间无法看清(如6/13周二列)。尝试设置以下参数未解决问题:

overlap: false,
eventOverlap: false,
slotEventOverlap: false,

解决方案:通过jQuery动态调整列宽

核心思路是在视图渲染完成后,统计每列的事件数量,按比例调整对应日期列的宽度,同时适配事件元素宽度,避免重叠拥挤。

修改后的JavaScript代码

var data = [
    {
        title: '全天事件',
        start: '2023-06-01',
        allDay: false
    },
    {
        title:"7000048",
        start:"2023-06-01T21:15:00",
        end:"2023-06-03T02:15:00",
        allDay: false
    },
    {
        title: '长时事件',
        start: '2023-06-07',
        end: '2023-06-07',
        allDay: false
    },
    {
        id: 999,
        title: '重复事件',
        start: '2023-06-09T16:00:00',
        allDay: false
    },
    {
        id: 999,
        title: '重复事件',
        start: '2023-06-16T16:00:00',
        allDay: false
    },
    {
        title: '会议',
        start: '2023-06-11',
        end: '2023-06-11',
        allDay: false
    },
    {
        title: '团队会议',
        start: '2023-06-12T10:30:00',
        end: '2023-06-12T12:30:00',
        allDay: false
    },
    {
        title: '午餐',
        start: '2023-06-12T12:00:00',
        allDay: false
    },
    {
        title: '项目讨论',
        start: '2023-06-12T14:30:00',
        allDay: false
    },
    {
        title: '欢乐时光',
        start: '2023-06-12T17:30:00',
        allDay: false
    },
    {
        title: '晚餐',
        start: '2023-06-12T20:00:00',
        allDay: false
    },
    {
        title: '生日派对',
        start: '2023-06-13T10:30:00',
        end: '2023-06-13T21:30:00',
        allDay: false,
        description: '生日聚会'
    },
    {
        title: '测试事件1',
        start: '2023-06-13T10:30:00',
        end: '2023-06-13T21:30:00',
        allDay: false,
        textColor: 'Yellow',
        borderColor: 'green',
        description: '测试事件'
    },
    {
        title: '测试事件1',
        start: '2023-06-13T10:30:00',
        end: '2023-06-13T21:30:00',
        allDay: false,
        textColor: 'Yellow',
        borderColor: 'green',
        description: '测试事件'
    },
    {
        title: '测试事件1',
        start: '2023-06-13T10:30:00',
        end: '2023-06-13T21:30:00',
        allDay: false,
        textColor: 'Yellow',
        borderColor: 'green',
        description: '测试事件'
    },
    {
        title: '测试事件1',
        start: '2023-06-13T10:30:00',
        end: '2023-06-13T21:30:00',
        allDay: false,
        textColor: 'Yellow',
        borderColor: 'green',
        description: '测试事件'
    },
    {
        title: '测试事件1',
        start: '2023-06-13T10:30:00',
        end: '2023-06-13T21:30:00',
        allDay: false,
        textColor: 'Yellow',
        borderColor: 'green',
        description: '测试事件'
    },
    {
        title: '测试时间',
        start: '2023-06-13T10:30:00',
        end: '2023-06-13T20:30:00',
        allDay: false,
        backgroundColor : 'Yellow',
        textColor: 'red',
        borderColor: 'green',
        description: '测试事件2'
    },
    {
        title: '测试时间4',
        start: '2023-06-13T11:30:00',
        end: '2023-06-13T23:30:00',
        allDay: false,
        backgroundColor : 'orange',
        textColor: 'red',
        borderColor: 'green',
        description: '测试事件3'
    },
    {
        title: '点击跳转',
        url: 'https://google.com/',
        start: '2023-06-28',
        allDay: false
    }
];

$(document).ready(function() {
  var date = new Date();
  var d = date.getDate();
  var m = date.getMonth();
  var y = date.getFullYear();

  $('#calendar').fullCalendar({
    timeZone: 'ET',
    defaultView: 'twoWeek',
    aspectRatio: 1.5,
    header: {
      left: 'prev,next today',
      center: 'title',
      right: 'month, twoWeek, agendaDay'
    },
    defaultDate: '2023-06-16',
    editable: false,
    eventResourceEditable: true,
    dayMaxEvents: true,
    eventLimit: true,
    allDaySlot: false,
    slotMinutes: 120,
    slotDuration: '02:00',
    timeFormat: '',
    contentHeight: 'auto',
    axisFormat: 'h(:mm)tt',
    columnFormat: "dddd \n M/D",
    events: data,
    eventMouseover: function(calEvent, jsEvent) {
      var popup = '<div class="tooltipevent" style="width:200px;height:auto;background:#F0F0F0;color: green;position:absolute;padding:15px;font-size:12px;z-index:10001;border:1px groove red; font-family: Verdana,Arial,sans-serif" >标题: ' +
        calEvent.title + '<br>描述: ' +
        (calEvent.description || '无') + '<br>开始时间: ' +
        calEvent.start.format('YYYY-MM-DD HH:mm') + '<br>结束时间: ' +
        (calEvent.end ? calEvent.end.format('YYYY-MM-DD HH:mm') : '无') + '<br></div>';
      var $tooltip = $(popup).appendTo('body');

      $(this).mousemove(function(e) {
        $tooltip.css({
          top: e.pageY + 10,
          left: e.pageX + 20
        });
      });
    },
    eventMouseout: function(calEvent, jsEvent) {
      $(this).css('z-index', 8);
      $('.tooltipevent').remove();
    },
    views: {
      twoWeek: {
        type: 'agenda',
        duration: {
          weeks: 2
        },
        buttonText: '2周视图',
        rows: 2
      }
    },
    // 视图渲染完成后执行列宽调整
    viewRender: function(view, element) {
      adjustColumnWidths(view);
    },
    // 切换视图时重置样式
    viewDestroy: function(view, element) {
      $('.fc-day-header, .fc-day').css('width', '');
    },
    selectable: true,
    selectHelper: true,
  });

  // 动态调整列宽核心函数
  function adjustColumnWidths(view) {
    // 仅处理agenda类视图(twoWeek、agendaDay)
    if (!view.name.includes('agenda')) return;

    var $dayHeaders = $('.fc-day-header');
    var $dayCells = $('.fc-day');
    var eventCounts = {};

    // 统计每列事件数量
    $('.fc-event').each(function() {
      var $event = $(this);
      var dateStr = $event.data('date') || $event.closest('.fc-day').data('date');
      if (!dateStr) return;
      eventCounts[dateStr] = (eventCounts[dateStr] || 0) + 1;
    });

    // 计算基础宽度比例
    var totalColumns = $dayHeaders.length;
    var baseWidth = 100 / totalColumns;
    var totalAdjustedWidth = 0;

    // 调整日期头部宽度
    $dayHeaders.each(function(index) {
      var dateStr = $(this).data('date');
      var count = eventCounts[dateStr] || 1;
      // 限制最大宽度为基础的3倍,避免布局失衡
      var columnWidth = Math.min(baseWidth * count, baseWidth * 3);
      $(this).css('width', columnWidth + '%');
      totalAdjustedWidth += columnWidth;
    });

    // 同步调整日期单元格宽度
    $dayCells.each(function(index) {
      var dateStr = $(this).data('date');
      var count = eventCounts[dateStr] || 1;
      var columnWidth = Math.min(baseWidth * count, baseWidth * 3);
      $(this).css('width', columnWidth + '%');
    });

    // 调整视图容器总宽度
    $('.fc-view').css('width', totalAdjustedWidth + '%');

    // 均分事件宽度,添加边距避免拥挤
    $('.fc-event').each(function() {
      var dateStr = $(this).data('date') || $(this).closest('.fc-day').data('date');
      var count = eventCounts[dateStr] || 1;
      var eventWidth = (100 / count) - 2; // 减去2%边距
      $(this).css('width', eventWidth + '%');
    });
  }
});

修改后的HTML/CSS代码

<script src="https://cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/moment@2/min/moment.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/fullcalendar@3.10.5/dist/fullcalendar.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fullcalendar@3.10.5/dist/fullcalendar.min.css">
<link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/cupertino/jquery-ui.css">

<style>
.fc-view-container {
  overflow-x: auto;
  white-space: nowrap;
}
/* 修复事件边距,避免挤在一起 */
.fc-event {
  margin: 1px !important;
  box-sizing: border-box;
}
/* 调整2周视图基础宽度 */
.fc-view.fc-twoWeek-view.fc-agenda-view{
  min-width: 100%;
}
/* 简化提示框样式 */
.tooltipevent {
  border-radius: 4px;
  box-shadow: 0 2px 5px rgba(0,0,0,0.2);
}
</style>

<div id='calendar-container'>
  <div id='calendar' style="font-family: Segoe UI-MONOSPACE;"></div>
</div>

关键改动说明

  1. 移除重复依赖:删除冲突的jQuery 1.7.2版本,统一使用jQuery 3.x
  2. 新增列宽调整逻辑:通过adjustColumnWidths函数统计事件数,动态放大列宽并限制最大值
  3. 绑定视图生命周期事件:在视图渲染完成时执行调整,切换视图时重置样式
  4. 适配事件宽度:按列内事件数量均分宽度,添加边距提升可读性
  5. 优化提示框样式:简化复杂CSS,增强视觉体验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:18:08