您是否见过这种设计模式,其中通知从浏览器窗口顶部弹出,然后滑走?我们可以用纯 CSS 来实现它。

我们只需要创建一个 div
<div id="note">
You smell good.
</div>
然后我们对其进行样式设置并将其放在屏幕顶部
#note {
position: absolute;
z-index: 101;
top: 0;
left: 0;
right: 0;
background: #fde073;
text-align: center;
line-height: 2.5;
overflow: hidden;
-webkit-box-shadow: 0 0 5px black;
-moz-box-shadow: 0 0 5px black;
box-shadow: 0 0 5px black;
}
让我们来制作动画
使用关键帧动画,我们可以将其“隐藏”在浏览器窗口上方,并将其短暂地下拉
@-webkit-keyframes slideDown {
0%, 100% { -webkit-transform: translateY(-50px); }
10%, 90% { -webkit-transform: translateY(0px); }
}
@-moz-keyframes slideDown {
0%, 100% { -moz-transform: translateY(-50px); }
10%, 90% { -moz-transform: translateY(0px); }
}
呃……让我们快速考虑一下其他浏览器
但是让我们考虑一下那些没有转换和动画的浏览器。对于它们,我们希望默认情况下始终显示通知栏,并能够将其关闭。
因此,我们将制作 Modernizr 的自定义版本来测试转换和动画,加载它,然后我们可以编写 CSS 来测试这些功能,并且只有在支持这些功能的浏览器中才会触发动画。
.cssanimations.csstransforms #note {
-webkit-transform: translateY(-50px);
-webkit-animation: slideDown 2.5s 1.0s 1 ease forwards;
-moz-transform: translateY(-50px);
-moz-animation: slideDown 2.5s 1.0s 1 ease forwards;
}
其中的 1.0s 是动画运行之前的延迟时间。最好等待一分钟,以使通知更加显眼。
现在,我们将一个关闭按钮添加到 HTML 中
<div id="note">
You smell good. <a id="close">[close]</a>
</div>
以及一些 JavaScript 代码放在页面底部,以便不支持动画的浏览器可以关闭通知。
<script>
close = document.getElementById("close");
close.addEventListener('click', function() {
note = document.getElementById("note");
note.style.display = 'none';
}, false);
</script>
看,不需要任何库。
由于我们不需要在支持动画的浏览器中使用该关闭按钮,因此我们将将其隐藏起来
.cssanimations.csstransforms #close {
display: none;
}
记录一下,这在移动浏览器上应该可以正常工作(已在 Mobile Safari 上测试)。此处没有使用固定定位,只使用了绝对定位,这在未来会成为一个更小的问题(可能需要考虑将其设置为固定定位,这样即使用户向下滚动页面,他们也会收到通知)。
在淋浴下产生的另一个想法? ;-)
很酷的小技巧!但是
…并且也不支持 IE6、IE7 或 IE8,它们没有
addEventListener。我通常是 DOM2 样式处理程序附加(以及对attachEvent的回退)的忠实支持者,但对于如此简单的用例,传统的 DOM0 就可以使用您也陷入了 隐式全局变量的恐怖 的陷阱中,创建了全局
close和note变量。建议以下两种方法或
太好了,感谢 T.J.!
显然,我对 JavaScript 一窍不通。
我只是要把它做成 jQuery。显然,即使是如此简单的事情也有很多东西需要学习,我更愿意使用并推荐一些能正常工作的东西。
我个人喜欢在标记中实现这些“从顶部弹出的通知”,然后在某个 XHR 请求完成或 JavaScript 相关任务完成了一些魔法操作后调用它们。由于这不是基于 DOM 的事件,并且 JavaScript 本身已经知道何时触发元素,因此元素的触发可以通过 JavaScript 来完成。
(注意:在此示例中,我使用了正在开发的 XHR 对象,但用法应该很清楚。)
现在,您可以向元素添加一个类来实现效果,但浏览器支持仍然不够完善,因此您仍然需要使用 JavaScript 进行回退。尽管如此,这是一个很好的演示,但在这种情况下,我认为您选择了错误的用例。我希望有人反驳我,并看看这种消息在加载时或其他 DOM 事件中的用途。
这真是太棒了,而且正好是我需要这种小横幅的时候。
我的问题是,如果我想要使横幅在每次访问时只出现一次,而不是在每次在普通 HTML 页面中重新加载时都出现,应该怎么做?
我是否需要使用会话 cookie 之类的东西?
Torsten
您可以使用新的本地存储功能。
https://css-tricks.org.cn/13392-localstorage-examples/
如果它不存在,则执行从顶部弹出的通知并设置本地存储值。下次他们访问时,值将被设置,您可以绕过执行从顶部弹出的代码。
如果使用 localStorage,请确保也使用 cookie 提供良好的回退。localStorage 是 HTML5 功能,因此不受大多数现有浏览器的支持。
好的,localStorage 和 cookie,就是这样。谢谢大家!
@Jan-Martin
浏览器的支持实际上相当不错
Firefox 3.5、Safari 4、IE8、Chrome 4+ [ http://stackoverflow.com/questions/1194784#1195612 ]
您好 Chris,感谢您发布此内容。
还有一点,我在演示页面上的 IE8 中遇到了一个 JavaScript 错误。
“对象不支持此操作,PopFromTopMessage,第 77 行,第 4 个字符。”
请参见我上面的评论,IE8 不支持
addEventListener。上面给出的备用代码应该可以工作。感谢 T.J.
实际上,我并不想使用这段代码,我只是想让 Chris 知道这个错误。看起来他现在已经更改了代码,错误不再存在。
:)
这似乎是一种简洁的方式来“建议”您的用户尝试其他浏览器。
检测他们使用的浏览器,如果它是 IE 或旧版 FF 等等,则弹出横幅,建议他们升级/尝试其他浏览器。
好吧,如果上面提到的 IE7/8 中没有出现问题,那将是一个好主意 :)
您仍然可以这样做。IE 中还有其他事件监听器,您仍然可以进行浏览器检测并建议这样做,但我不会强制访问者这样做。
这是一个我们应该更多地倾向于使用 JavaScript 的灰色地带,尽管 CSS 也很有用。我不会费力地用 CSS 来实现它,但是可能有一些情况,您运行的是无 JavaScript 网站,但仍然想要实现它。我个人可以想象人们会使用帘幕效果作为登陆页面的介绍。
您还可以使用 Dynamic Drive 的粘性栏。只需放置一行文字,说明不建议使用此浏览器,然后他们将鼠标悬停,即可获得您推荐的浏览器的链接。您可以在 http://www.dynamicdrive.com/dynamicindex17/stickybar.htm 上了解更多信息。
不,我不为他们工作,我只是一个满意的用户。
我不喜欢用 CSS 做动画。这并不是它的用途。CSS 用于样式设置,而不是用于交互。JavaScript 应该管理动画。
我表示尊重地不同意。JavaScript 用于行为和交互,我同意,但动画本身是设计的一部分,理想情况是将其保留在 CSS 中。
何时追加此消息以及为什么是 JavaScript 的职责,但它是什么样子,它存在多长时间,它如何向下滑动,它是什么颜色等等,这些感觉更适合用 CSS 来实现。
我之前在某个地方看到过一句话:“如果能看到它,就用 CSS”,我不得不承认我赞同。我知道,要让酷炫的 CSS3 成为首选,并且完全摆脱 JS 兼容性问题,我们还需要一段时间,但我们必须相信,这已经是触手可及的事情了。
Lea Verou 在她的网站上也有类似的东西,我很喜欢这个。就像一个小提醒,不会让人感到完全厌烦。
嘿,为什么这里这个东西消失了?演示页面出问题了吗?还是其他什么原因?
我想看演示 :((
用纯 CSS 实现这一点真的很酷。但我有一个问题,note div 实际上会挡住“返回主页”按钮,我认为你应该用
display:none;来隐藏它,而不是简单地将其移出视图。我喜欢这个演示,但整个在页面顶部显示一个小通知然后消失的模式让我感到有点困扰。我之前在 Web 应用中见过这种模式,有几次我直到它开始动画消失才注意到通知。我想强调的是:确保你 a) 采取足够的措施在最初吸引用户对通知区域的注意;b) 让通知显示足够长的时间,以便用户注意到并真正阅读信息,然后再消失。如果没有考虑这些要点,可能会导致一些糟糕的可用性问题。
过去,当我构建类似的通知系统时,我只会使用一个字符计数器来解析通知中的词语数量,然后根据显示文本的长度来改变显示时间。一些想法 :)
-Andrew
太聪明了。
Chris,我不知道你是否知道,在英国,政府已经通过了一项法案,要求所有英国网站在存储 cookie 之前征得用户的同意。
这是一个愚蠢的法律,但他们已经这样做了。英国网站需要在明年某个时候之前遵守。
总之,我认为这可能是我们实现这一目标的一种方式。只有两个问题,一个是浏览器兼容性,另一个是它会自行消失,我希望它有一个“关闭”按钮。
Michael,
看看:http://cookiesdirective.com/
像往常一样,很棒的文章。
而且我喜欢 css-tricks.com 的设计。优雅而美丽。
太棒了。
- 来自芬兰的 Lauri
附注:Mikael Granlund 在 2011 年曲棍球世锦赛上对俄罗斯的进球……太厉害了
@Chris,你是想让第二个演示链接指向顶部的第一个演示吗?因为在第二个演示链接之前的代码中包含了我在演示中没有看到的“[关闭]”点击功能。很惊讶没人注意到。
只有在不支持过渡和转换的浏览器中查看时,你才能看到关闭点击功能。
像往常一样,很棒的教程。但用 CSS 来实现这一点似乎需要很多工作,所以我想知道与简单的 JQuery 代码相比,它的优势是什么。
$("#topnote").hide();
$("#topnote").delay('2000').slideToggle('slow');
$("#topnote").delay('10000').slideToggle('slow');
这样就可以了,而且你不必担心跨浏览器兼容性问题。
Mike
酷炫的教程。如果鼠标移到顶部附近,它会再次出现,那就更好了。
有没有一个不错的 WP 插件可以实现这个功能?
我会收到回复的通知吗?:-)
谢谢
你好,非常棒的文章,但我只有一个问题,是否可以像 http://salleedesign.com/portfolio/ 中那样,让信息一直显示,直到你把它关掉?谢谢!
对不起,如果你没有看到该信息,则需要访问该网站并按头部右侧的绿色按钮!:)
不错的技术。
只是在语义方面,你应该使用按钮而不是锚点来关闭,例如:
<button type=”button”>关闭</button>
<input type=”button” value=”关闭”>
哦,谢谢,我没有注意到。顺便问一下,如何实现,例如,如果我按了一次,就不想再显示它?谢谢!
@Chris Pearce,你为什么认为
button标签比链接更符合语义?Safari 似乎有一个 bug,它阻止你点击被 Note div 覆盖的任何东西,直到你点击它 5 次或更多次。我不确定应该改什么,因为在 Chrome 中它运行良好。
嘿,我正在我正在制作的一个网站上使用它,但我有一个问题。如何为多个通知实现这个功能?我刚开始学习编码,所以任何帮助都会感激不尽。
嘿,对于像我这样的新手来说,这是一个非常棒的网站。
我喜欢使用这个功能。问题是我的网站是 Joomla 1.7,我不知道首页是如何生成的。我的问题在这里发布。
http://forum.joomla.org/viewtopic.php?f=619&t=650761
请有人帮忙,这样我就可以在我的网站上使用这段代码。
非常感谢。
好的,进一步调查发现,它是 Joomla 1.7 根目录下的 index.php 生成首页。所以问题是如何在 index.php 中使用这段代码。
我懂一点 CSS,应该比较容易,但我不知道应该把这个 html 标签添加到哪里
div id=”note”>
建议使用 Firefox 浏览器浏览此网站。
/div>
(我知道粘贴的代码是错误的)
你好,我现在已经解决了这个问题。但是这个通知现在出现在每个页面,每次我刷新网站时都会出现。我只希望这个通知在每次访问时只出现一次,并且当访问者关闭它后,即使他们刷新网站,它也不应该再次出现。如何实现这一点?
我是一个新手。
你好,
很棒的功能!
我尝试着玩弄它;然而,我的栏一开始就出现在屏幕上。
如何解决这个问题?我应该更改哪些像素设置?
非常感谢,
Lee
不用了,我找到了解决方案
要解决这个问题,使像素数量小于屏幕(在 css #note 中)
-moz-transform: translateY(-550px)
我喜欢这个顶部通知滑块。如果有 WordPress 的插件就好了。
你们做得很好。
非常感谢!
我玩弄了一下,想弄清楚如何用 JS 触发功能。
要触发动画,将动画分离到一个唯一的 CSS 类,然后在需要时将该类分配给通知栏。
问题是,一旦动画完成,它就不会再次触发。解决方案是设置一个 setTimeout 函数,在动画结束时删除动画类。这样,你的脚本就可以一次又一次地重新启动动画。
祝你好运!
太棒了!
但是… 我怎样才能通过 JavaScript 触发消息?我想在顶部的消息栏里显示通知。
你好,
是否可以只在浏览会话中显示一次,作为 Cookie 警示窗口?你接受 Cookie 政策后,它就不会再弹出!… 有没有针对此的脚本?:)
提前感谢
概念:https://css-tricks.org.cn/redirecting-to-a-splash-page-but-only-once-with-cookies/
我遇到了一个问题,动画不起作用。我可能做错了什么?