Ich möchte ein "Scan" -Licht simulieren, das Wörter in einer Box enthüllt. Dies ist jetzt mein Code:
const e = document.getElementsByClassName('scan')[0];
document.onmousemove = function(event){
e.style.left = `${event.clientX}px`;
};
*{
margin: 0;
padding: 0;
}
html, body{
width: 100%;
min-height: 100vh;
overflow-x: hidden;
display: flex;
}
.banner{
width: 100vw;
height: 100vh;
display: flex;
flex-grow: 1;
flex-direction: row;
align-items: center;
background-color: #031321;
}
.banner .scan{
width: 7px;
height: 80%;
position: absolute;
left: 30px;
z-index: 3;
transition: left 50ms ease-out 0s;
border-radius: 15px;
background-color: #fff;
box-shadow:
0 0 15px 5px #fff, /* inner white */
0 0 35px 15px #008cff, /* inner blue */
0 0 350px 20px #0ff; /* outer cyan */
}
.banner .description{
width: 100%;
color: white;
font-size: 3em;
text-align: center;
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
}
<div class="banner">
<div class="scan"></div>
<div class="description">
Just trying something
</div>
</div>
Die Idee ist, die Wörter im .description
Div entsprechend der Position des Scanlichts anzuzeigen. Wenn möglich, möchte ich nur CSS verwenden, um diesen Effekt zu erzielen, und JavaScript nur verwenden, um den Scan zu verschieben (der weiter zu einer CSS-Animation wird). Ich habe versucht, einige Pseudoelemente zu verwenden, aber es hat nicht gut funktioniert. Hier ist ein Beispiel, wie diese Animation funktionieren sollte.
clip-path
, vor allem, weil ich irgendwann nur noch ein paar Wörter aus einer Phrase verstecken werde, sodass mehr Elemente mit dem Clip erforderlich wären, aber trotzdem danke! Nur ein Beispiel für die Funktionsweise der Animation hinzugefügt, kann hilfreich sein.Versuchen Sie es wie folgt:
const e = document.getElementsByClassName('cover')[0]; e.addEventListener('click', animate); function animate() { e.classList.add('scanning'); }
*{ margin: 0; padding: 0; } html, body{ width: 100%; min-height: 100vh; overflow-x: hidden; display: flex; } .banner{ width: 100vw; height: 100vh; display: flex; flex-grow: 1; flex-direction: row; align-items: center; background-color: #031321; } .banner .cover{ position: absolute; left: 30px; z-index: 3; height: 80%; width:100vw; background-color: #031321; transition: left 700ms ease-out 0s; } .banner .cover.scanning { left: calc(100% - 30px); } .banner .scan{ width: 7px; height:100%; transition: left 50ms ease-out 0s; border-radius: 15px; background-color: #fff; box-shadow: 0 0 15px 5px #fff, /* inner white */ 0 0 35px 15px #008cff, /* inner blue */ 0 0 350px 20px #0ff; /* outer cyan */ } .banner .description{ width: 100%; color: white; font-size: 3em; text-align: center; -webkit-user-select: none; -ms-user-select: none; user-select: none; }
<div class="banner"> <div class="cover"> <div class="scan"> </div> </div> <div class="description"> Just trying something </div> </div>
Diese Lösung verwendet eine Abdeckung rechts vom Scan mit derselben Hintergrundfarbe wie das Banner. Das Cover bewegt sich mit dem Scan. Wenn sich der Scan nach rechts bewegt, wird der Text auf der linken Seite angezeigt. Es funktioniert, indem Sie in dieser Demo darauf klicken. Sie können es jedoch in JavaScript initiieren, es ist jedoch am besten für Sie.
quelle
Scheint ein wenig knifflig. Die erste Lösung, die mir in den Sinn kommt, ist möglicherweise die Verwendung eines linearen Gradienten mit einem dynamischen "Haltepunkt" an der Position des Lichtbalkens. Der Farbverlauf reicht von dunkel -> transparent (Lichtbalkenposition) -> dunkel. Der Code sieht vielleicht so aus:
.description-overlay { /* Replace 50% with the position of the light bar. Get brighter and more transparent as you approach the position of the light bar. */ background: linear-gradient(to right, #000, 50% hsla(0, 0%, 100%, 0.2), #000); }
Ich bin mir nicht sicher, ob dies funktionieren wird und es würde wahrscheinlich irgendwo einen Kastenschatten brauchen, aber vielleicht gibt es Ihnen einige Ideen.
quelle