2

解決すべき課題があります。自動サイズ変更とスティッキー (上下) div を作成しています。ここで例を見ることができますhttp://www.sixplus1.com/inventmx/sixplus1_b.html

問題は、ウィンドウを一番下 (div を停止する必要がある場所) にスクロールすると、div が消えることです。マージンの上部の問題が原因だと思うので、解決するためのアイデアが必要です。例を見て、ウィンドウを一番下の行までスクロールしてください。どんな助けでも高く評価されます。

私はこれをできるだけ早く終わらせる必要があります

あなたが助けてくれることを願っています。これがコードです..

注: #content_derecha という名前のコードの div にはクラス sticky があります

<script src="jquery-1.7.1.min.js" type="text/javascript"></script>
<script>
  $(document).ready(function(){

//I make the div with elastic properties
var bottomPosition = $(window).height();
$('#content_derecha').height(bottomPosition); //in this example #content_derecha is the div that has to be elastic and sticky

$(window).resize(function(){
  var bottomPositionN = $(window).height();
  $('#content_derecha').height(bottomPositionN); //the same div resizing its position when the window is resized


});

//Here starts the evaulation to make the div sticky

var footerFreno = $('.stop').offset().top; // returns the stop on top
var stickyTop = $('.sticky').offset().top; // returns the stop on bottom. I have another div on footer with the class .stop


if (!!$('.sticky').offset()) { //first the code verify if the sticky class exists

//here I have a function to verify if the scroll position is between the values I need 

    function verificaRango(x, n, m){ 
      if (x >= n && x <= m) 
        { 
          return true; }else 
          { return false; 
          }

    }

    $(window).scroll(function(){ // Here I capture in a variable the position of the scroll

      //Here I calculate the bottom of the sticky and auto reize the div
      var arribaValor = $('.sticky').offset().top
      var altoValor = $('.sticky').height();
      var posicionFreno = arribaValor + altoValor;
      var windowTop = $(window).scrollTop(); // the position of the scrollbar 
      var posFreno = footerFreno-altoValor;

      var semaforo = verificaRango(windowTop,stickyTop,posFreno); // I store in a variable named "semaforo" the result of the range verification to finally compare it in an if statement...

      if (semaforo == true){ // I finally set the position fixed or static according the position nof the div...
          $('.sticky').css({ position: 'fixed', top: 0 }); 
          }
          else {
              $('.sticky').css('position','static');
          }

    });

  }


});



</script>
4

2 に答える 2

0

これは、div の固定と自動サイズ変更を同時に行うための手順です。

完全なコードとソースをhttp://rmz.sixplus1.com/blog/sticky.htmlに投稿します。

これを機能させるには、jquery を含める必要があります。

次に、3 つのクラスが必要です。

1.- .sticky = the div that will have the sticky an autoresizing functions.
2.- .head = the header of the page.
3.- .stop = The footer of the page where you want the div stops  

4.- Is important that the html and body tags was its margin and padding as 0, for example 


 html,body{
    //    margin:0;
    //    padding: 0; 
    //
    //  }

ここにコードがあります

     $(document).ready(function(){
        //Se dimensiona el div segun el tamaño de la ventana inicial   
        var bottomPosition = $(window).height();
        var stickyAlto = bottomPosition;
        $('.sticky').height(stickyAlto);
        stickyAlto=$('.sticky').outerHeight(true);

    //Funcion para verificar el rango
        function verificaRango(x, n, m){
          if (x >= n && x <= m) 
            { 
              return true; }else 
              { return false; 
              }

        }


    var footerFreno = $('.stop').offset().top; 
    var stickyTop = $('.sticky').offset().top; 
    var headMargen = $('.head').height(); 
    var latosoStage = (footerFreno - stickyAlto) - headMargen ;
    var stageCompleto = $(document).height();
    var arribaValor;
    var altoValor;
    var posicionFreno;
    var windowTop;
    var posFreno;
    var semaforo;
    var bottomPositionN;

    if (!!$('.sticky').offset()) { 

        $(window).scroll(function(){ 

          //calcular la parte de abajo del sticky
          arribaValor = $('.sticky').offset().top
          altoValor = $('.sticky').height();
          posicionFreno = arribaValor + altoValor;
          windowTop = $(window).scrollTop(); // la posicion del scrollbar 
          posFreno = footerFreno-altoValor;
          semaforo = verificaRango(windowTop,stickyTop,posFreno);

          switch(semaforo){

            case true:
            $('.sticky').css({ position: 'fixed', top: 0 });
            break;

            case false:

              if(stickyTop > windowTop){
                $('.sticky').css({ position: 'static', top: 0 });

              }

              if(posicionFreno > footerFreno){
                $('.sticky').css({ position: 'absolute', top: latosoStage });

              }
            break;
          }
        });
      }


    $(window).resize(function(){
      bottomPositionN = $(window).height();
      $('.sticky').height(bottomPositionN);
      bottomPositionN=$('.sticky').outerHeight(true);
      latosoStage = (footerFreno - bottomPositionN) - headMargen ;
      $('#latoso').height(latosoStage);
      stageCompleto = $(document).height();
      $('.sticky').css({ position: 'absolute', top: latosoStage });
      $(window).trigger("scroll");

    });

  });
于 2013-02-21T22:03:30.367 に答える
0

あなたがリンクしたライブバージョンを見て、私はあなたがほとんどそこにいると判断しました...以下を置き換えてください:

//operaciones para freno absoluto
var p =$('.sticky').position().top;
var frenoAbsoluto = p-700;

//operaciones para freno absoluto
var p = $('#content').position().top;
var frenoAbsoluto = posFreno-p;

#content_derecha相対位置の親 ( ) 内で絶対位置を指定しているため#content_derecha_superior、絶対位置はその親の上部 (便宜上、 の上部と同じ場所) に対して相対的になります#content

でページ全体の上部に対する絶対位置を決定していたposFrenoので、 の上部へのオフセットを差し引いただけです#content

ちなみに、マージンの調整も次のように追加する必要がありますswitch(semaforo)

case true:
  $('.sticky').css({ position: 'fixed', top: 0, 'margin-top': '0px' });
  break;
case false:
  if(stickyTop > windowTop){
    $('.sticky').css({ position: 'static', top: 0, 'margin-top': '5px' });
  }

これにより、#content_derechadiv がウィンドウにより正確にフィットします。または、サイズ変更機能を変更できます。

$(window).resize(function(){
var bottomPositionN = $(window).height();
$('#content_derecha').height(bottomPositionN-10);
});

于 2012-10-30T09:07:41.827 に答える