假设出于任何原因,需要在页面上显示一个新的内容模块。 只需将该新模块追加到 DOM 中,它就会立即显示。 这可能足以作为“入口” - 或者它可能过于细微。 我认为,当您向页面添加新内容时,您希望人们看到它。 动画可能是解决方案。 从技术上讲,它会减慢新内容的进入速度,但视觉效果肯定会使它更显眼。 让我们编写一些代码,使添加到页面的所有新模块“飞入”。
已存在的内容…
您有一个网站。 网站有模块。
<section class="main" id="main">
<div class="module">
...
</div>
<div class="module">
...
</div>
</section>
<aside class="sidebar" id="sidebar">
<div class="module">
...
</div>
<div class="module">
...
</div>
</aside>
新内容进来
jQuery 样式。
$("<div />", {
class: "module",
html: newContent // from an Ajax request or something
}).prependTo("#sidebar");
选项 #1:为新模块添加一个类
如果您有能力,为新添加的内容添加一个类可能是最干净的方法,这样您就可以专门定位它。 在这种情况下,我们给它添加了 newly-added
类。
$("<div />", {
class: "module newly-added",
html: newContent // from an Ajax request or something
}).prependTo("#sidebar");
飞入 CSS
这个新类将绑定一个动画,它会执行飞入。 它将在添加到 DOM 后立即运行。
.newly-added {
animation: flyin 1.2s ease forwards;
opacity: 0;
transform: scale(2);
filter: blur(4px);
}
@keyframes flyin {
to {
filter: blur(0);
transform: scale(1);
opacity: 1;
}
}
注意:这里没有使用任何前缀。 所有 animation
、transform
、filter
和 @keyframes
都应该添加前缀才能获得最佳浏览器支持。 请参考 CSS3 请 以了解在哪些浏览器上使用哪些前缀。 或者,使用 Sass/Compass 和相应的混合宏。 或者,使用 Prefix Free1。
选项 #2:在没有类的情况下定位所有新模块
您可能无法控制新添加的内容所具有的类。 在这种情况下,您将定位页面上的所有现有内容,并赋予它们一个类来取消飞入效果。
$(function() {
$(".module").addClass("old-school");
});
然后,您只能使用 :not
选择器定位新模块。
.module:not(.old-school) {
/* animation stuff */
}
演示
查看 CodePen 上 Chris Coyier 的笔 飞入新内容 (@chriscoyier) 在 CodePen 上。
1 Prefix Free 现在无法开箱即用地使用 filter
,但您可以使其工作。 查看 Lea 在这里提供的代码示例。
不错! 我正在寻找类似设置的解决方案,这应该非常有效!
另外,哈哈,您网站页脚上的新商品图片... 哈哈您的脸,你喜欢看到的吗?
完全同意关于商品图片的说法!
哈哈 Chris,我不是说你必须更改它!
看起来不错。 但是,似乎
filter: blur()
无法进行动画处理(从 Chrome 查看)。 如果模糊在内容飞入时发生变化,那就太棒了。 它会提供一种不错的聚焦感。它似乎可以为我进行动画处理... 我在 Mac OSX Lion 上使用 Chrome。
如果可能,我强烈建议从
height:0
开始,并将其动画设置为height:auto
。 这样,旧内容会随着动画一起向下推,而不是在调用它后立即跳下去。不错,Chris!
我开始注意到你喜欢“模块”这个词,不是吗? 哈哈。
这可能对未来的项目有用!
这是一篇很棒的文章。 但是,我想问一个问题,请原谅我,因为我应该知道这一点。
我一直在使用 jQuery 添加内容,方法如下:
$('<div>css-tricks</div>').preprendTo('.awesomeSites');
但是,这篇文章让我停下来思考以下代码片段,它添加了内容:
$("<div/>",{...}).preprendTo();
我以前从未见过它,想知道它是否有名称,以及从哪个 jQuery 版本开始引入的。 如果有文档页面,我想知道。
提前感谢。
首先,
$()
是jQuery()
的简写或 语法糖,因此当我们调用$()
时,它与调用jQuery()
相同。 它们实际上是 相同的。来自 jQuery 文档
映射是一个通用的 JavaScript 对象。 它是一组键值对,在这种情况下,键是我们想要创建的 DOM 元素的所需属性,而值是我们想要分配给这些属性的值。
因此,发生的事情正是您所期望的:jQuery 使用我们传递给它的参数创建一个新的 DOM 元素。 因此,使用您的示例:
$('<div>css-tricks</div>')
创建一个新的 div,其中包含文本“css-tricks”,例如<div>css-tricks</div>
。 如果我们想要让这个新 div 具有某些属性,我们可以使用$()
的可选第二个参数来告诉 jQuery 这些属性应该是什么,以及它们应该具有什么值。 在演示中:$('<div>css-tricks</div>', { class: "highlight" })
将创建<div class="highlight">css-tricks</div>
现在,您可能想知道为什么我们没有直接写
$('<div class="highlight">css-tricks</div>')
- 原因是使用$()
的第二个参数允许我们为属性的名称(如果我们使用新的data-[name]
语法为 html5 中的自定义数据元素,例如)以及值传递变量。 这使我们避免为创建的 DOM 元素“硬编码”所有属性数据,这更强大。希望这有帮助!
感谢 Brendon。 非常感谢!!
您好,Chris。 感谢您分享您的技巧,尽管我认为如果元素放大而不是缩小会看起来更好。 更加微妙和流畅。
另外,在您第一个 HTML 代码段中,有一个尖括号被错误地编码为实体。
谢谢!您可以复制这个 Pen 并更改一些值,看看您是否可以实现放大而不是缩小 =)
太棒了。如果能看到删除内容时的反向效果就更好了。