jQuery Dialog - 动画对话框从中心移动到右上角

Posted

技术标签:

【中文标题】jQuery Dialog - 动画对话框从中心移动到右上角【英文标题】:jQuery Dialog - animate dialog to move from center to top-right 【发布时间】:2011-08-02 17:51:01 【问题描述】:

我有一个带有验证插件设置的表单。当表单提交并出现错误时,我会在对话框(非模式)中显示错误字段。

表单可以很快变得非常长(业务需求不断添加字段),我将对话框中的错误字段设置为可单击以将窗口滚动到 from 中的字段并突出显示这些字段。此时不会关闭对话框。

这个对话框是居中开始的,一旦用户开始点击链接,我需要将对话框移到用户的位置,并突出显示(jQuery 效果)下面的字段。

为此,我提出了以下代码,并且对话框似乎动画到顶部而不是右侧。当我将“右”更改为“左”时,它工作正常。

下面是代码和一个可以玩的 jsbin - http://jsbin.com/avigi3/4/

$('a.field').click(function()
    $(this).closest('.ui-dialog').animate( 
        right : '0', /*left:'0' works fine here*/
        top : $(window).scrollTop()
    , 'slow');
);

我调试了 jQuery.animate 代码,这是我的笔记:

    jQuery.animate() 以属性的当前值“开始”并逐渐动画到传入的目标值。例如:在调用中,top 从对话框的当前顶部值开始,并减少到窗口的滚动顶部(浏览器视口的可见顶部)。 现在,问题就在这里。即使对话框是居中对齐的,它的 'right' 属性也不存在,因为 jQuery-ui 使用 'left' 属性来居中(绝对定位)对话框。而且由于“正确”不存在,“正确”的动画序列似乎不起作用。

有人遇到过这个问题吗?有什么办法可以重置对话框的“正确”位置,使其具有“某些”价值?或者我可以配置 jQuery 对话框,以便它在以编程方式更改位置而不是通过拖动手动更改时动画。

谢谢, -赛姆

【问题讨论】:

【参考方案1】:

试试这个

$('a.field').click(function()
    dialog = $(this).closest('.ui-dialog')
    dialog.animate( 
        left: document.width - dialog.width(), // or you might want to use .outerWidth()
        top: $(window).scrollTop()
    , 'slow');
);

【讨论】:

【参考方案2】:

对于未来的读者来说,Shrikant 的回答将是一个更快的解决方案,并且针对通话,并且效果很好。只需更改宽度以使用 offsetWidth() 来考虑填充/边距。

我最终完成了 jQuery UI 代码,并找到了一个通用实现。这适用于 jquery-ui 1.8.10。

一旦通过计算 left:xxx, top:xxx 确定对话框的移动位置,jQuery-dialog 就会使用Position 实用程序来定位和重新定位 ui-dialog div。 Position 的选项之一是“使用”功能。如果定义了“使用”,它会触发该函数并传入 left:xxx, top:xxx 的对象。如果没有定义,它只会更新 ui-dialog 上的 css。这是代码的sn-p:

line number 9977 in jquery-ui version 1.8.10:
            if ( 'using' in options ) 
                options.using.call( elem, props );
             else 
                curElem.css( props );
            

您可以覆盖 Position 默认值上的 'using' 属性,但由于我仅用于对话框,因此我在对话框原型上覆盖了它:

$.extend($.ui.dialog.prototype.options, 
    position : 
        using : function(props) 
            $(this).animate( 
                left : props.left,
                top : props.top
            , 'slow');
        
    
);

我希望这会有所帮助!

谢谢, -赛姆

【讨论】:

这个答案非常有用 - 感谢您提出。但是,将 props 参数直接传递给 .animate 会更简洁,这样您就不会重复自己: $(this).animate(props);再次感谢! 它改变了全局行为,在实践中不太适用。看看这个,***.com/questions/6849352/…

以上是关于jQuery Dialog - 动画对话框从中心移动到右上角的主要内容,如果未能解决你的问题,请参考以下文章

jquery-ui-dialog - 如何挂钩对话框关闭事件

jquery中的dialog怎么设置每天只弹出1次??

jquery-ui-dialog - 如何挂钩到对话框关闭事件

给对话框添加动画 Dialog

“jquery dialog”对话框的关闭事件都有哪些?

“jquery dialog”对话框的关闭事件都有哪些?