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

能否无需额外框架实现仿Todoist的ViewController角落弹出UITableView?

当然可行!完全可以只用原生HTML、CSS和JavaScript来复刻Todoist的表格视图效果,不用依赖任何第三方UI框架。下面我给你拆解具体的实现步骤,一步步来就能做出类似的效果:

一、先搭好基础HTML结构

Todoist的表格视图核心就是带多列的表格,我们用原生的<table>元素就能实现,对应任务的勾选框、名称、项目、截止日期、优先级这些核心字段:

<div class="todo-table-container">
  <table class="todo-table">
    <thead>
      <tr>
        <th><input type="checkbox" class="select-all"></th>
        <th>任务</th>
        <th>项目</th>
        <th>截止日期</th>
        <th>优先级</th>
        <th>操作</th>
      </tr>
    </thead>
    <tbody>
      <tr class="task-row">
        <td><input type="checkbox" class="task-checkbox"></td>
        <td class="task-name">完成项目文档撰写</td>
        <td><span class="project-badge" style="background-color: #3498db;">前端重构</span></td>
        <td class="due-date">今天</td>
        <td><span class="priority-badge priority-high">高</span></td>
        <td class="actions">
          <button class="action-btn">⋯</button>
        </td>
      </tr>
      <tr class="task-row">
        <td><input type="checkbox" class="task-checkbox"></td>
        <td class="task-name">修复移动端适配问题</td>
        <td><span class="project-badge" style="background-color: #8b5cf6;">Bug修复</span></td>
        <td class="due-date">明天</td>
        <td><span class="priority-badge priority-medium">中</span></td>
        <td class="actions">
          <button class="action-btn">⋯</button>
        </td>
      </tr>
    </tbody>
  </table>
</div>
二、用CSS还原Todoist的视觉风格

Todoist的表格走简洁清爽路线,我们通过CSS来实现边框、hover效果、徽章样式,还有勾选任务后的划线变灰效果:

/* 容器控制表格的整体布局 */
.todo-table-container {
  max-width: 1200px;
  margin: 2rem auto;
  padding: 0 1rem;
}

/* 表格基础样式 */
.todo-table {
  width: 100%;
  border-collapse: collapse;
  font-family: Arial, sans-serif;
  background: #fff;
  border-radius: 8px;
  overflow: hidden;
  box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}

/* 表头样式 */
.todo-table thead tr {
  background-color: #f8f9fa;
  border-bottom: 2px solid #e9ecef;
}

.todo-table th {
  padding: 1rem;
  text-align: left;
  font-weight: 600;
  color: #495057;
}

/* 任务行样式 */
.todo-table tbody tr {
  border-bottom: 1px solid #e9ecef;
  transition: background-color 0.2s ease;
}

.todo-table tbody tr:hover {
  background-color: #f8f9fa;
}

.todo-table td {
  padding: 1rem;
  color: #212529;
}

/* 勾选任务后的样式变化 */
.task-checkbox:checked ~ .task-name {
  text-decoration: line-through;
  color: #adb5bd;
}

/* 项目徽章样式 */
.project-badge {
  padding: 0.25rem 0.75rem;
  border-radius: 20px;
  font-size: 0.875rem;
  color: #fff;
  font-weight: 500;
}

/* 优先级徽章样式 */
.priority-badge {
  padding: 0.25rem 0.5rem;
  border-radius: 4px;
  font-size: 0.875rem;
  font-weight: 600;
}

.priority-high {
  background-color: #ef4444;
  color: #fff;
}

.priority-medium {
  background-color: #f59e0b;
  color: #fff;
}

.priority-low {
  background-color: #10b981;
  color: #fff;
}

/* 操作按钮样式 */
.action-btn {
  background: none;
  border: none;
  font-size: 1.2rem;
  color: #6c757d;
  cursor: pointer;
  padding: 0.25rem;
  border-radius: 4px;
  transition: background-color 0.2s ease;
}

.action-btn:hover {
  background-color: #e9ecef;
}
三、用JS实现核心交互功能

接下来给表格加上Todoist常用的交互,比如全选、单个任务勾选状态同步,还有操作按钮的基础响应:

// 全选功能实现
const selectAllCheckbox = document.querySelector('.select-all');
const taskCheckboxes = document.querySelectorAll('.task-checkbox');

selectAllCheckbox.addEventListener('change', function() {
  taskCheckboxes.forEach(checkbox => {
    checkbox.checked = this.checked;
    // 同步更新任务的完成样式
    const taskName = checkbox.parentElement.nextElementSibling;
    taskName.classList.toggle('completed', this.checked);
  });
});

// 单个任务勾选后的状态同步
taskCheckboxes.forEach(checkbox => {
  checkbox.addEventListener('change', function() {
    const taskName = this.parentElement.nextElementSibling;
    taskName.classList.toggle('completed', this.checked);
    
    // 更新全选框的状态
    const allChecked = Array.from(taskCheckboxes).every(cb => cb.checked);
    selectAllCheckbox.checked = allChecked;
  });
});

// 操作按钮的基础交互(可扩展为下拉菜单)
const actionBtns = document.querySelectorAll('.action-btn');
actionBtns.forEach(btn => {
  btn.addEventListener('click', function() {
    // 这里可以扩展为显示下拉菜单,实现删除、编辑任务等功能
    alert('打开操作菜单');
  });
});
额外优化建议

如果想要更贴近Todoist的体验,还可以加这些原生实现的功能:

  • 响应式适配:在移动端用媒体查询隐藏非核心列,或者让表格支持横向滚动
  • 表头排序:给表头添加点击事件,按日期、优先级对任务行进行排序
  • 动态任务管理:实现任务的添加、删除、编辑功能,用JS操作DOM来更新表格内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:21:52