代码之家  ›  专栏  ›  技术社区  ›  Mohsin

如何提高卷轴魔法的速度

  •  0
  • Mohsin  · 技术社区  · 6 年前

    嘿,这是Scrollmagic.io的插件,我正在工作中使用它。

    但这是缓慢的。如何增加持续时间我想改变内容更快。

    我看了一些文档,但在文档中不太清楚。

    请帮帮我

    //First the variables our app is going to use need to be declared
    
    //References to DOM elements
    var $window = $(window);
    var $document = $(document);
    //Only links that starts with #
    var $navButtons = $("nav a").filter("[href^=#]");
    var $navGoPrev = $(".go-prev");
    var $navGoNext = $(".go-next");
    var $slidesContainer = $(".slides-container");
    var $slides = $(".slide");
    var $currentSlide = $slides.first();
    
    //Animating flag - is our app animating
    var isAnimating = false;
    
    //The height of the window
    var pageHeight = $window.innerHeight();
    
    //Key codes for up and down arrows on keyboard. We'll be using this to navigate change slides using the keyboard
    var keyCodes = {
        UP  : 38,
        DOWN: 40
    }
    
    //Going to the first slide
    goToSlide($currentSlide);
    
    
    /*
    *   Adding event listeners
    * */
    
    $window.on("resize", onResize).resize();
    $window.on("mousewheel DOMMouseScroll", onMouseWheel);
    $document.on("keydown", onKeyDown);
    $navButtons.on("click", onNavButtonClick);
    $navGoPrev.on("click", goToPrevSlide);
    $navGoNext.on("click", goToNextSlide);
    
    /*
    *   Internal functions
    * */
    
    
    /*
    *   When a button is clicked - first get the button href, and then slide to the container, if there's such a container
    * */
    function onNavButtonClick(event)
    {
        //The clicked button
        var $button = $(this);
    
        //The slide the button points to
        var $slide = $($button.attr("href"));
    
        //If the slide exists, we go to it
        if($slide.length)
        {
            goToSlide($slide);
            event.preventDefault();
        }
    }
    
    /*
    *   Getting the pressed key. Only if it's up or down arrow, we go to prev or next slide and prevent default behaviour
    *   This way, if there's text input, the user is still able to fill it
    * */
    function onKeyDown(event)
    {
    
        var PRESSED_KEY = event.keyCode;
    
        if(PRESSED_KEY == keyCodes.UP)
        {
            goToPrevSlide();
            event.preventDefault();
        }
        else if(PRESSED_KEY == keyCodes.DOWN)
        {
            goToNextSlide();
            event.preventDefault();
        }
    
    }
    
    /*
    *   When user scrolls with the mouse, we have to change slides
    * */
    function onMouseWheel(event)
    {
        //Normalize event wheel delta
        var delta = event.originalEvent.wheelDelta / 30 || -event.originalEvent.detail;
    
        //If the user scrolled up, it goes to previous slide, otherwise - to next slide
        if(delta < -1)
        {
            goToNextSlide();
        }
        else if(delta > 1)
        {
            goToPrevSlide();
        }
    
        event.preventDefault();
    }
    
    /*
    *   If there's a previous slide, slide to it
    * */
    function goToPrevSlide()
    {
        if($currentSlide.prev().length)
        {
            goToSlide($currentSlide.prev());
        }
    }
    
    /*
    *   If there's a next slide, slide to it
    * */
    function goToNextSlide()
    {
        if($currentSlide.next().length)
        {
            goToSlide($currentSlide.next());
        }
    }
    
    /*
    *   Actual transition between slides
    * */
    function goToSlide($slide)
    {
        //If the slides are not changing and there's such a slide
        if(!isAnimating && $slide.length)
        {
            //setting animating flag to true
            isAnimating = true;
            $currentSlide = $slide;
    
            //Sliding to current slide
            TweenLite.to($slidesContainer, 1, {scrollTo: {y: pageHeight * $currentSlide.index() }, onComplete: onSlideChangeEnd, onCompleteScope: this});
    
            //Animating menu items
            TweenLite.to($navButtons.filter(".active"), 0.5, {className: "-=active"});
    
            TweenLite.to($navButtons.filter("[href=#" + $currentSlide.attr("id") + "]"), 0.5, {className: "+=active"});
    
        }
    }
    
    /*
    *   Once the sliding is finished, we need to restore "isAnimating" flag.
    *   You can also do other things in this function, such as changing page title
    * */
    function onSlideChangeEnd()
    {
        isAnimating = false;
    }
    
    /*
    *   When user resize it's browser we need to know the new height, so we can properly align the current slide
    * */
    function onResize(event)
    {
    
        //This will give us the new height of the window
        var newPageHeight = $window.innerHeight();
    
        /*
        *   If the new height is different from the old height ( the browser is resized vertically ), the slides are resized
        * */
        if(pageHeight !== newPageHeight)
        {
            pageHeight = newPageHeight;
    
            //This can be done via CSS only, but fails into some old browsers, so I prefer to set height via JS
            TweenLite.set([$slidesContainer, $slides], {height: pageHeight + "px"});
    
            //The current slide should be always on the top
            TweenLite.set($slidesContainer, {scrollTo: {y: pageHeight * $currentSlide.index() }});
        }
    
    }
    body, div, p {
        margin: 0;
        padding: 0;
    }
    
    body {
        font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
        font-weight: 300;
        letter-spacing: 0.0625em;
    }
    
    a {
        text-decoration: none;
    }
    
    nav {
        position: fixed;
        top: 0;
        left: 0;
        width: 100%;
        z-index: 100;
    }
    
    nav ul {
        list-style: none;
        text-align: center;
        margin-top: 30px;
    }
    
    nav ul li {
        display: inline-block;
        margin-right: 20px;
    }
    
    nav ul li:last-child {
        margin-right: 0;
    }
    
    #back-to-tutorial {
        margin-left: 100px;
    }
    
    nav a {
        position: relative;
        top: 0;
        padding: 10px 20px;
        font-weight: normal;
        font-size: 20px;
        text-align: center;
        border-radius: 4px;
        background-color: #FFFFFF;
        color: #83C78E;
        -webkit-box-shadow: none;
        -moz-box-shadow: none;
        box-shadow: none;
    }
    
    nav a.active {
        top: -4px;
        background-color: #69C773;
        color: #FFFFFF;
        -webkit-box-shadow: 0 4px 0 0 #51a65f;
        -moz-box-shadow: 0 4px 0 0 #51a65f;
        box-shadow: 0 4px 0 0 #51a65f;
    }
    
    .slides-container {
        position: absolute;
        left: 0;
        top: 0;
        width: 100%;
        height: 100%;
        overflow: hidden;
        z-index: 10;
    }
    
    .slide {
        position: relative;
        width: 100%;
        height: 100%;
        overflow: hidden;
    }
    
    .slide .centered {
        width: 60%;
        margin: 200px auto 0;
    }
    
    .slide .centered h1 {
        text-align: center;
    }
    
    .slide .centered p {
        text-align: center;
        margin-top: 20px;
        font-size: 20px;
    }
    
    #slide-1 {
        background-color: #FFFFFF;
    }
    
    #slide-2 {
        background-color: #45959b;
    }
    
    #slide-3 {
        background-color: #778899;
    }
    
    #slide-4 {
        color: #FFFFFF;
        background-color: #291F37;
    }
    
    .go-prev, .go-next {
        cursor: pointer;
        font-weight: bold;
        text-decoration: underline;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <!-- Popper JS -->
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js" type="text/javascript"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.11.6/TweenLite.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.11.6/plugins/CSSPlugin.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.11.6/plugins/ScrollToPlugin.min.js"></script>
        
    <nav>
        <ul>
            <li><a href="#slide-1">Slide 1</a></li>
            <li><a href="#slide-2">Slide 2</a></li>
            <li><a href="#slide-3">Slide 3</a></li>
            <li><a href="#slide-4">Slide 4</a></li>
        </ul>
    </nav>
    
    <div class="slides-container">
        <div class="slide" id="slide-1">
            <div class="centered">
                <h1>Fullscreen slides with GSAP</h1>
                <p>Let's go to the <span class="go-next">next slide</span>.</p>
            </div>
        </div>
        <div class="slide" id="slide-2">
            <div class="centered">
                <h1>It is so easy to navigate through slides</h1>
                <p>You can go back to <span class="go-prev">previous slide</span> or go to the <span class="go-next">next slide</span>.</p>
            </div>
        </div>
        <div class="slide" id="slide-3">
            <div class="centered">
                <h1>Use mouse wheel</h1>
    
                <p>No, really. Try to scroll up and down with the mouse wheel to switch between slides.</p>
            </div>
        </div>
        <div class="slide" id="slide-4">
            <div class="centered">
                <h1>... Or use keyboard arrows</h1>
                <p>You go to previous and next slide, using up and down keyboard arrows.</p>
            </div>
        </div>
    </div>

    这是scroll.io文档的链接 http://scrollmagic.io/docs/ScrollMagic.Scene.html#duration

    如何使用这个我有点困惑请看一下

    1 回复  |  直到 6 年前
        1
  •  2
  •   Nathan Stockton    6 年前

    它实际上是一个TweenLite参数: https://greensock.com/tweenlite

    改变

    TweenLite.to($slidesContainer, 1, {scrollTo: {y: pageHeight * $currentSlide.index() }, onComplete: onSlideChangeEnd, onCompleteScope: this});
    

    以较低的值,例如:

    TweenLite.to($slidesContainer, 0.2, {scrollTo: {y: pageHeight * $currentSlide.index() }, onComplete: onSlideChangeEnd, onCompleteScope: this});