仅在页面向下滚动

时间:2016-03-27 13:10:02

标签: jquery

我正在尝试实现一个进度条,当用户在页面上向下滚动时,该进度条会递增。当用户向上和向下滚动时,进度条正在跟踪。当用户向上滚动时,进度条会递减。我可以通过任何方式让它仅在页面向下滚动时跟踪进度吗?

JS

(function(){
    var $w = $(window);
    var $circ = $('.animated-circle');
    var $progCount = $('.progress-count');

    var wh, h, sHeight;

    function setSizes(){
        wh = $w.height();
        h = $('body').height();
        sHeight = h - wh;
    }

    setSizes();

    $w.on('scroll', function(){
        var perc = Math.max(0, Math.min(1, $w.scrollTop()/sHeight));
        updateProgress(perc);
    }).on('resize', function(){
        setSizes();
        $w.trigger('scroll');
    });


    function updateProgress(perc){
        var circle_offset = 126 * perc;
        $circ.css({
            "stroke-dashoffset" : 126 - circle_offset
        });
        $progCount.html(Math.round(perc * 100) + "%");

    }

}());

这是fiddle。感谢您的任何见解。

3 个答案:

答案 0 :(得分:2)

我更新了你的小提琴,并使用一个变量来跟踪用户滚动的距离!试试看! https://jsfiddle.net/b8y5wb8q/2/

var reachedPercent = 0; // initial value
...
if(perc > reachedPercent) {
    reachedPercent = perc;
    updateProgress(perc);
}

答案 1 :(得分:1)

您可以存储达到的最大值,并确保在设置滚动值时,不要将其设置为低于该值。

更新以下内容可以执行此操作:

$w.on('scroll', function(){
    var perc = Math.max(0, Math.min(1, $w.scrollTop()/sHeight));

    if ($('progCount').data('max') < perc) {
        updateProgress(perc);
        $('progCount').data('max', perc);
    }

    ...
}

答案 2 :(得分:1)

这是我的逻辑 -

  1. 检测向下滚动
  2. 如果滚动停止,则只调用updateProgress()函数。
  3. &#13;
    &#13;
    (function() {
      var $w = $(window);
      var $circ = $('.animated-circle');
      var $progCount = $('.progress-count');
    
      var wh, h, sHeight;
    
      function setSizes() {
        wh = $w.height();
        h = $('body').height();
        sHeight = h - wh;
      }
    
      setSizes();
    
      $w.on('scroll', function() {
        var _top = $(window).scrollTop();
        $(window).scroll(function() {
          var _cur_top = $(window).scrollTop();
          if (_top < _cur_top) {
            _direction = 'down';
            var perc = Math.max(0, Math.min(1, $w.scrollTop() / sHeight));
            updateProgress(perc);
            console.log(perc.toFixed(2) * 100);
          }
          _top = _cur_top;
    
        });
      }).on('resize', function() {
        setSizes();
        $w.trigger('scroll');
      });
    
    
      function updateProgress(perc) {
        var circle_offset = 126 * perc;
        $circ.css({
          "stroke-dashoffset": 126 - circle_offset
        });
        $progCount.html(Math.round(perc * 100) + "%");
    
      }
    
    }());
    &#13;
    /*! normalize.css v3.0.1 | MIT License | git.io/normalize */
    
    
    /**
     * 1. Set default font family to sans-serif.
     * 2. Prevent iOS text size adjust after orientation change, without disabling
     *    user zoom.
     */
    
    html {
      font-family: sans-serif;
      /* 1 */
      -ms-text-size-adjust: 100%;
      /* 2 */
      -webkit-text-size-adjust: 100%;
      /* 2 */
    }
    
    
    /**
     * Remove default margin.
     */
    
    body {
      margin: 0;
    }
    
    
    /* HTML5 display definitions
       ========================================================================== */
    
    
    /**
     * Correct `block` display not defined for any HTML5 element in IE 8/9.
     * Correct `block` display not defined for `details` or `summary` in IE 10/11 and Firefox.
     * Correct `block` display not defined for `main` in IE 11.
     */
    
    main display: block;
    
    }
    
    /**
     * 1. Correct `inline-block` display not defined in IE 8/9.
     * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
     */
    audio,
    canvas,
    progress,
    video {
      display: inline-block;
      /* 1 */
      
      vertical-align: baseline;
      /* 2 */
    }
    
    /**
     * Prevent modern browsers from displaying `audio` without controls.
     * Remove excess height in iOS 5 devices.
     */
    audio:not([controls]) {
      display: none;
      height: 0;
    }
    
    /**
     * Address `[hidden]` styling not present in IE 8/9/10.
     * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
     */
    [hidden],
    template {
      display: none;
    }
    
    /* Links
       ========================================================================== */
    
    /**
     * Remove the gray background color from active links in IE 10.
     */
    a {
      background: transparent;
    }
    
    /**
     * Improve readability when focused and also mouse hovered in all browsers.
     */
    a:active,
    a:hover {
      outline: 0;
    }
    
    /* Text-level semantics
       ========================================================================== */
    
    /**
     * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
     */
    abbr[title] {
      border-bottom: 1px dotted;
    }
    
    /**
     * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
     */
    b,
    strong {
      font-weight: bold;
    }
    
    /**
     * Address styling not present in Safari and Chrome.
     */
    dfn {
      font-style: italic;
    }
    
    /**
     * Address variable `h1` font-size and margin within `section` and `article`
     * contexts in Firefox 4+, Safari, and Chrome.
     */
    h1 {
      font-size: 2em;
      margin: 0.67em 0;
    }
    
    /**
     * Address styling not present in IE 8/9.
     */
    mark {
      background: #ff0;
      color: #000;
    }
    
    /**
     * Address inconsistent and variable font size in all browsers.
     */
    small {
      font-size: 80%;
    }
    
    /**
     * Prevent `sub` and `sup` affecting `line-height` in all browsers.
     */
    sub,
    sup {
      font-size: 75%;
      line-height: 0;
      position: relative;
      vertical-align: baseline;
    }
    sup {
      top: -0.5em;
    }
    sub {
      bottom: -0.25em;
    }
    
    /* Embedded content
       ========================================================================== */
    
    /**
     * Remove border when inside `a` element in IE 8/9/10.
     */
    img {
      border: 0;
    }
    
    /**
     * Correct overflow not hidden in IE 9/10/11.
     */
    svg:not(:root) {
      overflow: hidden;
    }
    
    /* Grouping content
       ========================================================================== */
    
    /**
     * Address margin not present in IE 8/9 and Safari.
     */
    figure {
      margin: 1em 40px;
    }
    
    /**
     * Address differences between Firefox and other browsers.
     */
    hr {
      -moz-box-sizing: content-box;
      box-sizing: content-box;
      height: 0;
    }
    
    /**
     * Contain overflow in all browsers.
     */
    pre {
      overflow: auto;
    }
    
    /**
     * Address odd `em`-unit font size rendering in all browsers.
     */
    code,
    kbd,
    pre,
    samp {
      font-family: monospace, monospace;
      font-size: 1em;
    }
    
    /* Forms
       ========================================================================== */
    
    /**
     * Known limitation: by default, Chrome and Safari on OS X allow very limited
     * styling of `select`, unless a `border` property is set.
     */
    
    /**
     * 1. Correct color not being inherited.
     *    Known issue: affects color of disabled elements.
     * 2. Correct font properties not being inherited.
     * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
     */
    button,
    input,
    optgroup,
    select,
    textarea {
      color: inherit;
      /* 1 */
      
      font: inherit;
      /* 2 */
      
      margin: 0;
      /* 3 */
    }
    
    /**
     * Address `overflow` set to `hidden` in IE 8/9/10/11.
     */
    button {
      overflow: visible;
    }
    
    /**
     * Address inconsistent `text-transform` inheritance for `button` and `select`.
     * All other form control elements do not inherit `text-transform` values.
     * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
     * Correct `select` style inheritance in Firefox.
     */
    button,
    select {
      text-transform: none;
    }
    
    /**
     * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
     *    and `video` controls.
     * 2. Correct inability to style clickable `input` types in iOS.
     * 3. Improve usability and consistency of cursor style between image-type
     *    `input` and others.
     */
    button,
    html input[type="button"],
    
    /* 1 */
    input[type="reset"],
    input[type="submit"] {
      -webkit-appearance: button;
      /* 2 */
      
      cursor: pointer;
      /* 3 */
    }
    
    /**
     * Re-set default cursor for disabled elements.
     */
    button[disabled],
    html input[disabled] {
      cursor: default;
    }
    
    /**
     * Remove inner padding and border in Firefox 4+.
     */
    button::-moz-focus-inner,
    input::-moz-focus-inner {
      border: 0;
      padding: 0;
    }
    
    /**
     * Address Firefox 4+ setting `line-height` on `input` using `!important` in
     * the UA stylesheet.
     */
    input {
      line-height: normal;
    }
    
    /**
     * It's recommended that you don't attempt to style these elements.
     * Firefox's implementation doesn't respect box-sizing, padding, or width.
     *
     * 1. Address box sizing set to `content-box` in IE 8/9/10.
     * 2. Remove excess padding in IE 8/9/10.
     */
    input[type="checkbox"],
    input[type="radio"] {
      box-sizing: border-box;
      /* 1 */
      
      padding: 0;
      /* 2 */
    }
    
    /**
     * Fix the cursor style for Chrome's increment/decrement buttons. For certain
     * `font-size` values of the `input`, it causes the cursor style of the
     * decrement button to change from `default` to `text`.
     */
    input[type="number"]::-webkit-inner-spin-button,
    input[type="number"]::-webkit-outer-spin-button {
      height: auto;
    }
    
    /**
     * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
     * 2. Address `box-sizing` set to `border-box` in Safari and Chrome
     *    (include `-moz` to future-proof).
     */
    input[type="search"] {
      -webkit-appearance: textfield;
      /* 1 */
      
      -moz-box-sizing: content-box;
      -webkit-box-sizing: content-box;
      /* 2 */
      
      box-sizing: content-box;
    }
    
    /**
     * Remove inner padding and search cancel button in Safari and Chrome on OS X.
     * Safari (but not Chrome) clips the cancel button when the search input has
     * padding (and `textfield` appearance).
     */
    input[type="search"]::-webkit-search-cancel-button,
    input[type="search"]::-webkit-search-decoration {
      -webkit-appearance: none;
    }
    
    /**
     * Define consistent border, margin, and padding.
     */
    fieldset {
      border: 1px solid #c0c0c0;
      margin: 0 2px;
      padding: 0.35em 0.625em 0.75em;
    }
    
    /**
     * 1. Correct `color` not being inherited in IE 8/9/10/11.
     * 2. Remove padding so people aren't caught out if they zero out fieldsets.
     */
    legend {
      border: 0;
      /* 1 */
      
      padding: 0;
      /* 2 */
    }
    
    /**
     * Remove default vertical scrollbar in IE 8/9/10/11.
     */
    textarea {
      overflow: auto;
    }
    
    /**
     * Don't inherit the `font-weight` (applied by a rule above).
     * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
     */
    optgroup {
      font-weight: bold;
    }
    
    /* Tables
       ========================================================================== */
    
    /**
     * Remove most spacing between table cells.
     */
    table {
      border-collapse: collapse;
      border-spacing: 0;
    }
    td,
    th {
      padding: 0;
    }
    @import url(http://fonts.googleapis.com/css?family=Domine:400,700);
    body {
      font-size: 16px;
    }
    h1,
    h2,
    h3,
    h4,
    h5,
    h6 {
      font-family: "Domine", sans-serif;
    }
    h1 {
      font-size: 3.5em;
    }
    .lead-in {
      color: #fff;
      font-weight: 400;
      padding: 60px 0;
      background-color: #462066;
    }
    article header {
      border-top: 3px solid #777;
      padding: 80px 0;
    }
    .article-content {
      font-size: 1em;
      font-weight: 100;
      line-height: 2.4em;
    }
    p {
      margin: 4em 0;
    }
    .container {
      width: 700px;
      margin: 0 auto;
    }
    footer {
      text-align: center;
      background-color: #666;
      color: #fff;
      padding: 40px 0;
      margin-top: 60px;
    }
    .read-next {
      font-size: 2em;
    }
    .progress-indicator {
      position: fixed;
      top: 30px;
      right: 30px;
      width: 100px;
      height: 100px;
    }
    .progress-count {
      position: absolute;
      top: 1px;
      left: 2px;
      width: 100%;
      height: 100%;
      text-align: center;
      line-height: 100px;
      color: #462066;
    }
    svg {
      position: absolute;
    }
    circle {
      fill: rgba(255, 255, 255, 0.9);
    }
    svg .animated-circle {
      fill: transparent;
      stroke-width: 40px;
      stroke: #462066;
      stroke-dasharray: 126;
      stroke-dashoffset: 126;
    }
    .progress-indicator-2 {
      position: fixed;
      top: 0;
      left: 0;
      height: 3px;
      background-color: #462066;
    }
    &#13;
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <title>Progress Indicator Animation</title>
    
    <div class="progress-indicator">
      <svg>
        <g>
          <circle cx="0" cy="0" r="20" stroke="black" class="animated-circle" transform="translate(50,50) rotate(-90)" />
        </g>
        <g>
          <circle cx="0" cy="0" r="38" transform="translate(50,50) rotate(-90)" />
        </g>
      </svg>
      <div class="progress-count"></div>
    </div>
    <main>
    
    
      <p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est.
        Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus
        lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor,
        facilisis luctus, metus</p>
      <p>Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up
        one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum
        et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section
        1.10.32.
      </p>
      <p>There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable. If you are going to use a passage of Lorem Ipsum,
        you need to be sure there isn't anything embarrassing hidden in the middle of text. All the Lorem Ipsum generators on the Internet tend to repeat predefined chunks as necessary, making this the first true generator on the Internet. It uses a dictionary
        of over 200 Latin words, combined with a handful of model sentence structures, to generate Lorem Ipsum which looks reasonable. The generated Lorem Ipsum is therefore always free from repetition, injected humour, or non-characteristic words etc.</p>
      <p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est.
        Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus
        lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor,
        facilisis luctus, metus</p>
      <p>Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up
        one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum
        et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section
        1.10.32.
      </p>
      <p>There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable. If you are going to use a passage of Lorem Ipsum,
        you need to be sure there isn't anything embarrassing hidden in the middle of text. All the Lorem Ipsum generators on the Internet tend to repeat predefined chunks as necessary, making this the first true generator on the Internet. It uses a dictionary
        of over 200 Latin words, combined with a handful of model sentence structures, to generate Lorem Ipsum which looks reasonable. The generated Lorem Ipsum is therefore always free from repetition, injected humour, or non-characteristic words etc.</p>
    
    </main>
    &#13;
    &#13;
    &#13;

相关问题