2016-12-03 5 views
0

私はCSS3を使ってモーダルを作り、jQueryでクラスを交互にしています。css3で遷移アニメーションを開くと閉じる

モーダルは正しく(css3効果で)開きますが、私の問題はモーダルを閉じるときです。逆の方法でcss3効果でモーダルを閉じることはできません。言い換えれば、私は効果を伴ってモーダルを開き、逆の方法でモーダルを閉じる必要があります。

モーダルオープン0%: -70deg%´ ---- ´100%: 0。私はanimationclosemodalと呼ばれる逆効果を作成しようとします。 0%: 0 ---- 100%: -70degしかし成功しなかった。

モダールをどのように開いて閉じることができますか?効果は出てきますか?

$(document).ready(function(){ 
 
\t $('.modal-open').click(function(){ 
 
\t \t $('.overlay').addClass('modal-show'); 
 
\t \t $('.modal').addClass('modal-show modal-perspective'); 
 
\t \t $('.modal-content').addClass('modal-animate'); 
 
\t }); 
 
\t $('.modal-close').click(function(){ 
 
\t \t $('.overlay').removeClass('modal-show'); 
 
\t \t $('.modal').removeClass('modal-show modal-perspective'); 
 
\t \t $('.modal-content').removeClass('modal-animate'); 
 
\t  $('.modal-content').addClass('modal-remove'); 
 

 
\t }); 
 
});
html, body{ 
 
\t margin: 0; 
 
\t padding: 0; 
 
\t box-sizing: border-box; 
 
\t background: #FF3300; 
 
\t font-family: 'Ubuntu', sans-serif; 
 
} 
 

 
.modal{ 
 
\t position: fixed; 
 
\t top: 50%; 
 
\t left: 50%; 
 
\t transform: translate(-50%, -50%); 
 
\t width: 50%; 
 
\t height: auto; 
 
\t min-width: 300px; \t 
 
\t z-index: 2; 
 
\t visibility: hidden; \t 
 
\t display: flex; 
 
\t align-items: center; 
 
\t justify-content: center; 
 

 
} 
 

 
.modal-content{ 
 
\t padding: 120px 10px; 
 
\t text-align: center; 
 
\t color: #000; 
 
\t background: #bd330f; 
 
\t border-radius: 10px; \t 
 
\t border: 1px solid #909090; \t 
 
\t box-shadow: 10px 10px 20px rgba(0, 0, 0, 0.9); \t 
 
} 
 

 
.modal-open{ 
 
\t position: absolute; 
 
\t top: 50%; 
 
\t left: 50%; 
 
\t transform: translate(-50%, -50%); 
 
\t border: transparent; 
 
\t background: #fff; 
 
\t font-size: 15px; 
 
\t font-weight: bold; 
 
\t padding: 20px 50px; 
 
\t border-radius: 5px; 
 
} 
 

 
.modal-open:active{ 
 
\t outline: transparent; 
 
} 
 

 
.modal-close{ 
 
\t padding: 8px 40px; 
 
    border-radius: 8px; 
 
    border: transparent; 
 
    background: #212121; 
 
    color: #fff; 
 
    outline: transparent; \t 
 
} 
 

 
.overlay { 
 
\t position: fixed; 
 
\t width: 100%; 
 
\t height: 100%; 
 
\t visibility: hidden; 
 
\t top: 0; 
 
\t left: 0; 
 
\t z-index: 1; 
 
\t opacity: 0; 
 
\t background: rgba(0, 0, 0, 0.5); 
 
\t transition: all 0.7s; 
 
} 
 

 
.modal-show { 
 
\t opacity: 1; 
 
\t visibility: visible; \t 
 
} 
 

 
.modal-perspective{ 
 
\t  -webkit-perspective: 900px; 
 
\t  perspective: 900px; \t \t \t 
 
} 
 

 
.modal-animate{ 
 
\t animation: openmodal 300ms ease-in forwards; \t 
 
} 
 

 
.modal-remove{ 
 
\t animation: closemodal 300ms ease-in-out forwards; \t 
 
} 
 

 
@keyframes openmodal{ 
 
\t 0%{ 
 
\t \t transform: rotateX(-70deg); 
 
\t \t -webkit-transform: rotateX(-70deg); 
 
\t \t -moz-transform: rotateX(-70deg); 
 
\t \t -ms-transform: rotateX(-70deg); 
 
\t } \t 
 

 
\t 100%{ 
 
\t \t transform: rotateX(0deg); 
 
\t \t -webkit-transform: rotateX(0deg); 
 
\t \t -moz-transform: rotateX(0deg); 
 
\t \t -ms-transform: rotateX(0deg); 
 
\t } 
 
} 
 

 
@keyframes closemodal{ 
 
\t 0%{ 
 
\t \t transform: rotateX(0deg); 
 
\t \t -webkit-transform: rotateX(0deg); 
 
\t \t -moz-transform: rotateX(0deg); 
 
\t \t -ms-transform: rotateX(0deg); 
 
\t } \t 
 

 
\t 100%{ 
 
\t \t transform: rotateX(-70deg); 
 
\t \t -webkit-transform: rotateX(-70deg); 
 
\t \t -moz-transform: rotateX(-70deg); 
 
\t \t -ms-transform: rotateX(-70deg); \t \t 
 
\t } 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="modal"> 
 
\t <div class="modal-content"> 
 
\t \t <h3>Modal Dialog</h3> 
 
\t \t <div> \t \t \t \t 
 
\t \t \t <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi gravida libero nec velit. Morbi scelerisque luctus velit. Etiam dui sem, fermentum vitae, sagittis id, malesuada in, quam. Proin mattis lacinia justo. Vestibulum facilisis auctor urna. Aliquam in lorem sit amet leo accumsan.</p> 
 
\t \t \t <button class="modal-close">CLOSE ME!</button> 
 
\t \t </div> 
 
\t </div> 
 
</div> 
 

 
<button class="modal-open">~ OPEN MODAL ~</button> 
 

 
<div class="overlay"></div>

はまた、私のjQueryのコードでは、クラスを切り替えるためのより良い方法があります。

Plsは、スニペットに見えますか?私はそれがそれらを切り替えるより良い方法だと思います。私はどのようにそれを作ることができますか?

+0

クラスを切り替えるには、おそらくあなたが探しているものがhttp://api.jquery.com/toggleclass/です。 – Gerrit0

答えて

2

逆効果が必要な場合は、CSS3のキーフレームアニメーションを使用しないでください。実際に使用する必要があるのは、フォワードエフェクトを追加するクラスが削除されるたびに逆効果を生成できるCSS3トランジションです。

ちょうど(すなわち、.modal-contentある)元の状態にtransform: rotateX(-70deg)を設定し、オープン状態(.modal-animate)にtransform: rotateX(0deg)を設定します。これは、要素が元々は見えなくなり、開いたときに表示されることを意味します。最後に、要素にtransitionプロパティを追加します。

$(document).ready(function() { 
 
    $('.modal-open').click(function() { 
 
    $('.overlay').addClass('modal-show'); 
 
    $('.modal').addClass('modal-show modal-perspective'); 
 
    $('.modal-content').addClass('modal-animate'); 
 
    }); 
 
    $('.modal-close').click(function() { 
 
    $('.overlay').removeClass('modal-show'); 
 
    $('.modal').removeClass('modal-show modal-perspective'); 
 
    $('.modal-content').removeClass('modal-animate'); 
 
    }); 
 
});
html, 
 
body { 
 
    margin: 0; 
 
    padding: 0; 
 
    box-sizing: border-box; 
 
    background: #FF3300; 
 
    font-family: 'Ubuntu', sans-serif; 
 
} 
 
.modal { 
 
    position: fixed; 
 
    top: 50%; 
 
    left: 50%; 
 
    transform: translate(-50%, -50%); 
 
    width: 50%; 
 
    height: auto; 
 
    min-width: 300px; 
 
    z-index: 2; 
 
    visibility: hidden; 
 
    display: flex; 
 
    align-items: center; 
 
    justify-content: center; 
 
} 
 
.modal-content { 
 
    padding: 120px 10px; 
 
    text-align: center; 
 
    color: #000; 
 
    background: #bd330f; 
 
    border-radius: 10px; 
 
    border: 1px solid #909090; 
 
    box-shadow: 10px 10px 20px rgba(0, 0, 0, 0.9); 
 
    
 
    transition: all 300ms ease-in; 
 
    
 
    /* added for original state - vendor prefixed version should come before unprefixed property */ 
 
    -webkit-transform: rotateX(-70deg); 
 
    -moz-transform: rotateX(-70deg); 
 
    -ms-transform: rotateX(-70deg); 
 
    transform: rotateX(-70deg); 
 
} 
 
.modal-open { 
 
    position: absolute; 
 
    top: 50%; 
 
    left: 50%; 
 
    transform: translate(-50%, -50%); 
 
    border: transparent; 
 
    background: #fff; 
 
    font-size: 15px; 
 
    font-weight: bold; 
 
    padding: 20px 50px; 
 
    border-radius: 5px; 
 
} 
 
.modal-open:active { 
 
    outline: transparent; 
 
} 
 
.modal-close { 
 
    padding: 8px 40px; 
 
    border-radius: 8px; 
 
    border: transparent; 
 
    background: #212121; 
 
    color: #fff; 
 
    outline: transparent; 
 
} 
 
.overlay { 
 
    position: fixed; 
 
    width: 100%; 
 
    height: 100%; 
 
    visibility: hidden; 
 
    top: 0; 
 
    left: 0; 
 
    z-index: 1; 
 
    opacity: 0; 
 
    background: rgba(0, 0, 0, 0.5); 
 
    transition: all 0.7s; 
 
} 
 
.modal-show { 
 
    opacity: 1; 
 
    visibility: visible; 
 
} 
 
.modal-perspective { 
 
    -webkit-perspective: 900px; 
 
    perspective: 900px; 
 
} 
 
.modal-animate { 
 
    transition: all 300ms ease-in-out; 
 
    /* remove animation, set below for open state */ 
 
    -webkit-transform: rotateX(0deg); 
 
    -moz-transform: rotateX(0deg); 
 
    -ms-transform: rotateX(0deg); 
 
    transform: rotateX(0deg); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="modal"> 
 
    <div class="modal-content"> 
 
    <h3>Modal Dialog</h3> 
 
    <div> 
 
     <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi gravida libero nec velit. Morbi scelerisque luctus velit. Etiam dui sem, fermentum vitae, sagittis id, malesuada in, quam. Proin mattis lacinia justo. Vestibulum facilisis auctor urna. 
 
     Aliquam in lorem sit amet leo accumsan.</p> 
 
     <button class="modal-close">CLOSE ME!</button> 
 
    </div> 
 
    </div> 
 
</div> 
 

 
<button class="modal-open">~ OPEN MODAL ~</button> 
 

 
<div class="overlay"></div>

(コメントで、transitionallを使用することが一般的によくないですが、この例ではその影響が私の意見では非常に最小限であるthis postで説明したように注意してください。)

+1

プラス1 ...自分の経験に基づき、[this post](http://stackoverflow.com/a/8962837/2827823)によると、 'transition:all'を使うのはお勧めしません。それについてあなたの意見は何ですか? – LGSon

+0

@ LGSon:はい、正しいです。 OPはそれを認識する必要があるので、ここでリンクしてくれてありがとう。しかし、私は、この例で 'all 'を使うことによる影響は最小限だと思います。 – Harry

+0

ありがとうございます@ハリー! 'transform:rotate() 'の追加と削除のみ。非常に簡単です! Pls、私に質問に答えて:逆効果をさせるためにキーフレームの使用を避けなければならない理由は何ですか?それはモーダルまたは一般的な方法のためだけですか? – Zkk

関連する問題