【问题标题】:Animate a div when we scroll to a specific position当我们滚动到特定位置时为 div 设置动画
【发布时间】:2021-08-24 07:23:37
【问题描述】:

当从页面顶部滚动到scrolling div 高度的-600 时(这意味着在到达scrolling div 的底部之前),我有一个函数可以将slider-side-hr 的宽度减小到0。
滑块两侧都是固定的,一个在右边,另一个在左边。

  <div class="tower" id="tower2">
      <div class="scroll-slider-hr">
          <div class="slider-side-hr slider-side1"></div>
          <div class="slider-side-hr slider-side2"></div>
      </div>
  </div>

它工作得很好,滚动时slider-side-hr 的宽度都减小到 0,但是当页面顶部的scrolling div NOT 时我遇到了问题。

我需要一个仅在 (scrolling div) 到达页面底部 + 100px 时执行函数的条件,这意味着我可以首先看到 slider-side-hr 全宽(带有 @ 100px100px height) 然后在滚动时开始减少到0,当达到scrolling div的一半时它应该减少到0

var $scrollingDiv = $("#tower2");
$(window).scroll(function() {

    var winScrollTop = ($(document).scrollTop() + 0);
    var zeroSizeHeight = $scrollingDiv.height() - 600;
    var newSize = 250 * (1 - (winScrollTop / zeroSizeHeight));
    
        $('.slider-side-hr').css({
            width: newSize,
        }, 500, 'easeInOutSine');
});
.container-full {
    width: 100%;
    margin-right: auto;
    margin-left: auto;
}

.tower {
    position: relative;
}

#tower1 {
    /*margin-bottom: 700px*/
}

#tower2 {
    background-image: linear-gradient(rgba(0, 0, 0, 0.5),rgba(0, 0, 0, 0.5));
    background-position: center;
    background-size: cover;
    background-repeat: no-repeat;
    height: 140vh;
    background-attachment: fixed;
    position: relative;
    overflow: hidden;

}

.slider-side-hr {
    position: absolute;
    top: 0;
    bottom: 0;
    width: 250px;
    height: 100%;
    background: #ddd;
}

.slider-side1 {
    left: 0;
}
.slider-side2 {
    right: 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

<dic class="container-full">
  <div class="tower" id="tower1">
  </div> 

  <div class="tower" id="tower2">
      <div class="scroll-slider-hr">
          <div class="slider-side-hr slider-side1"></div>
          <div class="slider-side-hr slider-side2"></div>
      </div>
  </div>
</div>

【问题讨论】:

    标签: javascript html jquery css


    【解决方案1】:

    这段代码的工作原理:

    JS

    #tower2 顶部获取有关位置的信息并将其分配给变量ftop

    我们从ftop 中减去滚动值。当该值小于 0 时,开始向.slider-side-hr 传输新值。

    .slider-side-hr的宽度初始值设置为#tower2宽度的50%

    如果你想改变“动画”速度……改变这一行:

    var newSize = zeroSizeWidth + scl; 给这个var newSize = zeroSizeWidth + scl * 2;

    (如果您希望动画响应桌面和移动设备,您可以将值 * 2 设置为屏幕宽度的百分比)

    CSS

    所做的更改属于 .slider-side-hr 类,值 width: 100%;

    希望对你有所帮助

    var $scrollingDiv = $("#tower2");
    var ftop = $scrollingDiv.offset().top;
    var zeroSizeHeight = $scrollingDiv.height();
    var zeroSizeWidth = $scrollingDiv.width() / 2;
    
    $(window).scroll(function () {
        var winScrollTop = $(window).scrollTop();
        var scl = ftop - winScrollTop;
    
        if (scl < 0) {
            var newSize = zeroSizeWidth + scl * 2;
        } else {
            var newSize = zeroSizeWidth;
        }
    
        $('.slider-side-hr').css({
            width: newSize,
        }, 500, 'easeInOutSine');
    
    });
    .container-full {
        width: 100%;
        margin-right: auto;
        margin-left: auto;
    }
    
    .tower {
        position: relative;
    }
    
    #tower1 {
        /*margin-bottom: 700px*/
    }
    
    #tower2 {
        background-image: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5));
        background-position: center;
        background-size: cover;
        background-repeat: no-repeat;
        height: 140vh;
        background-attachment: fixed;
        position: relative;
        overflow: hidden;
    
    }
    
    .slider-side-hr {
        position: absolute;
        top: 0;
        bottom: 0;
        width: 100%;
        height: 100%;
        background: #ddd;
    }
    
    .slider-side1 {
        left: 0;
    }
    
    .slider-side2 {
        right: 0;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    
    <div class="container-full">
        <div class="tower" id="tower1">
            Lorem, ipsum dolor sit amet consectetur adipisicing elit. Consequatur ipsam fuga amet quaerat possimus qui
            impedit iure id. Accusantium expedita architecto doloribus ratione veniam itaque in iure assumenda ab?
            Obcaecati! Lorem, ipsum dolor sit amet consectetur adipisicing elit. Consequatur ipsam fuga amet quaerat
            possimus qui impedit iure id. Accusantium expedita architecto doloribus ratione veniam itaque in iure
            assumenda ab? Obcaecati! Lorem, ipsum dolor sit amet consectetur adipisicing elit. Consequatur ipsam fuga
            amet quaerat possimus qui impedit iure id. Accusantium expedita architecto doloribus ratione veniam itaque
            in iure assumenda ab? Obcaecati! Lorem, ipsum dolor sit amet consectetur adipisicing elit. Consequatur ipsam
            fuga amet quaerat possimus qui impedit iure id. Accusantium expedita architecto doloribus ratione veniam
            itaque in iure assumenda ab? Obcaecati! Lorem, ipsum dolor sit amet consectetur adipisicing elit.
            Consequatur ipsam fuga amet quaerat possimus qui impedit iure id. Accusantium expedita architecto doloribus
            ratione veniam itaque in iure assumenda ab? Obcaecati! Lorem, ipsum dolor sit amet consectetur adipisicing
            elit. Consequatur ipsam fuga amet quaerat possimus qui impedit iure id. Accusantium expedita architecto
            doloribus ratione veniam itaque in iure assumenda ab? Obcaecati! Lorem, ipsum dolor sit amet consectetur
            adipisicing elit. Consequatur ipsam fuga amet quaerat possimus qui impedit iure id. Accusantium expedita
            architecto doloribus ratione veniam itaque in iure assumenda ab? Obcaecati! Lorem, ipsum dolor sit amet
            consectetur adipisicing elit. Consequatur ipsam fuga amet quaerat possimus qui impedit iure id. Accusantium
            expedita architecto doloribus ratione veniam itaque in iure assumenda ab? Obcaecati! Lorem, ipsum dolor sit.
        </div>
    
        <div class="tower" id="tower2">
            <div class="scroll-slider-hr">
                <div class="slider-side-hr slider-side1"></div>
                <div class="slider-side-hr slider-side2"></div>
            </div>
        </div>
    </div>

    【讨论】:

    • 非常感谢!没错,改动很少:var ftop = $scrollingDiv.offset().top - (window.screen.height / 2); + var zeroSizeWidth = 250; + width: zeroSizeWidth + "px",
    • 很高兴能帮到你:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 2018-12-02
    • 1970-01-01
    相关资源
    最近更新 更多