【问题标题】:Sticky table rows粘性表格行
【发布时间】:2013-07-08 17:10:52
【问题描述】:

我正在尝试实现一个类似于 iOS 的日历列表视图。基本上,我现在正在做的是遍历我的一系列事件。如果是新日期,则打印日期标题,否则打印日历事件。我想让 DATE HEADER 行保持粘性,直到它们被“滚动”。

我怎样才能做到这一点?我看到很多关于粘性标题的示例,但没有一个实际的示例将这种“粘性”功能仅应用于表格行。我的<table 也放在它自己的可滚动固定高度内,我希望标题贴在<div> 的顶部而不是top:0;

我已经将我的代码放入了http://codepen.io/anon/pen/zxpkr 的笔中,现在我需要修复colspan,因为我的<td> 没有跨越单元格,并且让<tr> 贴在顶部<div>.

【问题讨论】:

标签: javascript jquery css


【解决方案1】:

我不得不用容器 div 包装可滚动的 div 并稍微使用 if 语句,但它可以工作。

Working Example

JS

function stickyTitles(stickies) {
    this.load = function () {
        stickies.each(function () {
            var thisSticky = jQuery(this).wrap('<div class="followWrap" />');
            thisSticky.parent().height(thisSticky.outerHeight());
            jQuery.data(thisSticky[0], 'pos', thisSticky.offset().top);
        });
    };
    this.scroll = function () {
        stickies.each(function (i) {
            var thisSticky = jQuery(this),
                nextSticky = stickies.eq(i + 1),
                prevSticky = stickies.eq(i - 1),
                pos = jQuery.data(thisSticky[0], 'pos'),
                h = $('.mytable').offset().top;
            if (pos <= jQuery('.mytable').scrollTop() + h) {
                thisSticky.addClass("fixed");
                if (nextSticky.length > 0 && jQuery('.mytable').scrollTop() + h >= jQuery.data(thisSticky[0], 'pos') - prevSticky.outerHeight()) {
                    thisSticky.addClass("absolute").css("top", jQuery.data(nextSticky[0], 'pos') - $('.mytable').scrollTop() - prevSticky.outerHeight() - h);
                }
            } else {
                thisSticky.removeClass("fixed");
                if (prevSticky.length > 0 && jQuery('.mytable').scrollTop() + h <= jQuery.data(thisSticky[0], 'pos') - prevSticky.outerHeight()) {
                    prevSticky.removeClass("absolute").removeAttr("style");
                }
            }
        });
    };
}
jQuery(document).ready(function () {
    var newStickies = new stickyTitles(jQuery(".followMeBar"));
    newStickies.load();
    jQuery('.mytable').on("scroll", function () {
        newStickies.scroll();
    });
});

CSS

body {
    height:2000px;
    margin: 0;
    background: #333;
    color: #fff;
    overflow: auto;
}
table {
    width: 100%;
}
table tr {
    height: 100px;
}
.followMeBar {
    display: block;
    background: #222;
    border-bottom: solid 1px #111;
    border-top: solid 1px #444;
    position: relative;
    z-index: 1;
    width: 200%;
}
.followMeBar.fixed {
    position: absolute;
    top: 0;
    width: 90%;
    z-index: 0;
}
.followMeBar.fixed.absolute {
    position: absolute;
}
.mytable {
    overflow-y: scroll;
    height: 250px;
}
#hidden {
    overflow:hidden;
    position:absolute;
    width:100%;
}

HTML

<h1>Test</h1>

<p>My table in a div below...</p>
<div id="hidden">
    <div class='mytable'>
        <table>
            <tr class='followMeBar'>
                <td colspan="4">12-07-2013</td>
            </tr>
            <tr>
                <td>4:35 PM</td>
                <td>1729</td>
                <td>2</td>
                <td>jack</td>
            </tr>
            <tr>
                <td>4:40 PM</td>
                <td>KSKS</td>
                <td>4</td>
                <td>jason</td>
            </tr>
            <tr>
                <td>5:35 PM</td>
                <td>1714</td>
                <td>4</td>
                <td>raymond</td>
            </tr>

        etc...

        </table>
    </div>
</div>

请注意,此方法基于this answer,我不得不稍作调整以使其适用于可滚动的 div,但我想在应得的地方给予赞扬。

【讨论】:

  • 这似乎是我需要的!虽然只有一小部分,但列标题似乎仅在向下滚动时才会自行扩展,这不是有意的。有没有办法让标题始终保持相同的宽度?再一次,我真的很感谢你的帮助。 :)
  • 是的,看起来棒极了!太感谢了!看来我的赏金显然已经过期了,我还有什么办法可以奖励给你吗?
  • 不是真的,一旦赏金到期,它就消失了。别担心,分数无关紧要
  • 这会在 tr 周围添加一个 div,因此不是有效的 HTML。它会导致很多问题。 :(
【解决方案2】:

将所有divs 替换为一张表格和trs,添加了一些样式,并且可以正常工作:P

代码:Codepen

尽管它用div 包裹了所有标题trs。规范实际上不允许这样做,但它确实有效。

【讨论】:

  • 您好,感谢您的回答。我试图根据我的目的对其进行更多编辑,但我的 colspan 似乎没有工作。有什么我想念的吗? codepen.io/anon/pen/olhbI
  • 我已经修改了 CodePen(现在位于 codepen.io/anon/pen/zxpkr),使其与我现在想要实现的完全相似。它对我来说似乎不像对你那样顺利。 :(
  • 虽然我不太了解您的两个代码笔之间的区别,但我知道您想要相同的东西,但使用 colspan="3"。问题是我不在电脑附近,codepen 不能很好地与我的 iPhone 浏览器配合使用。如果您可以将代码移动到 JSfiddle 或 JSbin,我可能会提供帮助。另外,如果 colspan 失败了,如果我用 div 代替但让它看起来像一张桌子,可以吗?
  • 您好!非常感谢您到目前为止的帮助!在第二个代码中,表格放置在具有固定高度的divoverflow-y:scroll 中。 table 对我来说是最理想的,但我猜出于绝望,div 也可以工作,只要我以后需要时可以轻松添加更多列。 jsFiddle 代码在这里:jsfiddle.net/p9Dgh
【解决方案3】:

我宁愿在顶部有一个表格作为表头(并粘在父 div 的顶部),而不是制作一个绝对位置,顺便说一句,这可能在浏览器中效果不佳数据表在其下方滚动。

你甚至不需要为此使用 jQuery!

http://jsbin.com/ucevuy/1/edit

* {
  margin:0;
  padding:0;
}
div {
  border:solid red;
  height:300px;
  overflow:auto;
}
table {
  width:400px;
}
td {
  border:solid black 1px;
  width:50%;
}
.head {
  position:absolute;
  top:0;
  background-color:#fff;
}

.data {
  margin-top:20px;
}

【讨论】:

  • 嗨。但我每个日期都有多个“标题”,我试图实现一个“标题”从另一个弹出的滚动效果。这没有实现它,是吗?
  • 我没有注意到。在这种情况下,您应该使用 jquery 并根据滚动位置更改 css。
  • 嗯,这不是我当前不成功的代码现在试图做的事情吗?还是有替代方案可以实现您提到的。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 2021-06-23
  • 2018-09-15
  • 1970-01-01
  • 2019-09-04
相关资源
最近更新 更多