2017-02-14 9 views
0

オーバーフローが隠されたラッパーの中に絶対的に配置された複数の画面があります。jQueryトグルクラスでCSSトランジションが動作しません

各画面内のリンクをクリックすると、jQueryはターゲットの位置決めクラスを削除し、あるスクリーンから別のスクリーンへのスムーズなスライド遷移を作成したいと思います。電流は画面から消え、次の画面はビューポートに入り、右または上からスライドします(次の画面に応じて)。

しかし、CSSの移行は機能しません。スムーズな移行ではなく、ある画面から別の画面にジャンプするだけです

ここで何が間違っているのか分かりますか?

ここにはJS fiddleがあります。

とコード:あなたの助けを

function slideScreens(a,t, e) { 
 
\t if(t == 'screen--5'){ 
 
\t a.addClass('bottom'); 
 
\t $(".is-visible").removeClass("is-visible"); 
 
\t $("."+t).addClass("is-visible").removeClass("top"); 
 
\t } else { 
 
\t a.addClass('left'); 
 
\t $(".is-visible").removeClass("is-visible"); 
 
\t $("."+t).addClass("is-visible").removeClass("right"); 
 
\t } 
 
}; 
 

 
$(function() { 
 
\t $('.screen a').on('click', function(e) { 
 
\t e.preventDefault(); 
 
\t var target = $(this).attr('href'); 
 
\t \t slideScreens($(this),target, e); 
 
\t }); 
 
});
.wrapper__banner { 
 
    width: 100%; 
 
    height: 400px; 
 
    overflow: hidden; 
 
    border: 2px solid black; } 
 

 
.screens { 
 
    position: relative; 
 
    left: 0; 
 
    top: 0; 
 
    width: 100%; 
 
    height: 100%; } 
 

 
.screen { 
 
    position: absolute; 
 
    width: 100%; 
 
    height: 100%; } 
 

 
.screen--1 { 
 
    background: red; } 
 

 
.screen--2 { 
 
    background: lightblue; } 
 

 
.screen--3 { 
 
    background: green; } 
 

 
.screen--4 { 
 
    background: pink; } 
 

 
.screen--5 { 
 
    background: grey; } 
 

 
.screen { 
 
    padding: 10px; 
 
    -webkit-transition: all 0.5s ease; 
 
    -moz-transition: all 0.5s ease; 
 
    -o-transition: all 0.5s ease; 
 
    transition: all 0.5s ease; } 
 
    .screen.right { 
 
    left: 100%; } 
 
    .screen.left { 
 
    right: 100%; } 
 
    .screen.top { 
 
    bottom: 100%; } 
 
    .screen.bottom { 
 
    top: 100%; }
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script> 
 
<section class='wrapper__banner'> 
 
\t <div class='screens'> 
 
\t \t <div class='screen screen--1 is-visible'> 
 
\t \t \t screen--1 
 
\t \t \t <a href="screen--2">to screen 2</a> 
 
\t \t </div> 
 
\t \t <div class='screen screen--2 right'> 
 
\t \t \t screen--2 
 
\t \t \t \t <a href="screen--3">to screen 3</a> 
 
\t \t \t \t <a href="screen--5">show screen 5</a> 
 
\t \t </div> 
 
\t \t <div class='screen screen--3 right'> 
 
\t \t \t screen--3 
 
\t \t \t \t <a href="screen--4">to screen 4</a> 
 
\t \t </div> 
 
\t \t <div class='screen screen--4 right'> 
 
\t \t \t screen--4 
 
\t \t </div> 
 
\t \t <div class='screen screen--5 top'> 
 
\t \t \t screen--5 
 
\t \t </div> 
 
\t </div> 
 
</section>

感謝。

答えて

0

I'vは0に.screen不透明度を設定し、以下のように自分のスタイルシートに.is-visibleクラスを追加しました:

.is-visible { 
    opacity: 1; 
} 

function slideScreens(a,t, e) { 
 
\t if(t == 'screen--5'){ 
 
\t a.addClass('bottom'); 
 
\t $(".is-visible").removeClass("is-visible"); 
 
\t $("."+t).addClass("is-visible").removeClass("top"); 
 
\t } else { 
 
\t a.addClass('left'); 
 
\t $(".is-visible").removeClass("is-visible"); 
 
\t $("."+t).addClass("is-visible").removeClass("right"); 
 
\t } 
 
}; 
 

 
$(function() { 
 
\t $('.screen a').on('click', function(e) { 
 
\t e.preventDefault(); 
 
\t var target = $(this).attr('href'); 
 
\t \t slideScreens($(this),target, e); 
 
\t }); 
 
});
.wrapper__banner { 
 
    width: 100%; 
 
    height: 400px; 
 
    overflow: hidden; 
 
    border: 2px solid black; } 
 

 
.screens { 
 
    position: relative; 
 
    left: 0; 
 
    top: 0; 
 
    width: 100%; 
 
    height: 100%; } 
 

 
.screen { 
 
    opacity: 0; 
 
    position: absolute; 
 
    width: 100%; 
 
    height: 100%; } 
 

 
.screen--1 { 
 
    background: red; } 
 

 
.screen--2 { 
 
    background: lightblue; } 
 

 
.screen--3 { 
 
    background: green; } 
 

 
.screen--4 { 
 
    background: pink; } 
 

 
.screen--5 { 
 
    background: grey; } 
 

 
.screen { 
 
    padding: 10px; 
 
    -webkit-transition: all 0.5s ease; 
 
    -moz-transition: all 0.5s ease; 
 
    -o-transition: all 0.5s ease; 
 
    transition: all 0.5s ease; } 
 
    .screen.right { 
 
    left: 100%; } 
 
    .screen.left { 
 
    right: 100%; } 
 
    .screen.top { 
 
    bottom: 100%; } 
 
    .screen.bottom { 
 
    top: 100%; } 
 

 
.is-visible { 
 
    opacity: 1; 
 
}
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script> 
 
<section class='wrapper__banner'> 
 
\t \t \t <div class='screens'> 
 
\t \t \t \t <div class='screen screen--1 is-visible'> 
 
\t \t \t \t \t screen--1 
 
\t \t \t \t \t <a href="screen--2">to screen 2</a> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div class='screen screen--2 right'> 
 
\t \t \t \t \t screen--2 
 
\t \t \t \t \t \t <a href="screen--3">to screen 3</a> 
 
\t \t \t \t \t \t <a href="screen--5">show screen 5</a> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div class='screen screen--3 right'> 
 
\t \t \t \t \t screen--3 
 
\t \t \t \t \t \t <a href="screen--4">to screen 4</a> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div class='screen screen--4 right'> 
 
\t \t \t \t \t screen--4 
 
\t \t \t \t </div> 
 
\t \t \t \t <div class='screen screen--5 top'> 
 
\t \t \t \t \t screen--5 
 
\t \t \t \t </div> 
 
\t \t \t </div> 
 
</section>

+0

Humここで不透明度をアニメートすると、クラスがググルド。 イベントそれは欲望の効果ではない、私は私がアニメーション化したいもののデフォルト値を設定する必要があることをunderstant。 ありがとうございます。 –

0

問題はあなたが持つとの間で移行しようとしているということです/左/右/上/下CSSプロパティを持たない。遷移が動作するためには、宣言された有効なプロパティが必要で、最初から動作することができます。また、そのプロパティをどの値に遷移させるかを知る必要があります。左/右/上/下の値を定義しない場合、デフォルトは "auto"になります。 CSSは「自動」と数値の間で遷移することはできません。

私がここでお勧めするのは、左右に/上/下を使用して要素を正しく配置することです。次に、これらの値を遷移させることができます。あるいは、CSS変換を使用することもできます。 https://developer.mozilla.org/en-US/docs/Web/CSS/transform(変換:translate3dここにあなたの最善の策もwoudl)

編集:ここで何をしたいの作業codepen例です。 http://codepen.io/adrianroworth/pen/KaJrzj

<div class="container"> 
    <div class="screens"> 
     <div class="screens__screen screens__screen--1 screens__screen--visible" id="screen1"> 
      <div class="screens__screen-nav"> 
       <a href="#screen2" class="screens__screen-nav-link">To screen 2</a> 
      </div> 
      screen 1 
     </div> 
     <div class="screens__screen screens__screen--2" id="screen2"> 
      <div class="screens__screen-nav"> 
       <a href="#screen3" class="screens__screen-nav-link">To screen 3</a> 
       <a href="#screen5" class="screens__screen-nav-link">To screen 5</a> 
      </div> 
      screen 2 
     </div> 
     <div class="screens__screen screens__screen--3" id="screen3"> 
      <div class="screens__screen-nav"> 
       <a href="#screen4" class="screens__screen-nav-link">Screen 4</a> 
      </div> 
      screen 3 
     </div> 
     <div class="screens__screen screens__screen--4" id="screen4"> 
      screen 4 
     </div> 
     <div class="screens__screen screens__screen--5" id="screen5"> 
      screen 5 
     </div> 
    </div> 
</div> 

-

.container { 
    height: 400px; 
    display: block; 
    width: 400px; 
    position: relative; 
    z-index: 1; 
} 
.screens { 
    position: absolute; 
    z-index: 2; // just to keep it easy to understand in my head. 
    top: 0; 
    left: 0; 
    width: 100%; 
    height: 100%; 
    overflow: hidden; 
} 
.screens__screen { 
    position: absolute; 
    z-index: 3; // just to keep it easy to understand in my head. 
    top: 0; 
    left: 0; 
    width: 100%; 
    height: 100%; 
    transition: top 0.3s ease-in-out, left 0.3s ease-in-out; 
} 
.screens__screen-nav { 
    background: rgba(0, 0, 0, 0.5); 
    padding: 5px; 
} 
.screens__screen-nav-link { 
    color: #ffffff; 
} 
.screens__screen--1 { 
    z-index: 100; 
    background: green; 
} 
.screens__screen--2 { 
    z-index: 90; 
    background: red; 
    left: 100%; 
} 
.screens__screen--3 { 
    z-index: 80; 
    background: blue; 
    left: 100%; 
} 
.screens__screen--4 { 
    z-index: 70; 
    background: yellow; 
    left: 100%; 
} 
.screens__screen--5 { 
    z-index: 60; 
    background: purple; 
    top: -100%; 
} 
.screens__screen--visible { 
    top: 0%; 
    left: 0%; 
    z-index: 200; 
} 
.screens__screen--done { 
    top: 0%; 
    left: 0%; 
    z-index: 200; 
} 

-

$(function() { 

    var $screens = $('.screens__screen'); 

    $('.screens__screen-nav-link').on('click', function screenNavLinkClickAF(e) { 
     e.preventDefault(); 
     var $this = $(this); 
     var screenId = $this.attr('href'); 
     $screens.not($(screenId)).removeClass('screens__screen--visible'); 
     $(screenId).addClass('screens__screen--visible screens__screen--done'); 
    }); 
}); 
+0

ハアはヒントのためにありがとう。 デフォルトを追加してみます: \t left:0; \t底部:0; on .screen 結果が表示されます。それが今で部分的に動作OK –

+0

おかげ.. https://jsfiddle.net/fredconv/posxoqmt/2/ それは画面を除くすべての画面のために働く - 5。 (これは上から来るはずですが、まだジャンプします。) また、対象のスライドインは現在のdivのスライドアウトではなく、左から機能しています。クラスは(「左」)...追加されていないため、まだ理由を探して:とにかくD 感謝を –

+0

私は現在のdivにクラッセを追加する方法が見つかりました: https://jsfiddle.net/fredconv/posxoqmt/3/ 私は、.closest( '。screen')をa varの後に追加しました。 しかし、それでもまだ画面には表示されません。もしあなたが何か考えているなら...気高い –

関連する問題