【问题标题】:Fixed header while scroll滚动时固定标题
【发布时间】:2012-11-27 12:45:51
【问题描述】:

我在页面中间有一个表格的标题,但是由于页面很大,我想在向下滚动页面时将标题固定到浏览器的顶部......

所以我的问题是:如何将标题设置为正常,直到用户向下滚动并且标题的顶部边框接触浏览器边框,它应该保持固定在该位置,无论用户向下多远卷轴?

【问题讨论】:

  • 使用 jquery 的 .scroll() 并设置在窗口的特定滚动点,然后将固定位置类添加到目标或执行 .css() 到目标元素

标签: javascript jquery html css


【解决方案1】:

让我解释一下如何做到这一点。

步骤

  1. 找到你的表头,并保存它的position
  2. 为窗口的scroll 事件添加监听器。
  3. 根据表格标题位置检查窗口滚动
    1. 如果位置
    2. 否则,将 css 重置为像普通标题一样。

我已经发布了一个you can find here 的小提琴。

代码示例

HTML

<div class='lots_of_stuff_in_here'> ... </div>
<table>
    <thead id='my_fixable_table_header'>
        <tr>
            <th>My awsesome header number 1</th>
            <th>My awsesome header number 2</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Content</td>
            <td>Content</td>
        </tr>
        // much more content
    </tbody>
</table>

Javascript

// Just so you get the idea behind the code

var myHeader = $('#my_fixable_table_header');
myHeader.data( 'position', myHeader.position() );
$(window).scroll(function(){
    var hPos = myHeader.data('position'), scroll = getScroll();
    if ( hPos.top < scroll.top ){
        myHeader.addClass('fixed');
    }
    else {
        myHeader.removeClass('fixed');
    }
});

function getScroll () {
    var b = document.body;
    var e = document.documentElement;
    return {
        left: parseFloat( window.pageXOffset || b.scrollLeft || e.scrollLeft ),
        top: parseFloat( window.pageYOffset || b.scrollTop || e.scrollTop )
    };
}

【讨论】:

  • -1:标题单元格应与同一列中单元格的宽度匹配。
  • 我在尝试构建自己的示例时正在查看您的示例,并且需要稍微修改一下您的小提琴,以便滚动时列与标题保持相同。我添加了一些代码来测量标题并将其应用于第一个表格行,以便当您移动标题以使用 jQuery 固定时,列的宽度与标题保持相同。 jsfiddle.net/jbY6X/145
【解决方案2】:

您正在寻找一个水平方向的“粘性框”,它会在您滚动页面时跟随您。

这里是一个演练,解释了如何为侧边栏创建这种效果:http://css-tricks.com/scrollfollow-sidebar/

我修改了代码以使用跨越页面宽度的通用示例:

HTML:

<div class="wrapper">
  <div class="head">HEAD</div>
  <div class="header">Table Header</div>
  <div class="content">Content</div>
  <div class="footer">Footer</div>
</div>​

CSS:

.wrapper {
  border:1px solid red;
}
.head{
  height: 100px;
  background: gray;
}
.header {
  background:red;
  height:100px;
  left:0;
  right:0;
  top:0px;
  margin-top:100px;
  position:absolute;
}

.content {
   background:green;
   height:1000px;
}

.footer {
   background:blue;
   height:100px;
}

jQuery:

$(function() {

    var $sidebar = $(".header"),
        $window = $(window),
        offset = $sidebar.offset(),
        topPadding = 0;

    $window.scroll(function() {
        if ($window.scrollTop() > offset.top) {
            $sidebar.stop().animate({
                top: $window.scrollTop() - offset.top + topPadding
            });
        } else {
            $sidebar.stop().animate({
                top: 0
            });
        }
    });

});​

​当您滚动超出最初出现的位置时,这会将标题块动画化到视图中。

jsFiddle here

【讨论】:

  • 考虑展示一些关于它如何工作的代码。如果/当这些链接不再有效时,您的回答将没有用处。
  • 我需要 jQuery 类似的东西。用 CSS 可以吗?
  • 感谢@MikeSmithDev,我添加了一个示例。 Nutic,让我知道这是否有意义。
  • 这是有效的,但仅适用于
    标签。我无法使用
  • header 类添加到&lt;th&gt;&lt;/th&gt; 的包含tr
【解决方案3】:

您可以尝试将底部元素包含在一个 div 中的标题下,然后将类添加到该 div 设置溢出为自动

【讨论】:

    【解决方案4】:

    我希望你看起来像这个 Header Fix Demo

    HTML

    <div class="wrapper">
    <div class="header">Header Fix</div>
    <div class="content">Content</div>
    <div class="footer">Footer</div>
    </div>
    

    CSS

    .wrapper {
      border:1px solid red;
    }
    
    .header {
      background:red;
      height:100px;
      position:fixed;
      left:0;
      right:0;
      top:0;
    
    }
    
    .content {
       background:green;
       height:1000px;
    }
    
    .footer {
       background:blue;
       height:100px;
    }
    

    【讨论】:

    • 是和不是。我知道该怎么做,但问题是当我打开页面时,我在那个表格之前有 200px 的内容。然后当我向下滚动 200px 时,我希望表格标题保持在顶部,而不是在滚动时保持距离顶部 200px。
    • @Nutic 所以请发布您的完整代码,我们将无法痛苦地告诉您解决方案。
    • tinkerbin.com/rJK990rM 示例:看起来像这样。我希望当我向下滚动时,那个 HEAD 部分会上升,然后消失,红色的部分会固定在 TOP,而不是固定的起始位置。
    【解决方案5】:

    为了保持任何块元素的位置固定,你需要在样式的显示属性中使用absolute或fixed属性,但不要忘记给顶部元素留出足够的空间,否则它会在标题下部分。

    【讨论】:

      【解决方案6】:
      $(window).scroll(function() {
       if ($(this).scrollTop() > 100){  
          $('header').addClass("sticky");
        }
        else{
          $('header').removeClass("sticky");
        }
      });
      

      css:

      header.sticky {
        font-size: 24px;
        line-height: 48px;
        height: 48px;
        background: #efc47D;
        text-align: left;
        padding-left: 20px;
      }
      

      【讨论】:

        【解决方案7】:

        这是使用固定页眉、页脚和列的完整工作版本!

        应用位置相关的类,非常重要,否则固定列会重叠页眉和页脚,然后在需要的地方定义表级别的类:“sticky-table”(强制),“sticky-header”, “sticky-column”、“sticky-footer”,而不是调用函数“applyStickyHeaders”。就是这样!

        $(function(){
            applyStickyHeaders();
        });
        

        完整示例:

        https://jsfiddle.net/pintilies/6zLyxewg/4/

        在 IE、FireFox 和 Chrome 中测试。

        【讨论】:

          猜你喜欢
          相关资源
          最近更新 更多
          热门标签