Responsive horizontal page sliding

后端 未结 2 1879
梦毁少年i
梦毁少年i 2020-11-27 05:52

I want to create horizontal responsive page navigation as illustrated by the below image : \"horizontal

相关标签:
2条回答
  • 2020-11-27 06:28

    Horizontal page sliding

    with left-margin animation

    This jQuery snippet :

    1. Calculates the number of slides and set the width of the wrapper accordingly.
    2. According to which link is clicked, left-margin is animated on the wrapper to show the corresponding slide with a smooth transition
    3. Toggles the class of the clicked link for active link highlighting

    Note that this solution:

    1. Uses only one menu occurence to minimize markup and prevent content repetition.
    2. Requires only the jQuery library
    3. works for a dynamic number of slides

    $(document).ready(function() {
      var slideNum = $('.page').length,
        wrapperWidth = 100 * slideNum,
        slideWidth = 100 / slideNum;
      $('.wrapper').width(wrapperWidth + '%');
      $('.page').width(slideWidth + '%');
    
      $('a.scrollitem').click(function() {
        $('a.scrollitem').removeClass('selected');
        $(this).addClass('selected');
    
        var slideNumber = $($(this).attr('href')).index('.page'),
          margin = slideNumber * -100 + '%';
    
        $('.wrapper').animate({
          marginLeft: margin
        }, 1000);
        return false;
      });
    });
    html,
    body {
      height: 100%;
      margin: 0;
      overflow-x: hidden;
      position: relative;
    }
    
    nav {
      position: absolute;
      top: 0;
      left: 0;
      height: 30px;
    }
    
    .wrapper {
      height: 100%;
      background: #263729;
    }
    
    .page {
      float: left;
      background: #992213;
      min-height: 100%;
      padding-top: 30px;
    }
    
    #page-1 {
      background: #0C717A;
    }
    
    #page-2 {
      background: #009900;
    }
    
    #page-3 {
      background: #0000FF;
    }
    
    a {
      color: #FFF;
    }
    
    a.selected {
      color: red;
    }
    
    .simulate {
      height: 2000px;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <div class="wrapper">
      <nav>
        <a href="#page-1" class="scrollitem selected">page 1</a>
        <a href="#page-2" class="scrollitem">page 2</a>
        <a href="#page-3" class="scrollitem">page 3</a>
      </nav>
      <div id="page-1" class="page">
        <h3>page 1</h3>
        <div class="simulate">Simulated content heigher than 100%</div>
      </div>
      <div id="page-2" class="page">
        <h3>page 2</h3>
        <div class="simulate">Simulated content heigher than 100%</div>
      </div>
      <div id="page-3" class="page">
        <h3>page 3</h3>
        <div class="simulate">Simulated content heigher than 100%</div>
      </div>
    </div>

    0 讨论(0)
  • 2020-11-27 06:48

    "as you scale it needs to stick to the page its on and not reveal the others"

    To achieve this, keep a reference to the current page element and then do a no-delay scrollTo this element when the window is resized:

    var currentPage; //here is where we will hold the reference
    jQuery('a.scrollitem').click(function () {
        var targetPage = $(jQuery(this).attr('href'));
        jQuery('a.scrollitem').removeClass('selected');
        jQuery(this).addClass('selected');
        jQuery('.toggle').css({'display':'none'});
        jQuery('.wrapper').scrollTo(targetPage, 1200, function(){
            jQuery('.toggle').css({'display':'block'});
        });
        currentPage = targetPage; //here is where we set the reference
        return false;
    });
    
    //and here we do a no-delay scrollTo
    $(window).resize(function(){
        if(!!currentPage){
            console.log('window resized.  scrolling to: ', currentPage.attr('id'));
            jQuery('.wrapper').scrollTo(currentPage);
        }
    });
    

    This makes it pretty responsive, in my opinion.

    pages need to be able to be long (800px) and still scrollable, without the gap on the last one.

    To get rid of that gap, I just make all pages a little longer than they need to be. The scrolling is not affected by this since the pages are left-justified with left:0;. I suspect that the other pages had the same gap and and that the gaps on those pages were covered by the scroll bar.

    .page {
        width: 110%;
    }
    

    needs to work on minimum ie9

    I'm afraid I can't help in this regard; I have only IE11 installed. But hey, it works great in IE11.

    Working fiddle

    0 讨论(0)
提交回复
热议问题