2016-11-23 79 views
0

正在嘗試做什麼是當用戶單擊「.inner」元素時,它會找到其中的模式窗口並刪除「slideOutLeft」類(如果有),然後添加「slideInLeft」類並淡入覆蓋元素。 這工作正常打開和關閉模式窗口無法正常工作

但是什麼工作是當您單擊.closeBtn元素它不會刪除「slideInLeft」,然後添加「slideOutLeft」類。但是當你點擊黑色覆蓋後面的模式窗口確實功能正常。

我明顯失去了一些東西,但我無法弄清楚。

Here is a fiddle with all my code

$(document).ready(function() { 
 

 
    $('.inner').click(function() { 
 
    $(this).find('.modalWindow').removeClass('slideOutLeft').addClass('slideInLeft').css('display', 'block'); 
 
    $('.overlay').fadeToggle(500); 
 
    }); 
 

 
    $('.closeBtn, .overlay').click(function() { 
 
    $('.modalWindow').removeClass('slideInLeft').addClass('slideOutLeft'); 
 
    $('.overlay').fadeToggle(500); 
 
    }); 
 

 
});
*, 
 
*:before, 
 
*:after { 
 
    -webkit-box-sizing: border-box; 
 
    -moz-box-sizing: border-box; 
 
    box-sizing: border-box; 
 
} 
 
.wrapper { 
 
    width: 50%; 
 
    float: left; 
 
    text-align: center; 
 
    padding: 20px; 
 
} 
 
.modalBtn { 
 
    padding: 15px 30px; 
 
    border: 1px solid #333; 
 
    border-radius: 5px; 
 
    text-transform: uppercase; 
 
} 
 
.overlay { 
 
    width: 100%; 
 
    height: 100%; 
 
    background-color: rgba(0, 0, 0, 0.3); 
 
    position: fixed; 
 
    top: 0; 
 
    left: 0; 
 
    z-index: 999997; 
 
    display: none; 
 
} 
 
.modalWindow { 
 
    width: 80%; 
 
    right: 0; 
 
    left: 0; 
 
    top: 50%; 
 
    margin: 0 auto; 
 
    height: auto; 
 
    position: fixed; 
 
    display: none; 
 
    -moz-transform: translateY(-50%); 
 
    -ms-transform: translateY(-50%); 
 
    -webkit-transform: translateY(-50%); 
 
    transform: translateY(-50%); 
 
    z-index: 999998; 
 
    background-color: white; 
 
    padding: 20px; 
 
} 
 
.closeBtn { 
 
    font-size: 32px; 
 
    color: #333; 
 
    position: absolute; 
 
    right: 20px; 
 
    top: 5px; 
 
} 
 
.inner:hover { 
 
    cursor: pointer; 
 
} 
 
/* Animations */ 
 

 
.animated { 
 
    -webkit-animation-duration: 1s; 
 
    animation-duration: 1s; 
 
    -webkit-animation-fill-mode: both; 
 
    animation-fill-mode: both; 
 
} 
 
/*the animation definition*/ 
 

 
@-webkit-keyframes slideInLeft { 
 
    0% { 
 
    -webkit-transform: translate3d(-100%, 0, 0); 
 
    transform: translate3d(-100%, 0, 0); 
 
    visibility: visible 
 
    } 
 
    100% { 
 
    -webkit-transform: translate3d(0, 0, 0); 
 
    transform: translate3d(0, 0, 0) 
 
    } 
 
} 
 
@keyframes slideInLeft { 
 
    0% { 
 
    -webkit-transform: translate3d(-125%, 0, 0); 
 
    -ms-transform: translate3d(-125%, 0, 0); 
 
    transform: translate3d(-125%, 0, 0); 
 
    visibility: visible 
 
    } 
 
    100% { 
 
    -webkit-transform: translate3d(0, 0, 0); 
 
    -ms-transform: translate3d(0, 0, 0); 
 
    transform: translate3d(0, 0, 0) 
 
    } 
 
} 
 
.slideInLeft { 
 
    -webkit-animation-name: slideInLeft; 
 
    animation-name: slideInLeft 
 
} 
 
@-webkit-keyframes slideOutLeft { 
 
    0% { 
 
    -webkit-transform: translate3d(0, 0, 0); 
 
    transform: translate3d(0, 0, 0) 
 
    } 
 
    100% { 
 
    visibility: hidden; 
 
    -webkit-transform: translate3d(-100%, 0, 0); 
 
    transform: translate3d(-100%, 0, 0) 
 
    } 
 
} 
 
@keyframes slideOutLeft { 
 
    0% { 
 
    -webkit-transform: translate3d(0, 0, 0); 
 
    -ms-transform: translate3d(0, 0, 0); 
 
    transform: translate3d(0, 0, 0) 
 
    } 
 
    100% { 
 
    visibility: hidden; 
 
    -webkit-transform: translate3d(-125%, 0, 0); 
 
    -ms-transform: translate3d(-125%, 0, 0); 
 
    transform: translate3d(-125%, 0, 0) 
 
    } 
 
} 
 
.slideOutLeft { 
 
    -webkit-animation-name: slideOutLeft; 
 
    animation-name: slideOutLeft 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
 
<div id="overlay" class="overlay"></div> 
 

 
<div class="wrapper"> 
 
    <div class="inner"> 
 

 
    <div class="modalBtn">click for modal 1</div> 
 

 
    <div class="modalWindow animated"> 
 
     <div class="closeBtn">X</div> 
 
     <span>This is modal window 1</span> 
 
    </div> 
 

 
    </div> 
 
</div> 
 

 
<div class="wrapper"> 
 
    <div class="inner"> 
 

 
    <div class="modalBtn">click for modal 2</div> 
 

 
    <div class="modalWindow animated"> 
 
     <div class="closeBtn">X</div> 
 
     <span>This is modal window 2</span> 
 
    </div> 
 

 
    </div> 
 
</div>

+0

我創建了一個片段給你。你的JSFiddle也是錯誤的。沒有jQuery選擇和運行onload而不是頭部︰https://jsfiddle.net/mplungjan/y1zbz318/ – mplungjan

+0

@ kodecount創建一個答案,我會接受,因爲正確的原因,你是正確的看到模態窗口是在「內部「的元素,它仍然是可點擊的。你的回答實際上已經照顧到了。 – agon024

+0

@ agon024發表我的評論作爲答案。謝謝。 – thekodester

回答

1

問題是你<div class="inner">仍然可點擊,請改變你的HTML標記:

<div class="wrapper"> 
    <div class="inner"> 
    <div class="modalBtn">click for modal 1</div> 
    </div> 

    //KEEP THIS OUT OF THE INNER DIV 
    <div class="modalWindow animated"> 
    <div class="closeBtn">X</div> 
    <span>This is modal window 1</span> 
    </div> 
</div> 

然後你的JavaScript太:

$('.inner').click(function() { 
$(this).parent().find('.modalWindow').removeClass('slideOutLeft').addClass('slideInLeft').css('display', 'block'); 
$('.overlay').fadeToggle(500); 
}); 
+0

謝謝你,因爲這會在稍後導致我的問題。 – agon024

4

問題是在你的HTML結構,所以當你點擊關閉按鈕你點擊.inner格,太: 修復:

$('.closeBtn, .overlay').click(function(e){ 
    e.stopPropagation(); 
    $('.modalWindow').removeClass('slideInLeft').addClass('slideOutLeft'); 
    $('.overlay').fadeToggle(500); 
    }); 

演示:https://jsfiddle.net/ssjfu611/24/

+0

這是易碎的。 ''div class =「inner」>'仍然是可點擊的,您可以使模態疊加顯示爲無模式。點擊按鈕位於疊加層下方的位置(雙擊幾下)。 – thekodester

+1

@ kodecount,我沒有從原來的問題/提琴注意到這個問題。我的回答與原始帖子/問題中提到的問題有關,它不是你描述的行爲的原因。無論如何,HTML重構可能是更好(更安全)的選擇。 – sinisake

+0

可以理解。只是不想看到用戶實現這一點,並最終在他們的應用程序上修復它。 – thekodester