我遇到this pen at CodePen,我有几个问题。首先让我们解释代码的作用:
在input
事件中,有一个forEach
循环遍历所有lis
并检查匹配的正则表达式,然后隐藏(或更准确地说,为{{1}设置动画因此,{0}} opacity
。然后它有一个li
循环(在while
循环中),再次再次遍历所有forEach
并将适当的lis
应用于{ {1}}(因为将translateY
设置为0不会删除元素。)
问题
1 - 所以它出来了,如果你有200 lis
,它会迭代(200 * 200 =)40,000次!我不认为这非常有效。
2 - 另一个问题是,如果过滤掉一定数量的opacity
滚动条仍然允许您向下滚动过去的那些内容,那么向下滚动只会看不到任何内容。请在下面的示例中查看此问题。
前两个问题的明显解决方案是设置lis
而不是设置lis
。这样你就不必重复所有display: none
200次,因为opacity: 0
会自动删除'空'空间......正如你所猜测的那样,它也解决了第二个问题。
该解决方案的问题是lis
没有动画。
如何在不遇到上述问题的情况下实现相同的动画?
(由于字符数限制,无法插入代码段。以下是相关的JavaScript代码:)
display: none
请不要jQuery答案。
答案 0 :(得分:0)
@DarkFalcon您需要特定于浏览器的动画属性,例如:
-webkit-animation: KEYFRAME-NAME 3s infinite;
}
@-webkit-keyframes KEYFRAME-NAME {
0% { opacity: 0; }
50% {opacity:.3;}
100% { opacity: 1; }
答案 1 :(得分:0)
通过避免li
元素的绝对定位并转换height
li
及其opacity
,可以避免滚动条问题和重复循环。
以下是我所做的:
position: absolute
移除li
,因为绝对定位意味着所有li
都放在同一点,因此需要翻译(translateY
)才能它们一个接一个地显示出来。height: 20px
添加了固定高度(li
)。 CSS过渡不能将值转换为auto / from auto,因此我们需要为li
提供固定的高度。我认为设置一个固定的高度应该适用于你的情况,因为它们看起来都像搜索结果,不会换行到多行。transition
设置以转换所有属性(或者您也可以单独转换高度和不透明度),而不仅仅是不透明度和变换。hidden
班级' CSS包含height: 0px
和overflow: hidden
。这个元素在被隐藏时没有高度(溢出也被隐藏),因此需要translateY
(这是第二个循环所做的)和滚动条的问题。while
循环外,没有JS更改。这是因为添加hidden
类会自动产生淡入淡出和上移效果。li {
list-style-type: none;
height: 20px; /* fixed height, set whatever is fit for your case */
transition: all .5s ease-in-out;
}
.hidden {
opacity: 0; /* produces the fade effect */
height: 0px; /* transition height to 0px to produce move up effect */
overflow: hidden; /* avoids the text from showing through when height is 0 */
}
CodePen Demo(由于字符数限制限制,未再添加代码段)
在上面的代码(和演示)中,opacity
和height
同时转换为相同的持续时间,因此opacity
转换没有太大的视觉效果。如果在opacity
转换开始之前必须显示height
更改,请在height
转换中添加延迟,如下面的代码所示:
li {
list-style-type: none;
height: 20px;
transition: opacity .5s ease-in-out, height .5s ease-in-out .1s;
}
在原始代码段中,li
项会在加载时滑入其位置,如果您需要相同的效果,可以通过在开始时将class='hidden'
设置为所有li
来生成然后用JS删除该类。