CSS Animation vor Redirect?
Hallo, ich hatte schonmal so eine ähnliche Frage gestellt aber bekomme es einfach nicht hin. Nun hab ich eine kleine Testumgebung gebaut, in der ich folgendes möchte:
Die Eingangsanimation spielt sich automatisch ab wenn die Seite geladen ist. Klicke ich auf den Go-Button in der Mitte (Später sollte das bei jedem Button passieren der eine bestimmte Klasse hat) dann soll der Klasse "intro" die Klasse "animation_out" hinzugefügt werden. Nach einer bestimmten Zeit (Am besten händisch per Ms änderbar) soll dann erst der Redirect erfolgen.
Gibt es da eine EINFACHE Lösung für Anfänger wie mich?
XXXXXXXX_____HTML_____XXXXXXXX
<div class="intro">
</div>
<a class="testbutton" href="#">GO</a>
XXXXXXXX_____CSS_____XXXXXXXX
body{
margin: 0;
padding: 0;
}
.intro{
width: 100%;
height: 100vh;
position: fixed;
z-index: 9999;
padding: 0;
background-color: #000;
overflow: hidden;
pointer-events: none;
-webkit-animation: animation_in 1s 1; /* Safari 4.0 - 8.0 /
animation: animation_in 1s 1;
animation-fill-mode: forwards;
}
@keyframes animation_in {
0% {height: 100%;}
100% {height: 20px;}
}
.animation_out{
-webkit-animation: animation_out 1s 1; /* Safari 4.0 - 8.0 /
animation: redirectanimationout 1s 1;
}
@keyframes redirectanimationout {
0% {height: 20px;}
100% {height: 100%;}
}
.testbutton{
position: absolute;
background-color: #000;
color: #fff;
width: 50px;
padding: 5px 0;
text-align: center;
float: 0 auto;
margin-top: 50vh;
margin-left: calc(50% - 25px);
}
3 Antworten
Das lässt sich nur mittels JavaScript bewerkstelligen. Hier ein Beispiel mit jQuery, wobei es aber auch ohne jQuery (pures JavaScript) funktioniert, Google und MDN helfen weiter.
$('.testbutton').click(function(){ //Wenn Element mit der Klasse testbutton geklickt wird...
$('.intro').addClass('animation_out'); //Füge dem Element mit der Klasse intro die Klasse animation_out hinzu
setTimeout(function(){ //Und leite nach 1000ms (1s) auf seite2.html weiter
window.location.href = "seite2.html";
}, 1000);
});
Im obigen Fall werden sich alle Links, die die Klasse testbutton haben, schon entsprechend verhalten. Dafür sorgt der Selektor:
$('.testbutton')
Ohne jQuery könnte eine Lösung so aussehen:
let testbuttons = document.getElementsByClassName("testbutton");
for (let i = 0; i < testbuttons.length; ++i) {
testbuttons[i].addEventListener("click", function() {
// redirect ...
});
}
Oder man selektiert tatsächlich alle Links:
let testbuttons = document.getElementsByTagName("a");
// ...
Wie? Du meinst, wenn du mehrere Buttons hast, die jeweils woanders hinleiten sollen, mit der gleichen Animation? Theoretisch machbar, bedarf aber einer kleinen Umstellung deiner Struktur.
Du gibst jedem Button eine ID, z.B. id="button1", id="button2" usw.
Das JavaScript sähe dann (beispielhaft) so aus:
$('.testbutton').click(function(e){ //Wenn ein Element mit der Klasse testbutton geklickt wird...
e.preventDefault() //Standardevent/Weiterleitung des a-Elements deaktivieren
let buttonId = $(this).attr('id').replace('button', ''); //ID des geklickten Elements ohne das "button" speichern
$('.intro').addClass('animation_out'); //Füge dem Element mit der Klasse intro die Klasse animation_out hinzu
setTimeout(function(){ //Und leite nach 1000ms (1s) auf seite[id].html weiter, wo [id] die zuvor gespeicherte ID ist
window.location.href = "seite"+id+".html";
}, 1000);
});
Ansonsten, wenn ALLE a-Elemente mit der Animation weiterleiten sollen, kann man natürlich auch über $('a') diese direkt anvisieren. Hängt eben davon ab, was genau du vor hast und wie das Setup aussieht.
Ich versuch das ganze grad in Codepen zu testen aber es funktioniert irgendwie nicht. Muss ich da noch ein bestimmtes Script laden damit das überhaupt funktioniert?
Wenn du das unter Codepen testest, solltest du jQuery auch aktivieren. Settings -> JavaScript -> dort im Bereich "Search CDNjs" nach jQuery suchen -> hinzufügen
Mit JavaScript kannst du über die setTimeout-Funktion eine Weiterleitung zeitlich steuern.
In diesem Fall:
setTimeout(function() { window.location.href = "YOUR_TARGET_URL"; }, 1000);
würde die Aktion nach einer Sekunde ausgeführt werden.
Nachdem dem Link die CSS-Klasse zugefügt wurde, kannst du den Timer starten.
einfach nicht mit einem a element weiterleiten sondern über javacript
in javascript kannst du auch auf das animationend event lauschen und dann erst wenn die animation vorbei ist weiterleiten:
einfach nicht mit einem a element weiterleiten sondern über javacript:
const button = document.querySelector(".testbutton");
button.onclick = () => {
button.style.animation = "redirectanimationout 1s 1";
button.onanimationend = () => {
window.location.href="https://www.gutefrage.net";
}
}
Kann ich das
setTimeout(function(){ window.location.href = "seite2.html";}, 1000);
auch direkt auf ALLE Links anwenden? Sonst bräuchte ich ja für jeden ausgehenden Link ein eigenes Script?