【问题标题】:Recalculate Radius on Window Resize在窗口调整大小时重新计算半径
【发布时间】:2016-01-03 11:45:00
【问题描述】:

这是一个简单的事实。

这是Change variable values on window.resize 的一个人,他解决了窗口调整大小更新问题。

var windowHeight = $(window).height();

$(window).resize(function(){
    windowHeight = $(window).height(); // get new height after change

});

但是当我尝试以这种方式这样做时它不起作用:

radius = Math.round( (($(window).width()) * 0.1302) / Math.tan( Math.PI / itemLength ) );


$(window).resize(function(){
    radius = Math.round( (($(window).width()) * 0.1302) / Math.tan( Math.PI / itemLength ) );
});

计算按预期工作,但它从不刷新调整大小的计算。

你能帮我弄清楚这是为什么吗?

【问题讨论】:

  • 您的代码不完整且不可重现。 itemLength 未定义。此外,您在resize() 函数中设置radius,但不要在任何地方应用它。我们所能做的只是猜测。
  • 你的代码也有问题。我怀疑它甚至是第一次运行。 $(window).width() 不需要 px 参数。默认情况下,它已经在px 中返回窗口的宽度。请查收:api.jquery.com/width
  • 嗨马里奥!正如问题中所说。计算是正确的。所以请不要担心ItemLength。但是,如果您能进一步解释为什么我不在任何地方应用 resize(),我会很高兴?
  • 您的代码无法运行。 $(window).width('px') 返回一个没有数字的对象,因此您的计算是 NaN。如果你说“计算是正确的”也没关系。如果您向我们提供我们无法测试的错误和不完整的代码,我们所能做的就是猜测。请阅读stackoverflow.com/help/mcve
  • 我发布了更多代码。代码最终运行良好。唯一的问题是它只执行一次计算!

标签: javascript jquery math gsap


【解决方案1】:

我认为你的 init() 函数中的这部分代码:

// set container 3d props
TweenMax.set(container, {perspective:600})
TweenMax.set(carousel, {z:-(radius)})

// create carousel item props

for ( var i = 0; i < itemLength; i++ )
{
    var $item = item.eq(i);
    var $block = $item.find('.carouselItemInner');

    TweenMax.set($item, {rotationY:rY * i, z:radius, transformOrigin:"50% 50% " + -radius + "px"});                     
}

也必须在$(window).resize 函数中。否则它不会更新项目和轮播,只会更新变量radius

【讨论】:

  • 不,您真的不需要任何您要求的代码。我不能向你发布那么多代码。我们谈论的是 400 行代码。这是另一个有完全相同问题的人。 stackoverflow.com/questions/17443914/… 但是他的解决方案在我的情况下不起作用。这真是令人困惑。
  • 那你能发送一个链接(如果它不是私人的)到你创建的页面吗?
  • 这是一个小提琴 jsfiddle.net/ac377gt6/1 这不会运行,因为你需要 TweenMax
  • 我重写了我的问题,因为我认为人们误解了我想要做的事情。这当然是我的错。
  • @Nulle 问题是您似乎有一些误解。在$(window).resize(...) 函数中更新radius 后,您需要直接更新您的圈子。在函数范围之外,radius 变量不可用,因此不会被此事件更改。
【解决方案2】:

结果证明解决方案涉及的内容超出了我的预期。正是马里奥·沃纳(Mario Werner)的一句话最终使我找到了解决方案。经过几个小时的燃烧和迹象表明我本身就是愚蠢的。马里奥终于给出了我需要的线索。他说; “在函数范围之外,半径变量不可用,因此不会被此事件更改。”

这让我意识到了问题并继续这样做:

$(window).resize(function(){
$(document).ready( init )

function init()
{
    w = $(window);
    container = $( '#contentContainer' );
    carousel = $( '#carouselContainer' );
    item = $( '.carouselItem' );
    itemLength = $( '.carouselItem' ).length;
    fps = $('#fps');
    rY = 360 / itemLength;
    radius = Math.round( (($(window).width()) * 0.1302) / Math.tan( Math.PI / itemLength ) );


    // set container 3d props
    TweenMax.set(container, {perspective:600})
    TweenMax.set(carousel, {z:-(radius)})

    // create carousel item props

    for ( var i = 0; i < itemLength; i++ )
    {
        var $item = item.eq(i);
        var $block = $item.find('.carouselItemInner');

TweenMax.set($item, {rotationY:rY * i, z:radius, transformOrigin:"50% 50% " + -radius + "px"});

        animateIn( $item, $block )                      
    }

    // set mouse x and y props and looper ticker
    window.addEventListener( "mousemove", onMouseMove, false );
    ticker = setInterval( looper, 1000/60 );            
}
});

我只是将 resize 事件放在了 init 函数之外,然后将完全相同的 init 函数复制粘贴到了 resize 事件中。这行得通!

谢谢马里奥!

【讨论】:

  • 没问题,伙计。 :) Internet 通信有时可能很“粗糙”,因为您只有文本,因此误解是一个常见问题。但是您应该诚实地感谢@paulol,因为他首先指出您需要在重新计算后更新radius 变量。
猜你喜欢
  • 2021-07-22
  • 2013-02-19
  • 2012-12-22
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 2013-01-24
  • 2023-03-04
  • 1970-01-01
相关资源
最近更新 更多