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

在Angular中开发支持单天时段拖拽设置的日程表功能咨询

Angular 周视图日程表时段选择功能开发思路

基础网格结构搭建

  • 采用CSS Grid实现二维时间网格布局:横轴为周一至周日7列,纵轴按你需要的时间粒度(15分钟/30分钟/1小时)拆分单元格,每个单元格对应指定周内日期+指定时段的唯一维度,和你贴的示例图结构完全匹配
  • 用Angular的@for语法批量渲染单元格,每个单元格绑定自定义属性data-weekday(存储周几的索引,0-6)、data-time-index(存储时段的索引,比如0代表0点、1代表1点),同时绑定唯一ID方便状态管理
  • 用二维数组或者Set<string>结构存储选中的单元格ID,命名格式可以用{weekdayIndex}_{timeIndex},查询和修改效率都很高

点击单选功能实现

  • 给所有单元格绑定click事件,点击时读取当前单元格的两个自定义属性,拼接成ID后更新选中状态集合,同步给选中的单元格加selected类实现高亮效果
  • 如果需要区分工作/休息/禁用等不同时段类型,可以把状态集合改成Map结构,key存单元格ID,value存对应的时段类型,渲染时根据类型加不同的样式类即可

Excel式拖拽批量选择实现

核心逻辑靠三个鼠标事件配合完成,没有复杂的第三方依赖:

  • 定义三个全局状态变量:isDragging = false(标记是否处于拖拽选中状态)、startCell = {weekday: 0, timeIndex: 0}(存储拖拽起始单元格坐标)
  • 监听单元格mousedown事件:触发时将isDragging设为true,记录当前单元格为起始坐标,同时把该单元格加入选中集合
  • 监听网格区域mousemove事件:如果isDragging为true,读取当前鼠标悬停的单元格坐标,计算起始坐标到当前坐标的矩形覆盖范围,把范围内所有单元格批量加入选中集合,同步更新高亮样式
  • 监听全局mouseup事件+网格区域mouseleave事件:触发时将isDragging重置为false,结束本次拖拽选择
  • 可选优化:mousemove事件加10ms左右的防抖,避免高频触发导致页面卡顿

数据输出与校验

  • 选中状态集合可以很方便的转成结构化业务数据:把连续的同类型时段合并成一条记录,包含weekday、startTime、endTime、type四个核心字段,满足后续存储或者提交接口的需求
  • 可以根据业务需求加冲突校验,比如已经标记为休息的时段不可被选中为工作时段,拖拽过程中实时判断即可

可选扩展功能

  • 支持按住Ctrl/Command键实现不连续区域加选,事件逻辑里判断按键按下状态即可
  • 拖拽过程中悬浮提示当前选中的时段范围,给用户明确的操作反馈
  • 移动端适配把鼠标事件替换成对应的触摸事件,核心逻辑完全复用

日程表示例效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 21:15:03