JSFiddle - React, Tailwind, and code Playground
HTML
<section>
<p>Ce n'est pas un MARQUEE ni une chicha.</p>
<div>
<p>TEXTE Défilant sur la page.</p>
</div>
<article>
<h1>HTML Ipsum Presents</h1>
<p><strong>Pellentesque habitant morbi tristique</strong> senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. <em>Aenean ultricies mi vitae est.</em> Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, <code>commodo vitae</code>, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. <a href="#">Donec non enim</a> in turpis pulvinar facilisis. Ut felis.</p>
<h2>Header Level 2</h2>
<ol>
<li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li>
<li>Aliquam tincidunt mauris eu risus.</li>
</ol>
<blockquote>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus magna. Cras in mi at felis aliquet congue. Ut a est eget ligula molestie gravida. Curabitur massa. Donec eleifend, libero at sagittis mollis, tellus est malesuada tellus, at luctus turpis elit sit amet quam. Vivamus pretium ornare est.</p>
</blockquote>
<h3>Header Level 3</h3>
<ul>
<li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li>
<li>Aliquam tincidunt mauris eu risus.</li>
</ul>
<pre><code>
#header h1 a {
display: block;
width: 300px;
height: 80px;
}
</code></pre>
</article>
</section>
CSS
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
section>:is(p, div) {
position: absolute;
top: 0;
left: 0;
}
section>p,
section>div>p {
width: max-content;
/*text-shadow: calc(var(--offsetText) * 1px + 0.5em) 0,
calc(var(--offsetText) * -1px - 0.5em) 0,
calc(var(--offsetText) * 2 * 1px + 1em) 0,
calc(var(--offsetText) * 2 * -1px - 1em) 0,
calc(var(--offsetText) * 3 * 1px + 1.5em) 0,
calc(var(--offsetText) * 3 * -1px - 1.5em) 0,
calc(var(--offsetText) * 4 * 1px + 2em) 0,
calc(var(--offsetText) * 4 * -1px - 2em) 0,
calc(var(--offsetText) * 5 * 1px + 2.5em) 0,
calc(var(--offsetText) * 5 * -1px - 2.5em) 0,
calc(var(--offsetText) * 6 * 1px + 3em) 0,
calc(var(--offsetText) * 6 * -1px - 3em) 0,
calc(var(--offsetText) * 7 * 1px + 3.5em) 0,
calc(var(--offsetText) * 7 * -1px - 3.5em) 0,
calc(var(--offsetText) * 8 * 1px + 4em) 0,
calc(var(--offsetText) * 8 * -1px - 4em) 0,
calc(var(--offsetText) * 9 * 1px + 4.5em) 0,
calc(var(--offsetText) * 9 * -1px - 4.5em) 0,
calc(var(--offsetText) * 10 * 1px + 5em) 0,
calc(var(--offsetText) * 10 * -1px - 5em) 0;*/
min-width: var(--slideText);
animation: slide 6s infinite linear reverse;
border: solid 1px rgba(255, 255, 255, 0);
font-size: var(--textS);
color: tomato;
margin: 0;
line-height: 0.8;
-webkit-text-stroke: purple 0.02em;
background: rgba(255, 255, 255, 0);
}
section {
height: 100vh;
width: 100vw;
overflow: hidden;
border: solid;
position: relative;
padding: var(--padBox) 0 0 var(--padBox) ;
}
section>p {
animation-delay: -3s;
rotate: -90deg;
transform-origin:0 0;
/*compense la position d'affichage en fonction de la largeur initiale de la boite */
top:100%;
/**left:var(--offleft);*/
color: lime;
z-index: 1;
background: rgba(255, 255, 255, 0);
mix-blend-mode: lighten;
}
@keyframes slide {
from {
text-indent:var(--slideText);
}
50% {
-webkit-text-stroke: gold...
JavaScript
window.onload = function() {
const FontSize = 140;
let p = document.querySelectorAll('body>section>p , body>section>div>p');
const TextGap = FontSize / 3.75;
const padBox = FontSize * .97;
document.documentElement.style.setProperty('--textS', FontSize + 'px');
document.documentElement.style.setProperty('--padBox', padBox + 'px');
for (i = 0; i < p.length; i++) {
let tidt = p[i].clientWidth;
p[i].style.setProperty('--offsetText', tidt);
let offslide = tidt + TextGap;
p[i].style.setProperty('--slideText', '-' + offslide + 'px')
let textrepeat = p[i].textContent;
p[i].textContent = textrepeat +' '+ textrepeat +' ' + textrepeat +' ' + textrepeat;
}
}