【问题标题】:jquery tools overlay, how to keep mask when switching overlaysjquery工具覆盖,切换覆盖时如何保持掩码
【发布时间】:2011-06-10 09:37:18
【问题描述】:

我有 2 个叠加层的简单问题。一个叠加层由另一个叠加层触发(并由另一个叠加层触发)。由于任何时候只有一个叠加层可以处于活动状态,因此正确地,触发 2 的叠加层号 1 关闭。但是,它带有掩码,因此覆盖 2 出现时没有掩码。如何在不消失的情况下在 2 个叠加层之间切换?

代码,覆盖 1

$("button[rel*=busy]").overlay({     

    api: true , 
    mask: {
        maskId: 'defaultMask' ,
        color: null
    },
    effect: 'apple',

    onLoad: function() {

        $.post( 'ajax_file_here.php' ,
            { var: something } ,
            function( data ){                

                if( data.status == 'confirm' ) {

                    confirmOverlay();

                } else {

                    errorOverlay();

                }              

            } ,
            'json' );

    } ,
    closeOnClick: false ,
    closeOnEsc: false ,
    close: '.noClose'       

});

和覆盖2

var errOverlayObject = $('#error_overlay').overlay({

    api: true,      
    mask: {
        maskId: 'defaultMask' ,
        color: null
    },
    effect: "apple"

});

function errorOverlay() {

    errOverlayObject.load();

}

如您所见,还有第二个叠加层的确认版本,但与错误版本相同。

【问题讨论】:

    标签: javascript jquery overlay jquery-tools


    【解决方案1】:

    我认为更简单的方法是

    .overlay({
       mask: { color: '#000', opacity: '.60' },
       onLoad: function(){
           var t = $.mask;
           if(!t.isLoaded()){
                t.load();
                var ov = this.getOverlay();
                ov.css('z-index', '9999');
           }
       }
    });
    

    【讨论】:

      【解决方案2】:

      我希望您不介意,但我创建了自己的简化示例。希望您能够根据自己的情况进行调整。

      对话框之间有一点闪烁(由于动画效果),但遮罩保持在原位。我想您可以通过调整动画效果设置来消除闪烁 - 我怀疑您可以在叠加层的 onBeforeLoad 方法中执行某些操作,但我不确定是什么。

      <!DOCTYPE html>
      <html>
      <head>
          <title>Chained Modals</title>
          <script src="http://cdn.jquerytools.org/1.2.5/full/jquery.tools.min.js"></script>
          <style>
          .modal {
              background-color:#fff;
              display:none;
              width:350px;
              padding:15px;
              text-align:left;
              border:2px solid #333;
      
              opacity:0.8;
              -moz-border-radius:6px;
              -webkit-border-radius:6px;
              -moz-box-shadow: 0 0 50px #ccc;
              -webkit-box-shadow: 0 0 50px #ccc;
          }
          </style>
      </head>
      <body>
      <p>
          <button class="modalInput" rel="#box1">Stage 1</button>
      </p>
      <div class="modal" id="box1">
          <h2>Stage 1 dialogue</h2>
          <p>
              You can only interact with elements that are inside this dialog.
              To close it click a button or use the ESC key.
          </p>
          <button class="modalInput" rel="#box2">Stage 2</button>
      </div>
      <div class="modal" id="box2">
          <h2>Stage 2 dialogue</h2>
          <p>
              You can only interact with elements that are inside this dialog.
              To close it click a button or use the ESC key.
          </p>
          <button class="modalInput" rel="#box3">Stage 3</button>
      </div>
      <div class="modal" id="box3">
          <h2>Stage 3 dialogue</h2>
          <p>
              You can only interact with elements that are inside this dialog.
              To close it click a button or use the ESC key.
          </p>
          <button class="close">End</button>
      </div>
      <script>
      
      $(window).load(function() {
      var msk;
      
      var triggers = $(".modalInput").overlay({
          mask: {
              color: '#ebecff',
              loadSpeed: 200,
              opacity: 0.9,
              onClose: function() {
                  var id = this.getExposed().attr('id');
                  if(id == 'box1'|| id == 'box2'){
                     var nextId;
                     if(id == 'box1'){
                        nextId = '#box2';
                     }
                     if(id == 'box2'){
                        nextId = '#box3';
                     }
                     msk = this.getMask();
                     msk.css('display','block');
                     $(nextId).css('z-index', '9999');
                  }
              }
          },
          closeOnClick: false,
          onBeforeLoad: function(){
              var id = this.getOverlay().attr('id');
              if(id == 'box2'|| id == 'box3'){
                     // need to put something here to avoid flicker
                     //
                 // this.getConf().mask.startOpacity = 0.8; 
              }
          }
      });
      
      });
      </script>
      </body>
      </html>
      

      我希望这会有所帮助。

      【讨论】:

      • 确实如此。而且我不介意闪烁,因为它突出了一个值得你注意的事情正在发生的事实。我确实简化了 onClose 一点出价,操纵掩码,因此不需要代码的 id 部分,使用 msk.css( { 'display' : 'block' , 'z-index' : '1000' } );我的代码中需要的另一个重要的小变化是 onclose,它关闭了覆盖触发器中的掩码,用于辅助覆盖(错误和确认)。但现在一切正常,谢谢一百万!
      【解决方案3】:

      您可以将“closeSpeed: 0”添加到第一个叠加层的掩码配置中,它将起作用。 例如:

          $('#login_overlay').overlay({
              top:'center',
              mask: {
                  color: '#666',
                  closeSpeed: 0,
                  opacity: 0.5
              }
          });
      

      【讨论】:

        【解决方案4】:

        另一种方法是单独处理遮罩:在没有遮罩的情况下创建叠加层,并且单独激活遮罩。

        您的第一个叠加层需要进行如下设置:

        $(selector).overlay({ 
            ..., 
            onBeforeLoad: function(){
                               $(document).mask('#222'); 
                               closeMask=true;
                          },
            onClose: function(){
                               if (closeMask) $.mask.close();
                          }
        );
        

        然后,为了显示第二个叠加层,您将 closeMask 变量设置为 false。显然,第二个叠加层必须在关闭时隐藏遮罩。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多