css3转换动画加载?
是否可以在页面加载时使用CSS3转换动画而不使用Javascript 这正是我想要的,但在页面加载时: 到目前为止我发现了什么css3转换动画加载?,css,webkit,css-transitions,css-animations,Css,Webkit,Css Transitions,Css Animations,是否可以在页面加载时使用CSS3转换动画而不使用Javascript 这正是我想要的,但在页面加载时: 到目前为止我发现了什么 ,一种延迟元素效果的方法。仅适用于悬停 ,在负载下工作,但速度非常慢。正因为如此,它没有用处 速度足够快,但在页面加载时不设置动画 好吧,这是一个棘手的问题 答案是“不是真的” CSS不是一个功能层。它不知道发生了什么或什么时候。它只是用来向不同的“标志”(类、ID、状态)添加一个表示层 默认情况下,CSS/DOM不提供任何类型的“加载”状态供CSS使用。如果您想要
- ,一种延迟元素效果的方法。仅适用于悬停
- ,在负载下工作,但速度非常慢。正因为如此,它没有用处
- 速度足够快,但在页面加载时不设置动画
- 好吧,这是一个棘手的问题
答案是“不是真的”
CSS不是一个功能层。它不知道发生了什么或什么时候。它只是用来向不同的“标志”(类、ID、状态)添加一个表示层
默认情况下,CSS/DOM不提供任何类型的“加载”状态供CSS使用。如果您想要/能够使用JavaScript,您应该为
body
分配一个类或一些东西来激活一些CSS
也就是说,您可以为此创建一个hack。我在这里举个例子,但它可能适用于您的情况,也可能不适用于您的情况
我们的经营假设“接近”就是“足够好”:
我们还假设现代浏览器是渐进式渲染的,所以我们的最后一个元素将最后渲染,所以这个CSS将最后激活。不太可能,因为CSS会尽快应用,但元素可能还没有绘制出来。你可以猜到一到两秒的延迟,但这对大多数人来说并不合适,这取决于他们的互联网速度 此外,如果你想淡入一些东西,例如,它将需要CSS隐藏要交付的内容。如果用户没有CSS3转换,那么他们将永远看不到它 我建议使用jQuery(为了便于使用,您可能希望为其他UAs添加动画)和一些类似以下的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。使用鼠标悬停启动动画,而不是鼠标第一次在屏幕上移动时启动动画,这通常是在鼠标到达屏幕后的一秒钟内,问题是当鼠标离开屏幕时,动画会反转
html:hover #animateelementid, body:hover #animateelementid {rotate ....}
这是我能想到的最好的事情:
全屏:
编辑请参见下面的评论:这在任何触摸屏设备上都不起作用,因为没有悬停,因此除非用户点击,否则不会看到内容Rich Bradshaw好的,当页面仅使用css转换加载时,我成功地实现了动画效果(有点!) 我已经创建了2个css样式表: 第一个是我希望如何在动画之前设置html样式。。。 第二个问题是,在动画完成后,我希望页面如何显示 我不完全理解我是如何做到这一点的,但只有当两个css文件(都在我的文档的头部)被如下javascript分隔时,它才起作用 我已经用Firefox、safari和opera对此进行了测试。有时动画可以工作,有时它直接跳到第二个css文件,有时页面似乎正在加载,但什么也没有显示(可能只是我?)
$(文档).ready(函数(){
//iOS悬停事件类修复程序
if((navigator.userAgent.match(/iPhone/i))| |(navigator.userAgent.match(/iPod/i))||
(navigator.userAgent.match(/iPad/i))){
$(“.container.menu text”)。单击(function(){//更新类以指向列表的开头
});
}
});
以下是我正在进行的工作网站的链接:
也许我错了,但我认为不支持css转换的浏览器不应该有任何问题,因为它们应该直接跳到第二个css文件,不会有延迟或持续时间
我很想知道这种方法对搜索引擎有多友好。戴上我的黑帽子,我想我可以用关键词填充一个页面,并在其不透明度上应用9999秒的延迟
我很想知道搜索引擎是如何处理过渡延迟属性的,以及使用上面的方法,他们是否会看到页面上的链接和信息
更重要的是,我真的想知道为什么每次加载页面时都会出现不一致的情况,以及如何纠正这种情况
我希望这能产生一些看法和意见,如果没有别的 您可以在页面加载时运行CSS动画,而无需使用任何JavaScript;只需使用CSS3关键帧即可
让我们看一个例子。。。
以下是仅使用CSS3的导航菜单滑动到位的演示:
@关键帧从左滑入{
0% {
转化:translateX(-100%);
}
100% {
变换:translateX(0);
}
}
标题{
/*本节调用上面定义的slideInFromLeft动画*/
动画:1s从左滑出1s幻灯片;
背景:#333;
填充:30px;
}
/*为美观而添加*/body{margin:0;字体系列:“Segoe UI”,Arial,Helvetica,Sans Serif;}a{文本装饰:无;显示:内联块;右边距:10px;颜色:#fff;}
几乎不需要Javascript:
window.onload=function(){
document.body.className+=“已加载”;
}
现在CSS:
.fadein{
不透明度:0;
-moz转变:不透明度1.5s;
-webkit转换:不透明度1.5s;
-o-转变:不透明度1.5s;
过渡:不透明度1.5s;
}
body.loaded.fadein{
不透明度:1;
}
我知道问题是“没有Javascript”,但我认为值得指出的是,有一个简单的解决方案涉及一行Javascript
它甚至可以是内联Javascript,类似于:
这就是所需的全部JavaScript。类似于@Rolf的解决方案,但跳过对外部函数的引用或使用类。如果加载后不透明度保持固定为1,只需使用内联脚本通过样式直接更改不透明度。比如说
<body class="fadein" onload="this.style.opacity=1">
html:hover #animateelementid, body:hover #animateelementid {rotate ....}
<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" />
<body class="fadein" onload="this.style.opacity=1">
#main p {
animation: fadein 2s;
}
@keyframes fadein {
from { opacity: 0}
to { opacity: 1}
}
<body class="existing-class-name" onload="document.body.classList.add('loaded')">
<div class="image-wrapper">
<img src="db-image.jpg" alt="db-image-name">
<span class="text-over-image">DB text</span>
</div>
.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;
}
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; }
}
<body class="onload" onload="document.querySelector('body').classList.remove('onload')">
body.onload *{ transform: none !important; }
#rotated{
transform : rotate(90deg) /* any other transformation */;
transition 3s;
}
#translated{
transform : translate(90px) /* any other transformation */;
transition 3s;
}
.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">
// or body onload ?
[...document.querySelectorAll('.waitload')]
.map(e => e.classList.remove('waitload'));
</script>
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>
);
};
body{animation: 2s ease-out 0s 1 FadeIn;}
@keyframes FadeIn {
0% {
opacity:0;
}
100% {
opacity:1;
}
}