是否可以在不使用 Javascript 的情况下在页面加载时使用 CSS3 过渡动画?
这是我想要的,但是在页面加载时:
http://rilwis.googlecode.com/svn/trunk/demo/image-slider.html
到目前为止我发现了什么
- CSS3 transition-delay,一种延迟元素效果的方法。仅适用于悬停。
- CSS3 Keyframe,在加载时工作,但速度极慢。因此没有用。
- CSS3 过渡速度足够快,但在页面加载时没有动画。
是否可以在不使用 Javascript 的情况下在页面加载时使用 CSS3 过渡动画?
这是我想要的,但是在页面加载时:
http://rilwis.googlecode.com/svn/trunk/demo/image-slider.html
到目前为止我发现了什么
您可以在不使用任何 JavaScript 的情况下在页面加载时运行CSS动画;你只需要使用CSS3 Keyframes。
这是一个仅使用CSS3滑动到位的导航菜单演示:
@keyframes slideInFromLeft {
0% {
transform: translateX(-100%);
}
100% {
transform: translateX(0);
}
}
header {
/* This section calls the slideInFromLeft animation we defined above */
animation: 1s ease-out 0s 1 slideInFromLeft;
background: #333;
padding: 30px;
}
/* Added for aesthetics */ body {margin: 0;font-family: "Segoe UI", Arial, Helvetica, Sans Serif;} a {text-decoration: none; display: inline-block; margin-right: 10px; color:#fff;}
<header>
<a href="#">Home</a>
<a href="#">About</a>
<a href="#">Products</a>
<a href="#">Contact</a>
</header>
这里的重要部分是关键帧动画,我们称之为slideInFromLeft
...
@keyframes slideInFromLeft {
0% {
transform: translateX(-100%);
}
100% {
transform: translateX(0);
}
}
...它基本上说“在开始时,标题将离开屏幕的左侧边缘,其全宽,最后将就位”。
第二部分是调用该slideInFromLeft
动画:
animation: 1s ease-out 0s 1 slideInFromLeft;
以上是简写版本,但为了清楚起见,这里是详细版本:
animation-duration: 1s; /* the duration of the animation */
animation-timing-function: ease-out; /* how the animation will behave */
animation-delay: 0s; /* how long to delay the animation from starting */
animation-iteration-count: 1; /* how many times the animation will play */
animation-name: slideInFromLeft; /* the name of the animation we defined above */
你可以做各种有趣的事情,比如滑动内容,或者吸引注意力。
很少需要 Javascript:
window.onload = function() {
document.body.className += " loaded";
}
现在的CSS:
.fadein {
opacity: 0;
-moz-transition: opacity 1.5s;
-webkit-transition: opacity 1.5s;
-o-transition: opacity 1.5s;
transition: opacity 1.5s;
}
body.loaded .fadein {
opacity: 1;
}
我知道问题是“没有 Javascript”,但我认为值得指出的是,有一个简单的解决方案涉及一行 Javascript。
它甚至可以是内联 Javascript,例如:
<body onload="document.body.className += ' loaded';" class="fadein">
这就是所有需要的 JavaScript。
我想我已经为 OP 问题找到了一种解决方法——而不是从页面的“on.load”开始的过渡——我发现使用动画进行不透明度淡入具有相同的效果,(我一直在寻找与OP相同)。
所以我想让正文文本在页面加载时从白色(与网站背景相同)淡入到黑色文本颜色 - 我从星期一开始才开始编码,所以我正在寻找一个“on.load”风格的东西代码,但还不知道 JS - 所以这是我的代码对我来说效果很好。
#main p {
animation: fadein 2s;
}
@keyframes fadein {
from { opacity: 0}
to { opacity: 1}
}
无论出于何种原因,这.class
仅适用于#id
's(至少不适用于我的)
希望这会有所帮助 - 因为我知道这个网站对我有很大帮助!
嗯,这是一个棘手的问题。
答案是“不是真的”。
CSS 不是功能层。它不知道发生了什么或何时发生。它仅用于将表示层添加到不同的“标志”(类、ID、状态)。
默认情况下,CSS/DOM 不提供任何类型的“加载”状态供 CSS 使用。如果你想要/能够使用 JavaScript,你会分配一个类body
或一些东西来激活一些 CSS。
话虽如此,您可以为此创建一个hack。我将在这里举一个例子,但它可能适用于您的情况,也可能不适用于您的情况。
我们的操作假设“接近”是“足够好”:
<html>
<head>
<!-- Reference your CSS here... -->
</head>
<body>
<!-- A whole bunch of HTML here... -->
<div class="onLoad">OMG, I've loaded !</div>
</body>
</html>
这是我们的 CSS 样式表的摘录:
.onLoad
{
-webkit-animation:bounceIn 2s;
}
我们还假设现代浏览器是渐进式渲染的,所以我们的最后一个元素将最后渲染,因此这个 CSS 将最后激活。
CSS 仅延迟 3s
这里有几点需要注意:
代码:
header {
animation: 3s ease-out 0s 1 wait, 0.21s ease-out 3s 1 slideInFromBottom;
}
@keyframes wait {
from { transform: translateY(20px); }
to { transform: translateY(20px); }
}
@keyframes slideInFromBottom {
from { transform: translateY(20px); opacity: 0; }
to { transform: translateY(0); opacity: 1; }
}
将此添加到您的 css 以淡入动画
body{animation: 2s ease-out 0s 1 FadeIn;}
@keyframes FadeIn {
0% {
opacity:0;
}
100% {
opacity:1;
}
}
如果您希望加载速度较慢,请增加缓出时间
用 body 的 hover 启动它会在鼠标第一次在屏幕上移动时启动,这大多是在到达后的一秒钟内,这里的问题是它在离开屏幕时会反转。
html:hover #animateelementid, body:hover #animateelementid {rotate ....}
这是我能想到的最好的事情:http: //jsfiddle.net/faVLX/
全屏:http: //jsfiddle.net/faVLX/embedded/result/
编辑请参阅下面的评论:
这在任何触摸屏设备上都不起作用,因为没有悬停,因此除非点击它,否则用户将看不到内容。– 丰富的布拉德肖
类似于@Rolf 的解决方案,但跳过对外部函数的引用或使用类。如果 opacity 在加载后保持固定为 1,只需使用内联脚本通过 style 直接更改 opacity。例如
<body class="fadein" onload="this.style.opacity=1">
其中CSS样式“fadein”是根据@Rolf定义的,定义过渡并将不透明度设置为初始状态(即0)
唯一的问题是这不适用于 SPAN 或 DIV 元素,因为它们没有工作 onload 事件
甚至更简单的解决方案(仍然使用 [单行内联] javascript):
将此用作正文标签:请注意,body.
或this.
对我不起作用。只有长; querySelector
允许使用classList.remove
(Linux Chromium)
<body class="onload" onload="document.querySelector('body').classList.remove('onload')">
并将这一行添加到您的其他 CSS 规则之上。
body.onload *{ transform: none !important; }
请注意,这可以适用于不透明度(根据 OP [其他海报] 的要求),只需使用不透明度作为过渡触发器即可。(甚至可以以相同的方式处理任何其他 css 规则,您可以使用多个类来显式延迟触发之间)
逻辑是一样的。强制不转换(:none !important
在所有子元素上使用,body.onload
并且一旦加载文档,删除类以触发所有元素上的所有转换,如您的 css.xml 文件中指定的那样)
下面的第一个答案(请参阅上面的编辑以获得更短的答案)
这是一个反向解决方案:
适用于多个元素的多个过渡。没有尝试跨浏览器兼容性。
div {
width: fit-content;
}
#rotated {
transform: rotate(-50deg)/* any other transformation */
;
transition: 6s;
}
#translated {
transform: translate(90px)/* any other transformation */
;
transition: 6s;
}
.waitload {
transform: none !important;
}
<div id='rotated' class='waitload'>
rotate after load
</div>
<div id='translated' class='waitload'>
trasnlate after load
</div>
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', init);
function init() {
[...document.querySelectorAll('.waitload')]
.map(e => e.classList.remove('waitload'));
}
</script>
好的,当页面仅使用 css 转换(有点!)加载时,我已经设法实现了动画:
我创建了 2 个 css 样式表:第一个是我希望在动画之前设置 html 样式的方式......第二个是我希望页面在动画执行后如何查看。
我不完全理解我是如何做到这一点的,但它只有在两个 css 文件(都在我的文档头部)被一些 javascript 分隔时才有效,如下所示。
我已经用 Firefox、safari 和 opera 对此进行了测试。有时动画有效,有时它直接跳到第二个 css 文件,有时页面似乎正在加载但没有显示任何内容(也许只是我?)
<link media="screen,projection" type="text/css" href="first-css-file.css" rel="stylesheet" />
<script language="javascript" type="text/javascript" src="../js/jQuery JavaScript Library v1.3.2.js"></script>
<script type='text/javascript'>
$(document).ready(function(){
// iOS Hover Event Class Fix
if((navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i)) ||
(navigator.userAgent.match(/iPad/i))) {
$(".container .menu-text").click(function(){ // Update class to point at the head of the list
});
}
});
</script>
<link media="screen,projection" type="text/css" href="second-css-file.css" rel="stylesheet" />
这是我正在进行的网站的链接:http ://www.hankins-design.co.uk/beta2/test/index.html
也许我错了,但我认为不支持 css 转换的浏览器不应该有任何问题,因为它们应该直接跳到第二个 css 文件,没有延迟或持续时间。
我很想知道对这种方法对搜索引擎的友好程度的看法。戴上黑帽我想我可以用关键字填充页面并对其不透明度应用 9999s 延迟。
我很想知道搜索引擎如何处理转换延迟属性,以及使用上面的方法,他们是否甚至会看到页面上的链接和信息。
更重要的是,我真的很想知道为什么每次页面加载时都不一致,以及如何纠正这个问题!
如果不出意外,我希望这能产生一些看法和意见!
如果其他人同时进行两次转换时遇到问题,这就是我所做的。我需要文本在页面加载时从上到下。
HTML
<body class="existing-class-name" onload="document.body.classList.add('loaded')">
HTML
<div class="image-wrapper">
<img src="db-image.jpg" alt="db-image-name">
<span class="text-over-image">DB text</span>
</div>
CSS
.text-over-image {
position: absolute;
background-color: rgba(110, 186, 115, 0.8);
color: #eee;
left: 0;
width: 100%;
padding: 10px;
opacity: 0;
bottom: 100%;
-webkit-transition: opacity 2s, bottom 2s;
-moz-transition: opacity 2s, bottom 2s;
-o-transition: opacity 2s, bottom 2s;
transition: opacity 2s, bottom 2s;
}
body.loaded .text-over-image {
bottom: 0;
opacity: 1;
}
不知道为什么我一直尝试在 1 个选择器中使用 2 个转换声明,并且(不是真的)认为它会同时使用两者。
您也可以使用自定义 css 类 (className) 而不是 css 标签。无需外部封装。
import React, { useState, useEffect } from 'react';
import { css } from '@emotion/css'
const Hello = (props) => {
const [loaded, setLoaded] = useState(false);
useEffect(() => {
// For load
setTimeout(function () {
setLoaded(true);
}, 50); // Browser needs some time to change to unload state/style
// For unload
return () => {
setLoaded(false);
};
}, [props.someTrigger]); // Set your trigger
return (
<div
css={[
css`
opacity: 0;
transition: opacity 0s;
`,
loaded &&
css`
transition: opacity 2s;
opacity: 1;
`,
]}
>
hello
</div>
);
};
并非如此,因为 CSS 会尽快应用,但元素可能尚未绘制。您可能会猜到 1 或 2 秒的延迟,但这对于大多数人来说并不合适,具体取决于他们的互联网速度。
此外,例如,如果您想淡入某些内容,则需要隐藏要传递的内容的 CSS。如果用户没有 CSS3 过渡,那么他们将永远看不到它。
我建议使用 jQuery(为了便于使用 + 您可能希望为其他 UA 添加动画)和一些像这样的 JS:
$(document).ready(function() {
$('#id_to_fade_in')
.css({"opacity":0}) // Set to 0 as soon as possible – may result in flicker, but it's not hidden for users with no JS (Googlebot for instance!)
.delay(200) // Wait for a bit so the user notices it fade in
.css({"opacity":1}); // Fade it back in. Swap css for animate in legacy browsers if required.
});
连同在 CSS 中添加的过渡。如果需要,这样做的好处是可以轻松地允许在旧版浏览器中使用动画而不是第二个 CSS。