2017-07-14 10 views
0

場合によっては、コンテンツのdivの高さがサイドバーの高さより大きく、見栄えが悪いことがあります。コンテンツの高さは、ページスクロールに、サイドバーよりも大きければ、私がやりたいサイドバーの高さをスクロールのコンテンツと同じに設定します。

は、コンテンツの下部まで

をサイドバーのマージントップを追加し、私はこのコードであることを実行しようとしました:

var sidebar = $("#sidebar").outerHeight(); 
var content = $("#content-left").outerHeight(); 
var gap = (content - sidebar); 
$(window).scroll(function() { 
if ($(this).scrollTop() > gap) { 
if (content > sidebar) { 
$("#sidebar").css('margin-top', +gap); 
}}}); 

しかし、実際に私がしたいことではありません。ユーザーが20ピクセルスクロールしてコンテンツの最後まで20ピクセルの余白を追加したい場合

これを行うより簡単で良い方法がある場合は、私にお知らせください。

ありがとうございました!

UPDATE:

ここでは私の#コンテンツ左CSSです:#content-left { float: left;width: 68%;}

と#sidebarのCSS:

float: right; 
width: 30%; 
height: auto; 
padding: 0; 
margin-top: 0px; 
margin-bottom: 15px; 
overflow: hidden; 

答えて

1

私は(それが受け入れられた後に)答えを改善することを決めました。今私は、divの位置を処理する関数を作成しました。スクロール、ウインドウのサイズ変更などで実行することができます。このコードを使用したい場合に便利です。

だけの変数を変更:

  • contentHeight
  • sidebarHeight
  • contentOffset

そして、あなたはすべて完了している:)。

これ以上の改善に関する提案はいつでも歓迎します。

JS-フィドル

JS-Fiddle

HTML

<header> 
<h1>"The sticking sidebar"</h1> 
</header> 
<div id="content"><p>START<br/> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus a tellus tincidunt, lacinia ex facilisis, facilisis ipsum. Pellentesque ac accumsan mi. Vestibulum iaculis luctus ultricies. Integer aliquet, felis id facilisis consectetur, tortor ligula eleifend urna, convallis facilisis erat erat nec libero. Pellentesque finibus sed leo vel tincidunt. Praesent in est erat. Donec nec varius leo. Nam convallis feugiat velit at commodo. Mauris feugiat lorem eros, a varius sem gravida eu. Ut convallis, velit hendrerit semper laoreet, libero nunc egestas neque, et ultrices ex elit et lacus.</p><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus a tellus tincidunt, lacinia ex facilisis, facilisis ipsum. Pellentesque ac accumsan mi. Vestibulum iaculis luctus ultricies. Integer aliquet, felis id facilisis consectetur, tortor ligula eleifend urna, convallis facilisis erat erat nec libero. Pellentesque finibus sed leo vel tincidunt. Praesent in est erat. Donec nec varius leo. Nam convallis feugiat velit at commodo. Mauris feugiat lorem eros, a varius sem gravida eu. Ut convallis, velit hendrerit semper laoreet, libero nunc egestas neque, et ultrices ex elit et lacus.</p><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus a tellus tincidunt, lacinia ex facilisis, facilisis ipsum. Pellentesque ac accumsan mi. Vestibulum iaculis luctus ultricies. Integer aliquet, felis id facilisis consectetur, tortor ligula eleifend urna, convallis facilisis erat erat nec libero. Pellentesque finibus sed leo vel tincidunt. Praesent in est erat. Donec nec varius leo. Nam convallis feugiat velit at commodo. Mauris feugiat lorem eros, a varius sem gravida eu. Ut convallis, velit hendrerit semper laoreet, libero nunc egestas neque, et ultrices ex elit et lacus.</p><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus a tellus tincidunt, lacinia ex facilisis, facilisis ipsum. Pellentesque ac accumsan mi. Vestibulum iaculis luctus ultricies. Integer aliquet, felis id facilisis consectetur, tortor ligula eleifend urna, convallis facilisis erat erat nec libero. Pellentesque finibus sed leo vel tincidunt. Praesent in est erat. Donec nec varius leo. Nam convallis feugiat velit at commodo. Mauris feugiat lorem eros, a varius sem gravida eu. Ut convallis, velit hendrerit semper laoreet, libero nunc egestas neque, et ultrices ex elit et lacus.<br/>END</p></div> 
<div id="sidebar"><p>START<br/> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus a tellus tincidunt, lacinia ex facilisis, facilisis ipsum. Pellentesque ac accumsan mi. Vestibulum iaculis luctus ultricies. Integer aliquet, felis id facilisis consectetur, tortor ligula eleifend urna, convallis facilisis erat erat nec libero. Pellentesque finibus sed leo vel tincidunt. Praesent in est erat. Donec nec varius leo. Nam convallis feugiat velit at commodo. Mauris feugiat lorem eros, a varius sem gravida eu. Ut convallis, velit hendrerit semper laoreet, libero nunc egestas neque, et ultrices ex elit et lacus.<br/>END</p></div> 
<footer><i>footer</i></footer> 

CSS

header h1{ 
    text-align: center; 
} 
#content{ 
    float: left; 
    width: 70%; 
    background-color: rgb(150, 150, 0) 
} 
#sidebar{ 
    position: relative; 
    width: 30%; 
    float: right; 
    background-color: yellow; 
} 

JS/jQueryの

$(document).ready(function(){ 
    // define variables before scrollin to destress the processor 
    let contentHeight = $("#content").height(); 
    let sidebarHeight = $("#sidebar").height(); 
    let windowHeight = $(window).height(); 
    let doc = $(document); 
    let contentOffset = $("#content").offset().top; 

    $(window).resize(function(){ 
    //should reset all variables here or the code will bug out on screen resizing 
    contentHeight = $("#content").height();; 
    sidebarHeight = $("#sidebar").height(); 
    windowHeight = $(window).height(); 
    contentOffset = $("#content").offset().top; 
    determineSidebarScrollBehavior(doc, contentHeight, contentOffset, sidebarHeight,windowHeight); 
    }); 
    $(document).scroll(function(){ 
      determineSidebarScrollBehavior(doc, contentHeight, contentOffset, sidebarHeight, windowHeight); 
    }); // end scroll 
});//end ready 

function determineSidebarScrollBehavior(doc, contentHeight, contentOffset, sidebarHeight, windowHeight){ 
    //only run if the #sidebar is higher than the #content 
    if(contentHeight>sidebarHeight){ 
    var scrollTop = doc.scrollTop(); 
    //check if variable has been previously created by this function else the value is 0 
    let oldScrollTop = (window.oldScrollTop)?window.oldScrollTop:0; 
    //create a marginTop var if it doesn t exist yet 
    window.marginTop = (window.marginTop)?marginTop:0; 
    //determine if you scroll up op down 
    let isScrollingDown = (scrollTop>oldScrollTop)?true:false; 
    //if the end of the sidebar reaches the end of the window change margin so it "sticks". It should stick until the #sidebar reaches the same height (inculding margin) as the #content. 
    if(isScrollingDown && scrollTop+windowHeight > contentOffset + sidebarHeight + marginTop){ 
    marginTop = scrollTop + windowHeight-sidebarHeight-contentOffset; 
    // check if content would be too long, if so set the maximum marginTop 
    if(marginTop>contentHeight-sidebarHeight){ 
     marginTop = contentHeight-sidebarHeight; 
     } 
    }  
    // if the start of the sidebar reaches the top while scrolling up, make it "stick" 
     else if(!isScrollingDown && scrollTop < contentOffset + marginTop){ 
     marginTop = scrollTop - contentOffset; 
     // make sure margin-top cannot go negative 
     if(marginTop<0){ 
     marginTop = 0; 
     } 
    } 
    //change the margin 
    $("#sidebar").css({'margin-top': marginTop}); 
    } 
    window.oldScrollTop = scrollTop; 
} 
+0

ありがとう、あなたのコードはうまくいくが、まだ解決すべき点がいくつかある。あなたのコードでビデオを録音しました。 [こちらからご覧ください](https://www.youtube.com/watch?v=PTCBxcdwK5c)ユーザーがサイドバーの端を見ているときにのみ余白を追加する必要があります。そして、あなたがビデオに見ているように、スクロールしてトップに戻ると、サイドバーは見栄えが良くありません。まだマージントップを持っています。私は説明できることを願っています。もう一度助けてくれてありがとう:) @RMo – Solhan

+1

https://jsfiddle.net/uzfxg6zz/7/それは少し仕事だったが、これは良いかもしれない。私はあなたのビデオのいくつかの深刻な遅れに気づいたので、いくつかの追加の最適化のために少し遅れていることをうまくいきます。それがうまくいけば私の答えにそれを更新するコメントを与えます。 – RMo

+0

これはたくさんの作業です。本当にありがとうございます。さて、それは非常にうまく動作します。私は[ビデオ](https://youtu.be/BUpRen3OVck)をもう一度記録しました。私は修正する2つのことがあると思います。まず、コンテンツの下部に来るとわかるように、7秒で、サイドバーの余白が削除されます。コンテンツの一番下まで粘り強いことはありますか?もう一度9.8秒でサイドバーがスクロールするときのようにスティックします。トップをスクロールするときにサイドバーの代わりにサイドバーの上をスティックすることができ、コンテンツの上部までスティッキーな方法で移動できますか?もう一度ありがとうございます。<3 @RMo – Solhan

0

あなたはフレックスを使用し、JavaScriptを捨てることができます。私はあなたのための簡単な例を以下に書いた。

body { 
 
    margin: 0; 
 
    width: 100%; 
 
    height: 100%; 
 
} 
 

 
.container { 
 
    display: flex; 
 
} 
 

 
.sidebar { 
 
    min-height: 100vh; 
 
    width: 20%; 
 
    background: pink; 
 
} 
 

 
.content { 
 
    min-height: 100vh; 
 
    width: 80%; 
 
    background: blue; 
 
}
<div class="container"> 
 
    <div class="sidebar"></div> 
 
    <div class="content"></div> 
 
</div>

+0

答えてくれてありがとう、私はサイドバーやコンテンツ内のdivを持っている、と私はディスプレイを追加する場合:// prntscr:すべてのdivは、[この](HTTPのようなめちゃくちゃに、コンテンツに曲げます。 com/fvpvah)。私はすでにWeb上で他のソリューションをチェックしていて、どれも私のために働いていませんでした。私はマージントップでこれを行うための唯一の方法だと思います:) – Solhan

+0

コンテンツコンテナ自体ではなく、コンテナにflexを追加する必要があります。 @Solhan – Win

+0

私はディスプレイを追加:フレックス; #content-left divだけにします。私は間違いをしていますか? – Solhan

関連する問題