J'ai créé un en-tête (le mot de bienvenue) qui se révèle une fois la page chargée (onload=""
).
Fiddle au cas où le code ci-dessous ne fonctionnerait pas.
function animate() {
document.getElementById("mainText").style.width = "100%";
}
#mainText {
margin: 0px;
display: inline-block;
font-size: 100px;
width: 0%;
transition: width 2s;
white-space: nowrap;
overflow: hidden;
text-overflow: clip;
}
<body onload="animate()">
<h1 id="mainText">Welcome</h1>
</body>
CSS et Plain JS fonctionnent bien, mais je veux que le mot "Welcome" soit d'abord révélé, puis de droite à droite, puis du e au W, au lieu de ce qu'il est actuellement, qui s'ouvre de gauche à droite.
J'ai essayé text align: right;
, mais cela ne change rien.
De préférence, je ne souhaite pas utiliser jQuery, si la solution est une solution JS.
Voici un exemple de l'apparence souhaitée, à mi-chemin de la transition:
Oui, il est possible d’utiliser Transitions et Positions:
window.onload = function () {
document.querySelector("h1").classList.add("active");
};
h1 {
overflow: hidden;
display: inline-block;
position: relative;
}
h1 .mask {
position: absolute;
transition: all 0.5s linear;
left: 0;
top: 0;
bottom: 0;
right: 0;
background-color: #fff;
}
h1.active .mask {
right: 100%;
}
<h1><span class="mask"></span>Welcome</h1>
Je viens d'écrire un article à ce sujet - Transitions CSS et JavaScript pour les effets d'entrée animés . J'espère que c'est utile ... :)
Vous pouvez utiliser la propriété clip-path pour découper des parties de l'élément afin qu'elles ne soient pas visibles. Cette propriété peut également être animée pour révéler l'élément à nouveau, en utilisant le mot clé forwards
dans l'animation afin qu'il reste dans son état de fin "révélé".
La inset
prend des valeurs qui sont dans l’ordre: du haut, de droite, du bas, de gauche.
#text {
margin: 0;
font-size: 100px;
animation: reveal 2s forwards;
}
@keyframes reveal {
from {
clip-path: inset(0 0 0 100%);
}
to {
clip-path: inset(0 0 0 0);
}
}
<h1 id="text">Welcome</h1>
Une option est transform: translate
avec un pseudo-élément et aucun élément supplémentaire n'est nécessaire.
function animate() {
document.getElementById("mainText").classList.add('show');
}
#mainText {
position: relative;
margin: 0px;
display: inline-block;
font-size: 100px;
white-space: nowrap;
text-overflow: clip;
overflow: hidden;
}
#mainText::after {
content: '';
position: absolute;
left: 0; top: 0;
width: 100%; height: 100%;
background: white;
transition: transform 2s;
}
#mainText.show::after {
transform: translateX(-100%);
}
<body onload="animate()">
<h1 id="mainText">Welcome</h1>
</body>
Une autre option, une solution encore meilleure, consiste à utiliser le pseudo avec direction
et left
/width
.
Celui-ci fonctionne de la même manière que clip-path
, totalement transparent sur son arrière-plan, contrairement à un masque qui révèle le texte, et avec un support de navigateur bien meilleur.
function animate() {
document.getElementById("mainText").classList.add('show');
}
body {
background: black;
}
#mainText {
position: relative;
margin: 0px;
display: inline-block;
font-size: 100px;
white-space: nowrap;
color: rgba(0, 0, 0, 0);
}
#mainText::before {
content: attr(data-text);
position: absolute;
left: 100%;
top: 0;
width: 0;
height: 100%;
color: white;
direction: rtl;
overflow: hidden;
transition: left 2s, width 2s;
}
#mainText.show::before {
left: 0;
width: 100%;
}
<body onload="animate()">
<h1 id="mainText" data-text="Welcome">Welcome</h1>
</body>
Quelque chose comme ça
function animate() {
document.getElementById("overlay").style.width = "0%";
}
#mainText {
margin: 0px;
display: inline-block;
font-size: 100px;
width: 100%;
white-space: nowrap;
overflow: hidden;
text-overflow: clip;
}
#overlay{
width: 100%;
position:absolute;
top:0;
left:0;
background:#fff;
transition: width 2s;
height:100%;
}
<body onload="animate()">
<h1 id="mainText">Welcome</h1>
<div id="overlay"></div>
</body>
J'utilise Transform: translateX
pour obtenir l'effet désiré.
Il glisse le texte latéralement ou horizontalement sur l’axe des X.
.message {
color: darkred;
font-size: 30px;
display: inline-block;
font-weight: 100;
font-family: sans-serif;
}
.sliding-text-1,
.sliding-text-2,
.sliding-text-3 {
animation-name: slide;
animation-duration: 1s;
animation-timing-function: ease-out;
animation-iteration-count: 1;
animation-fill-mode: forwards;
opacity: 0;
}
.sliding-text-2 {
animation-delay: 2s;
color: darkblue;
}
.sliding-text-3 {
animation-delay: 4s;
color: darkgreen;
}
@keyframes slide {
from {
transform: translateX(200px);
}
to {
transform: translateX(0px);
opacity: 1;
}
}
<h1 class="message sliding-text-1">Hello!</h1>
<h1 class="message sliding-text-2">Thanks for visiting!</h1>
<h1 class="message sliding-text-3">Have a Nice day!</h1>
Cela nécessite un pseudo-élément avec un arrière-plan au-dessus de votre en-tête servant de masque. Au lieu de modifier les styles en ligne, je vais simplement ajouter une classe is-active
. Donc, tout ce qui concerne le style peut être stylé via CSS.
function animate() {
document.getElementById("mainText").className = "is-active";
}
#mainText {
margin: 0px;
display: inline-block;
position: relative;
font-size: 100px;
white-space: nowrap;
overflow: hidden;
text-overflow: clip;
}
#mainText:before {
content: '';
position: absolute;
top: 0;
left: 0;
bottom: 0;
width: 100%;
background: #FFF;
transition: width 2s;
}
#mainText.is-active:before {
width: 0%;
}
<body onload="animate()">
<h1 id="mainText">Welcome</h1>
</body>