如何对现有列表项使用CSS转换来为新列表项腾出空间
How to use CSS transition for existing list items to make room for new ones?
假设我有以下HTML:
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>AlwaysAtTheEnd</li>
</ul>
在列表项3之后,我将使用javascript插入列表项4。之后,HTML将显示如下:
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>AlwaysAtTheEnd</li>
</ul>
然而,我希望"AlwaysAtEnd"项目能够平稳地向下滑动,为新项目腾出空间,而不是立即弹出以腾出空间。
我试着简单地添加以下CSS,但它似乎不会影响任何东西:
li {
-webkit-transition: all 1s ease-in-out;
-moz-transition: all 1s ease-in-out;
-o-transition: all 1s ease-in-out;
transition: all 1s ease-in-out;
}
Fiddle here:http://fiddle.jshell.net/pcsj2mgb/
编辑:固定小提琴:http://fiddle.jshell.net/pcsj2mgb/1/
可以用CSS完成,尽管您需要定义li
元素的最终高度,以便将动画设置为该高度
当然,您需要将newItem
类添加到要附加的元素中,因此CSS会影响它
更新:无需定义最终高度!让我们来设置max-height
的动画。更新了代码段。
add = function() {
listItems = document.getElementsByTagName('li');
var lastItem = listItems[listItems.length - 1]
var newItem = document.createElement('li');
newItem.innerHTML = "4";
newItem.classList.add("newItem");
lastItem.parentNode.insertBefore(newItem, lastItem);
}
.newItem {
max-height: 0;
opacity: 0;
animation: grow 1s ease-in-out forwards;
-webkit-animation: grow 1s ease-in-out forwards;
}
@-webkit-keyframes grow {
to {
max-height: 20px;
opacity: 1;
}
}
@keyframes grow {
to {
max-height: 20px;
opacity: 1;
}
}
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>AlwaysAtTheEnd</li>
</ul>
<button onClick="add()">Add</button>
我更改了您的javascript代码:
add = function(){
var listItems = document.getElementsByTagName('li');
var secondLastItem = listItems[listItems.length - 2];
var newItem = document.createElement('li');
newItem.innerText = 4;
// some pre defined css to new item
newItem.style.height = '0px';
newItem.style['opacity'] = '0';
// This is change : because you are appending li into second last li, not in ul : so this function will insert li after last second item
secondLastItem.parentNode.insertBefore(newItem, secondLastItem.nextSibling);
setTimeout(function(){
// after append new item will get some css changes
newItem.style.height = '18px';
newItem.style['opacity'] = '1';
},10)
}
你可以看到这个例子的fiddle链接:http://fiddle.jshell.net/13gg7kwf/
通过Javascript添加CSS值有点麻烦。
我已经找到了一种通过使用仅CSS的解决方案来实现这一点的方法(感谢:http://christianheilmann.com/2013/09/19/quicky-fading-in-a-newly-created-element-using-css/)。
不应该使用"过渡",而应该使用"动画"。
创建一个CSS类,并通过JS添加它,在元素添加到DOM:后立即触发动画
li.fade {
-webkit-animation: fade 5s;
animation: fade 5s;
opacity: 1;
}
/* -fail- */
@-webkit-keyframes fade {
from {opacity: 0}
to {opacity: 1}
}@keyframes fade {
from {opacity: 0}
to {opacity: 1}
}
完整的解决方案:http://jsfiddle.net/8wdk63ce/
相关文章:
- 使用下拉列表筛选列表(ul>li)
- 从要使用Protractor测试的服务器异步加载的动态数据列表的列表
- Knockout js 添加一个新列表
- 如何更改列表.js列表对象中的选项
- 如何避免/最小化列表中列表的缩进
- 如何对现有列表项使用CSS转换来为新列表项腾出空间
- 插入按字母顺序、javascript或jquery排序的新列表
- 链接下拉列表选择列表代码 -- 连接数据
- 停止对作为函数参数传递到新列表的对象引用
- 在 JavaScript 中创建具有重复列表条目的新列表的最快/推荐方法是什么
- 不是将新列表项推到底部,而是推到顶部
- 在 jQuery 中迭代数组时,每隔一个元素创建新列表
- 如何在JavaScript中重新加载页面以显示新列表
- Meteor-新列表项上的增量计数器:
- 如何将新列表项添加到无序列表中
- 如何更新不可变列表以获得新列表
- 单击list item将创建一个具有原始列表项'文本内容的新列表项
- reduce方法创建新列表,为什么未定义
- jQueryUI可排序连接列表-当项目滚动到新列表中时,未触发Over事件
- 如果是列表,则循环列表;如果是对象,则循环包含对象的新列表