2017-02-14 76 views
0

我有绝对定位在一个隐藏溢出的包装内的多个屏幕。CSS转换不工作在jQuery切换类

当我点击每个屏幕里面的链接,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

心中已经设置.screen不透明度为0,并添加.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

嗡嗡声好吧,当你的课程是ggled。 事件,如果它不是渴望效果,我明白,我需要设置我想要动画的默认值。 谢谢你的例子。 –

0

的问题是,你想有之间进行转换/没有左/右/上/下CSS属性。为了转换到工作状态,它需要一个声明和有效的属性,它可以从一开始就处理,并且还需要知道将该属性转换为什么值。如果您未定义左/右/上/下值,则默认为“自动”。 CSS不能在“auto”和数值之间转换。

我在这里推荐的是intially使用上的元素左/右/上/下,让他们正确定位,那么你就可以转换这些值。或者,也可以使用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 bottom:0; on .screen 然后看看结果如何。 谢谢 –

+0

确定它现在部分工作.. https://jsfiddle.net/fredconv/posxoqmt/2/ 它适用于所有的屏幕除了屏幕-5。 (这个应该来自顶部,但它仍然跳跃..) 另外..目标幻灯片工作(从左边),但不是当前div的滑出。因为类('左')不添加..仍然寻找为什么:D 无论如何谢谢 –

+0

我发现如何添加classe到当前div: https://jsfiddle.net/fredconv/posxoqmt/3/ 我在var后添加了一个.closest('。screen').. 但它仍然不能用于屏幕 - 5 ..仍然在寻找。如果你有任何想法..谢谢 –