【问题标题】:How to apply a jQuery function to inline CSS如何将 jQuery 函数应用于内联 CSS
【发布时间】:2017-09-20 22:37:06
【问题描述】:

我一直在使用我找到的零碎物品制作一个动画统计圈计数器。圆圈的中心是数字统计数据,当它运行时,我已经成功地从零开始计数。

<div class="single-circle">
  <h6 class="counter stat">50</h6>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 165 165" class="circle-svg">
    <g id="circles" data-name="circles">
      <circle class="back-circle" cx="82.5" cy="82.5" r="75" />
      <circle class="front-circle" cx="82.5" cy="82.5" r="75" style="stroke-dashoffset: -235px;" />
    </g>
  </svg>
</div>

这里是 jQuery:

$('.counter').each(function () {
    var $this = $(this);
    jQuery({ Counter: 0 }).animate({ Counter: $this.text() }, {
        duration: 2000,
        easing: 'swing',
        step: function () {
            $this.text(Math.ceil(this.Counter));
        }
    });
});

我现在想通过定位内联样式选择器“strokedash-offset”将相同的功能应用于“.front-circle”,以便让圆圈与数字计数器一起动画,但我正在努力实现这一目标。

完整的 JS Fiddle 与 SCSS 在这里:https://jsfiddle.net/ch8phcbd/

为了澄清,我想定位和操作内联样式选择器的值,以实现这一点并避免在 jQuery 中放置可变值,因为在最终版本中,该值将被动态拉入视图页面。

感谢任何帮助。

谢谢!

【问题讨论】:

    标签: javascript jquery html css sass


    【解决方案1】:

    https://jsfiddle.net/vvkqmqLm/4/

    计算偏移量然后应用它:

     var r = $circle.attr('r');
     var c = Math.PI*(r*2);
    
     (val < 0) { val = 0;}
     (val > 100) { val = 100;}
    
     pct = ((100-val)/100)*c;
    

    还编辑了css,所以加载动画是顺时针的

    .circle-svg {
      transform: rotate(90deg) scaleX(-1);
    }
    

    如果稍微改写一下,就不需要水平翻转(scaleX(-1)),但你明白了。

    【讨论】:

    • 计数器似乎不一致。在五次尝试中,它在 0、50、29、49 和 17 处停止。
    • 无法重现问题。在 Chrome、Opera 和 Firefox 下工作正常
    • 这似乎在倒退,因为第一个圆圈从 100% 开始并减少到 50%,红色的一半在左边而不是右边。这只是我吗?
    【解决方案2】:

    我所做的是删除 css 过渡,这样它们就不会影响动画,并且每一步都会减少红色圆圈的 stroke-dashoffset。

    $('.counter').each(function () {
        var $this = $(this);
        jQuery({ Counter: 0 }).animate({ Counter: $this.text() }, {
            duration: 2000,
            easing: 'swing',
            step: function () {
                $this.text(Math.ceil(this.Counter));
        var increase = Math.ceil(this.Counter);
        $(".front-circle").css("stroke-dashoffset", "-=2.5");
            }
        });
    });
    

    JsFiddle:https://jsfiddle.net/ch8phcbd/4/

    更新:

    为了更好地控制计数器,我们首先需要确定笔画偏移需要多少像素才能使圆圈变为 100% 红色。 您的情况下的数字是 472,这意味着圆的 1% 是 4.72px。 然后我们需要让它每个数字只增加一次行程偏移量。因为该函数被调用了超过 50 次并且只是对数字进行四舍五入,所以我添加了一个 if 语句来检查中间的数字自上一步以来是否发生了变化,如果是,则在偏移量中添加 1%:

    if(Math.ceil(this.Counter) > $this.text())
          {
            $(".front-circle").css("stroke-dashoffset", "-=" + singlePercent);
          }
    

    如果您更改&lt;h6 class="counter stat"&gt;50&lt;/h6&gt; 中的数字,您可以看到它适用于任何百分比。

    JsFiddle:https://jsfiddle.net/ch8phcbd/10/

    【讨论】:

    • 谢谢,太好了。然而,第一个圆圈前进的数量并不反映中心的数量(50%)。看起来大约有三分之一的路要走。这将如何解决?另外我想针对对象类“.first-circle”的内联样式,而不是在 jQuery 中单独指定数量。这样做的原因是我将这些数据动态地拉入视图页面——在最终版本中,这将被一个变量替换。我将更新原始帖子以更好地澄清这一点。
    • 我没有意识到这是一个百分比。我对答案进行了一些更改,并添加了一个新的 js fiddle。
    猜你喜欢
    • 2015-09-27
    • 2018-10-20
    • 2010-09-10
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 2020-08-24
    • 2013-02-02
    • 1970-01-01
    相关资源
    最近更新 更多