使用粘性标题滚动列表

问题描述 投票:0回答:1

我正在尝试在网页上创建一种待办事项列表,它本质上是一个包含任务的大列表,但按日期划分。

为了实现这一目标,我正在考虑创建两个专栏。在左侧,我想显示包含日期的框,在右栏中,我想显示包含任务的列表。

我希望左栏中的日期框与列表一起滚动,并将其链接到具有该日期的第一个项目。

一旦到达页面(或 div)顶部,我希望它保留在顶部,就像粘性标题一样,直到下一个日期框向上滚动以替换它。

但是如何将这些日期框与另一列中的

<li>
链接起来?

如有任何建议,我们将不胜感激。

有一个jsfiddle可以更多地展示我想要得到的东西:https://jsfiddle.net/jsfnx0yL/1/

html jquery list sticky
1个回答
0
投票
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Sticky Date and Task List</title>
    <style>
        body {
            display: flex;
            height: 100vh;
            margin: 0;
            overflow: hidden;
        }

        .container {
            display: flex;
            width: 100%;
        }

        .dates-column {
            width: 20%;
            position: relative;
            overflow-y: hidden;
        }

        .tasks-column {
            width: 80%;
            overflow-y: scroll;
            padding-left: 20px;
        }

        .date-box {
            position: absolute;
            top: 0;
            left: 0;
            right: 0;
            background-color: lightgray;
            padding: 10px;
            text-align: center;
            border-bottom: 1px solid #ccc;
        }

        .task-list {
            list-style: none;
            padding: 0;
        }

        .task-item {
            padding: 10px;
            border-bottom: 1px solid #ddd;
        }

        .task-date {
            padding: 10px;
            font-weight: bold;
        }

        .sticky {
            position: sticky;
            top: 0;
        }
    </style>
</head>
<body>
    <div class="container">
        <!-- Left: Dates Column -->
        <div class="dates-column">
            <div class="date-box" id="sticky-date">Date 1</div>
        </div>

        <!-- Right: Tasks Column -->
        <div class="tasks-column" id="task-list">
            <ul class="task-list">
                <li class="task-date" data-date="Date 1">Date 1</li>
                <li class="task-item">Task 1</li>
                <li class="task-item">Task 2</li>
                <li class="task-item">Task 3</li>
                <li class="task-date" data-date="Date 2">Date 2</li>
                <li class="task-item">Task 4</li>
                <li class="task-item">Task 5</li>
                <li class="task-item">Task 6</li>
                <li class="task-date" data-date="Date 3">Date 3</li>
                <li class="task-item">Task 7</li>
                <li class="task-item">Task 8</li>
            </ul>
        </div>
    </div>

    <script>
        const taskList = document.getElementById('task-list');
        const stickyDateBox = document.getElementById('sticky-date');
        const dateItems = document.querySelectorAll('.task-date');

        // Update sticky date box when scrolling
        taskList.addEventListener('scroll', () => {
            let stickyDate = '';
            dateItems.forEach(dateItem => {
                const rect = dateItem.getBoundingClientRect();
                if (rect.top <= 0) {
                    stickyDate = dateItem.dataset.date;
                }
            });

            if (stickyDate) {
                stickyDateBox.textContent = stickyDate;
            }
        });
    </script>
</body>
</html>
© www.soinside.com 2019 - 2024. All rights reserved.