58

特定のピクセル数までスクロールすると、固定されてそのままのヘッダーを作成しています。

css と html だけを使用してこれを行うことはできますか、それとも jquery も必要ですか?

わかりやすいようにデモを作成しました。どんな助けでも素晴らしいでしょう!

http://jsfiddle.net/gxRC9/4/

body{
     margin:0px;
     padding:0px;
}
 .clear{
     clear:both;
}
 .container{
     height:2000px;
}
 .cover-photo-container{
     width:700px;
     height: 348px;
     margin-bottom: 20px;
     background-color:red;
}
 .small-box{
     width:163px;
     height:100px;
     border:1px solid blue;
     float:left;
}
 .sticky-header{
     width:700px;
     height:50px;
     background:orange;
     postion:fixed;
}


4

16 に答える 16

136

スクロール イベントを実行するには、いくつかの JS が必要です。これを行う最善の方法は、スクロールが特定のポイントを過ぎたときに関連する div に割り当てられる固定位置に新しい CSS クラスを設定することです。

HTML

<div class="sticky"></div>

CSS

.fixed {
    position: fixed;
    top:0; left:0;
    width: 100%; }

jQuery

$(window).scroll(function(){
  var sticky = $('.sticky'),
      scroll = $(window).scrollTop();

  if (scroll >= 100) sticky.addClass('fixed');
  else sticky.removeClass('fixed');
});

フィドルの例: http://jsfiddle.net/gxRC9/501/


編集: 拡張例

トリガー ポイントが不明であるが、スティッキー エレメントが画面の上部に到達するたびに発生する必要がある場合は、offset().top使用できます。

var stickyOffset = $('.sticky').offset().top;

$(window).scroll(function(){
  var sticky = $('.sticky'),
      scroll = $(window).scrollTop();

  if (scroll >= stickyOffset) sticky.addClass('fixed');
  else sticky.removeClass('fixed');
});

フィドルの拡張例: http://jsfiddle.net/gxRC9/502/

于 2013-10-03T12:00:56.590 に答える
12

コープの答えは素晴らしいです。
ただし、jQuery に依存します。依存関係のないバージョンを次に示します。

HTML

<div id="sticky" class="sticky"></div>

CSS

.sticky {
  width: 100%
}

.fixed {
  position: fixed;
  top:0;
}

JS
(これは、Vanilla JS でオフセットを見つけるためにまぶたのない答えを使用します。)

function findOffset(element) {
  var top = 0, left = 0;

  do {
    top += element.offsetTop  || 0;
    left += element.offsetLeft || 0;
    element = element.offsetParent;
  } while(element);

  return {
    top: top,
    left: left
  };
}

window.onload = function () {
  var stickyHeader = document.getElementById('sticky');
  var headerOffset = findOffset(stickyHeader);

  window.onscroll = function() {
    // body.scrollTop is deprecated and no longer available on Firefox
    var bodyScrollTop = document.documentElement.scrollTop || document.body.scrollTop;

    if (bodyScrollTop > headerOffset.top) {
      stickyHeader.classList.add('fixed');
    } else {
      stickyHeader.classList.remove('fixed');
    }
  };
};

https://jsbin.com/walabebita/edit?html,css,js,output

于 2016-03-31T16:54:40.073 に答える
10

Coop がすでにこの質問に回答していることは知っていますが、静的な値に依存するのではなく、ドキュメント内の div の場所も追跡するバージョンを次に示します。

http://jsfiddle.net/gxRC9/16/

Javascript

var offset = $( ".sticky-header" ).offset();
var sticky = document.getElementById("sticky-header")

$(window).scroll(function() {

    if ( $('body').scrollTop() > offset.top){
        $('.sticky-header').addClass('fixed');
    } else {
         $('.sticky-header').removeClass('fixed');
    } 

});

CSS

.fixed{
     position: fixed;
    top: 0px;
}
于 2013-10-03T12:14:33.220 に答える
8

オフセットを使用するRich's answerに基づいて構築するだけです。

これを次のように変更しました。

  • Rich の例では var は必要あり$stickyませんでした。何もしていませんでした。
  • オフセット チェックを別の関数に移動し、ドキュメントの準備ができているときとスクロール時に呼び出したので、ページの途中でスクロールでページが更新された場合、スクロールを待たずにすぐにサイズが変更されます。引き金

    jQuery(document).ready(function($){
        var offset = $( "#header" ).offset();
        checkOffset();
    
        $(window).scroll(function() {
            checkOffset();
        });
    
        function checkOffset() {
            if ( $(document).scrollTop() > offset.top){
                $('#header').addClass('fixed');
            } else {
                $('#header').removeClass('fixed');
            } 
        }
    
    });
    
于 2016-03-01T12:20:28.293 に答える
6

Cooops の回答は優れたシンプルなソリューションですが、固定クラスを適用すると、ページが非常に短くなり、コンテンツが「ジャンプ」して、ページの長さがスクロール距離がヘッダーの高さよりも短い場合要素を使用すると、ジャンプするように見え、ページの下部が表示されなくなります。

私が見つけた答えは、固定される要素(私の場合はnav要素)の上にスペーサーdivを追加し、nav要素と同じ高さに設定し、何も表示しないように設定することでした。

.fixed クラスを nav に追加する場合は .nav-spacer div を表示し、削除する場合は非表示にします。ページの高さが瞬時に変わるため、期間を 0 に設定しました。

HTML

<header>the element above the element that will become fixed</header>
<div class="nav-spacer"></div>
<nav></nav>

CSS

nav {
    position: relative;    
    height: 100px;
}
.nav-spacer{
    position: relative;
    height: 100px;
    display: none;
}
.fixed {
    position: fixed;
    top:0;
    left:0;
    width: 100%;
    /* I like to add a shadow on to the fixed element */
    -webkit-box-shadow: 0px 5px 10px 1px rgba(0,0,0,0.25);
    -moz-box-shadow: 0px 5px 10px 1px rgba(0,0,0,0.25);
    box-shadow: 0px 5px 10px 1px rgba(0,0,0,0.25);
}

JavaScript

var stickyOffset = $('nav').offset().top;

$(window).scroll(function(){
    if ($(window).scrollTop() >= stickyOffset){
        $('nav').addClass('fixed');
        //this makes the page length equal to what it was before fixing nav
        $('.nav-spacer').show(0); 
    }
    else {
        $('nav').removeClass('fixed');
        $('.nav-spacer').hide(0);
    }
});
于 2016-09-29T04:12:01.457 に答える
3

spanまたは、固定ヘッダーの高さを高さに設定してタグを追加し、スティッキー ヘッダーの横に挿入します。

$(function() {
  var $span_height = $('.fixed-header').height;
  var $span_tag = '<span style="display:block; height:' + $span_height + 'px"></span>';

  $('.fixed-header').after($span_tag);
});
于 2015-11-16T10:56:55.207 に答える
2
 $(document).ready(function(){

    var div=$('#header');
    var start=$(div).offset().top;

    $.event.add(window,'scroll',function(){
        var p=$(window).scrollTop();
        $(div).css('position',(p>start)?'fixed':'static');
        $(div).css('top',(p>start)?'0px':'');

    }); 
});

それは完全に機能します。

于 2015-08-04T13:07:08.847 に答える
2

選択したソリューションが私のページにうまく適合しませんでした。したがって、これはブートストラップで動作するより高度なバージョンです。

JavaScript

var stickyOffset = $('.sticky-header').offset().top;

$(window).scroll(function () {
    var sticky = $('.sticky-header'),
        scroll = $(window).scrollTop(),
        header = $('.fixed-header-background');
    sticky.each(function() {
        var left = $(this).offset().left;
        $(this).data('left', left);//I store the left offset
    });

    if (scroll >= stickyOffset) {
        sticky.addClass('fixed');
        header.css('display', 'block');
        sticky.each(function() {
            $(this).css('left', $(this).data('left'));//I set the left offset
        });
    } else {
        sticky.removeClass('fixed');
        header.css('display', 'none');
        sticky.each(function () {
            $(this).css('left', '');//I remove the left offset
        });
    }
});

CSS

.fixed-header-background {
    display: none;
     position: fixed;
    top: 50px;
    width: 100%;
    height: 30px;
    background-color: #fff;
    z-index: 5;
    border-bottom-style: solid;
    border-bottom-color: #dedede;
    border-bottom-width: 2px;
}

.fixed{
     position: fixed;
    top: 52px;
    z-index: 6;
}

そしてHTML

    <div class="fixed-header-background"></div>
<table class="table table-hover table-condensed">
        <thead>
            <tr>
                <th></th>
                <th><span class="sticky-header">My header 1</span></th>
                <th><span class="sticky-header">My header 2</span></th>
            </tr>
        </thead>
        <tbody>
[....]

        </tbody>
    </table>
于 2015-08-05T09:37:33.693 に答える