javascript - jQuery 链接多个自定义函数来触发多个面板

标签 javascript jquery css

我有多个面板位于屏幕外,具有 translateY 属性。 这些面板具有不同的高度。 它们由这个 ids 标识:

Panels:
  #panel-search // search form
  #panel-login // login form
  #panel-register // registration form
  #panel-navigation // navigation panel

整个可见页面本身是:

#page

并且每个面板都由其自己的链接触发:

Triggers:
  .btn-search // trigger search panel
  .btn-login // trigger login panel
  .btn-register // trigger registration panel
  .btn-nav // trigger navigation (this button shows only on mobile)

我还使用了等于目标面板 ID 的 data-target 属性 oon triggers。

我需要什么:

  1. 单击任何 .btn-* 将触发相应的面板。面板从顶部向下滑动,页面主体同时滑动。实现起来很简单。完成。
  2. 当触发任何面板时,它应该检查是否有任何面板打开(这个或任何其他)。如果是,则触发该面板和页面主体关闭,并且仅在此之后 - 显示新面板(并再次将主体移动到新位置)。那就是我被困的地方。

在@GauravBarar 的建议下,我重写了代码,现在一切正常,除了链接。当有任何打开的面板时 - 我将其关闭(并将页面也移至顶部),然后打开请求的面板。但它同时发生,同时发生。而且我只需要在原始面板关闭后才能打开新面板。尝试添加 setTimeout()(请参阅代码中的注释部分)- #page 在此超时时向上/向下移动就好了,而面板 - 不要。

到目前为止,这是我的代码:

/**
 * Get real height of requested panel and prepare css transform property value.
 */
function getTransformProperty( panel ) {
    panelHeight = $('#'+panel).outerHeight();
    property = 'translateY(' + panelHeight + 'px)';
    return property;
}

/**
 * Move #page down by requested panel's height
 */
function setTransformProperty( property ) {
    $('#page').css({
        '-webkit-transform': property,
        '-moz-transform': property,
        '-ms-transform': property,
        '-o-transform': property,
        'transform': property
    });
    // Go to top (some triggers are in site footer, so we need this)
    window.scrollTo(0, 0);
}

// Trigger panels
$('[class*=trigger-]').click(function(){

    // Get target element to trigger
    var target = $(this).attr('data-target');

    // Check if current target is already opened and close it.
    if( $('#'+target).hasClass('is-visible-top') ) {

        $('#'+target).removeClass( 'is-visible-top' ); // move up requested panel
        setTransformProperty( 'translateY(0)' ); // move up page

        return false; // exit

    }

    // Check all panels in a loop. If any is opened - close it.
    $('[id*=panel-]').each(function(){

        // Get current panel's ID
        curPanelID = $(this).attr('id');

        if( $('#'+curPanelID).hasClass('is-visible-top') && curPanelID !== target ) {

            // A panel is opened.

            // Close it.
            $('#'+curPanelID).removeClass( 'is-visible-top' ); // move up currently open panel
            setTransformProperty( 'translateY(0)' ); // move up page

            // Open requested panel (HERE WE NEED A TIMEOUT)
            $('#'+target).addClass( 'is-visible-top' ); // move down requested panel
            setTransformProperty( getTransformProperty(target) ); // move down page by new height

            /* HERE'S TIMEOUT WHICH I TRIED BUT FAILED.
            setTimeout(function(){
                $('#'+target).addClass( 'is-visible-top' );
                setTransformProperty( getTransformProperty(target) ); 
            },300);
            */

            // exit each loop
            return false;

        } else {

            // No panel is opened. Just open requested without timeout.

            setTransformProperty( getTransformProperty(target) ); // move down page
            $('#'+target).addClass( 'is-visible-top' ); // move down requested panel

        }

    });

});

非常感谢任何帮助。

最佳答案

您可以尝试使用 jQuery 通配符,如下所示:

$('[id*=panel-]').each(function(){
    //check if anyone is on or off
})

关于javascript - jQuery 链接多个自定义函数来触发多个面板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25543159/

相关文章:

javascript - jQuery 从另一个函数收集函数内的数据

javascript - 从数组中删除等于零的尾随元素 - 更好的方法

javascript - Jquery slider 不能自动工作

JavaScript - 如何在文本框的右侧放置星号?

javascript - javascript 排序函数中相等的项目会发生什么

javascript - 使用 jQuery/javascript 循环遍历字符串

javascript - 数据表警告 : table id=table_especie - Requested unknown parameter '0' for row 0, 第 0 列

javascript - 我如何让一个函数找到两个元素?

javascript - 如何在 JavaScript 或 html 中实现与 Google Chrome 的 "Empty Cache and Hard Reload"相同的功能?

css - 透明 .gif 图像不允许背景 CSS 元素显示