我一直在用CSS转换和jQuery测试动画。其思想是向用户显示一组可单击的div,以加载新页面。一旦一个div被点击,它就会展开来填充整个屏幕,然后“加载”下一页。
下面是我想要达到的目标的一个模型:

我设置它的方式是,让每个div相对定位,然后让每个div一起坐到一起。然后,一旦一个div被点击,我‘褪色’的div分开,没有被点击,并展开点击的div。问题是,当div点击不是第一次(即蓝色或绿色),它最终会‘抓拍’到左手边,然后展开。当然,这种情况会发生,因为定位设置为相对位置。
position: relative;在这里可以看到这方面的例子:http://codepen.io/anon/pen/eKynL
为了解决这个问题,我建立了绝对定位的div。动画按照我想要的那样完美地工作,但是我不喜欢这样一个事实:由于绝对定位,我必须分别定位每个div的左上方,加上div不会在窗口调整大小时自动移动到新行。
position: absolute;在这里可以看到这方面的例子:http://codepen.io/anon/pen/jIqcL
我不确定是否有任何方法可以改变我的实现来改进它并使它更易于维护(特别是div的内联样式)。
发布于 2014-10-25 03:09:15
我使用您的position:relative; (http://codepen.io/anon/pen/eKynL)作为源:
$(document).ready(function() {
$('.mydiv').click(function() {
if(!$(this).hasClass('clicked')) {
var clicked_div = $(this);
clicked_div.addClass('clicked');
clicked_div.find('h1').fadeOut(150);
$('.mydiv').not('.clicked').addClass('hide'); //<----CHANGED LINE
clicked_div.addClass('animate');
$('.loading').css('opacity', 1);
setTimeout(function() {
$('.mydiv').not('.clicked').css('display','none'); //<----NEW LINE
$('.loading').css('opacity', 0);
clicked_div.addClass('blog-post');
clicked_div.find('h1').fadeIn(150);
$('.blog-content').addClass('active');
}, 1500);
}
});
});*,*:before,*:after {
box-sizing: border-box;
}
html, body {
width: 100%;
height: 100%;
position: relative;
padding: 0;
margin: 0;
overflow: hidden;
}
.mydiv {
width: 200px;
height: 200px;
background-color: #bada55;
position: relative;
float: left;
left: 0;
top: 0;
transition: width 0.5s, height 0.5s, left 0.5s, top 0.5s, opacity 0.25s; /*<----ADDED 'opacity'*/
}
.mydiv h1 {
position: absolute;
bottom: 0;
left: 10px;
color: #fff;
font-family: sans-serif;
}
.teal {
background-color: teal;
}
.orange {
background-color: orange;
}
/*-----NEW CODE---------------------------------*/
.mydiv.hide {
width: 0px;
height: 0px;
opacity: 0;
}
/*----------------------------------------------*/
.mydiv.animate {
width: 100%;
height: 100%;
left: 0;
top: 0;
}
.mydiv.blog-post {
width: 50%;
}
.blog-content {
background-color: #efefef;
width: 50%;
height: 100%;
position: absolute;
right: 0;
top: 100%;
transition: top 0.5s;
font-family: sans-serif;
color: #3c3c3c;
font-size: 30px;
padding: 20px;
}
.blog-content.active {
top: 0%;
}
.loading {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
margin: auto 0;
width: 100%;
height: 100px;
text-align: center;
font-family: sans-serif;
font-size: 30px;
font-weight: bold;
color: #fff;
opacity: 0;
}<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="mydiv">
<h1>Green</h1>
</div>
<div class="mydiv teal">
<h1>Teal</h1>
</div>
<div class="mydiv orange">
<h1>Orange</h1>
</div>
<div class="loading">Loading...</div>
<div class="blog-content">
Content
</div>
codepen: http://codepen.io/anon/pen/lFIhH
在CSS中,我只添加了以下内容:
.mydiv {
...
transition: ..., opacity 0.25s;
}
.mydiv.hide {
width: 0px;
height: 0px;
opacity: 0;
}在JS中,
我改变了这句话:
$('.mydiv').not('.clicked').fadeOut(150, function() {
至
$('.mydiv').not('.clicked').addClass('hide');
并在setTimeout函数中添加了这一行:
$('.mydiv').not('.clicked').css('display','none');
它的工作方式如下:
div获得.animate-class时,未单击的divs获得.hide-class。div正在动画化以填充页面时,另一个divs正在动画化以消失(使用width/height和opacity)。width/height转换的速度都是相同的,因此当单击的div增长时,另一个divs会收缩,单击的div不会向左/顶部移动。opacity的divs转换速度要快一些(0.25s),以创建(似乎)与原始代码页中相同的结果(即未单击的div在单击div展开之前消失)。
divs,display设置为none,以完成手动淡出。https://stackoverflow.com/questions/26555481
复制相似问题