文字を一文字ずつフェードインさせる処理の改良版になります。
一応自作ですので不具合等あるかも知れません。
JavaScriptを使って表現しております。またテキストが見え始めたら処理するようにもしております。
言葉ではわからないと思うので、ぜひ処理を見ていただければと思います。
文字を一文字ずつフェードインさせる処理です
同時にバーも伸びる仕様です。2行表示させてます。基本的に一行で収まる様にしてください。二行に(改行)されると綺麗に動かないと思います
document.addEventListener('DOMContentLoaded', function() { // 一文字ずつ表示 character_by_character("one-word-box", "one-word-text", 0.5, 0.05 ); create_a_bar("one-word-box", "one-word-back-box", "one-word-text", 0.5, 0.05 ); character_by_character("one-word-box2", "one-word-text2", 0.5, 0.05 ); create_a_bar("one-word-box2", "one-word-back-box2", "one-word-text2", 0.5, 0.05 ); }); // スクロール時の処理 document.addEventListener('DOMContentLoaded', function() { window.addEventListener( 'scroll', function() { // 一文字ずつ表示 character_by_character("one-word-box", "one-word-text", 0.5, 0.05 ); create_a_bar("one-word-box", "one-word-back-box", "one-word-text", 0.5, 0.05 ); character_by_character("one-word-box2", "one-word-text2", 0.5, 0.05 ); create_a_bar("one-word-box2", "one-word-back-box2", "one-word-text2", 0.5, 0.05 ); }); }); //---------------------------------------------------------- // 文字を一文字ずつ表示させるための処理 //---------------------------------------------------------- function character_by_character( p_idName, t_idName, delay, duration ) { //親の要素を取得 let p_ele = document.getElementById( p_idName ); //textのid要素を取得、のち<span>~に書き換える let spanText = document.getElementById( t_idName ); // 親要要素が見えたら処理 var scrollTop = window.scrollY; var scrollBtm = scrollTop + window.innerHeight // 対象の要素の位置を取得 var targetTop = p_ele.getBoundingClientRect().top + scrollTop; var targetBtm = targetTop + spanText.clientHeight; if( scrollBtm > targetTop ) { //要素の中身を取得、文字を区切るため let text = spanText.innerHTML; spanText.style.opacity = 1; // すでに<span>に変換してたら処理しない if( !(text.indexOf( "span" ) === -1) ) return; //変数に空白を設定(spanで上書きする) let newText =""; let color = ""; //splitで<span>に区切る text.split("").forEach(function(value,j) { color ="#000000"; newText += '<span style ="animation:showtext 1s linear ' + ( delay + j*duration ) + 's forwards; '+ color +' " class ="show">' + value + '</span>'; }); //spanTextを書き換える spanText.innerHTML = newText; } } //---------------------------------------------------------- // 横に伸びるバーを作成 //---------------------------------------------------------- function create_a_bar( p_idName, c_idName, t_idName, delay, duration ) { //親の要素を取得 let p_ele = document.getElementById( p_idName ); let c_ele = document.getElementById( c_idName ); let t_ele = document.getElementById( t_idName ); // 親要要素が見えたら処理 var scrollTop = window.scrollY; var scrollBtm = scrollTop + window.innerHeight // 対象の要素の文字数を取得 let textLength = t_ele.textContent.length; // 対象の要素の位置を取得 var targetTop = p_ele.getBoundingClientRect().top + scrollTop; var targetBtm = targetTop + p_ele.clientHeight; if( scrollBtm > targetTop ) { // 親要素の高さと横幅を移植 c_ele.style.transitionDuration = (duration * textLength ) + "s"; c_ele.style.transitionTimingFunction = "ease-out" c_ele.style.transitionDelay = delay +"s"; c_ele.style.width = p_ele.clientWidth + "px"; c_ele.style.height = p_ele.clientHeight + "px"; } }
<div id="one-word-box"> <div id="one-word-back-box"></div> <div id="one-word-text">文字を一文字ずつフェードインさせる処理です</div> </div> <div id="one-word-box2"> <div id="one-word-back-box2"></div> <div id="one-word-text2">同時にバーも伸びる仕様です。2行表示させてます</div> </div>
#one-word-box, #one-word-box2 { position: relative; display: block; padding: 10px 20px; margin: 5px; width: fit-content; font-weight: 900; } #one-word-back-box, #one-word-back-box2 { position: absolute; top: 0px; left: 0px; width: 0%; height: 100%; background-color: #c54747ad; transition: all 1s; transition-delay: 0s; transition-timing-function: liner; z-index: 0; } #one-word-text, #one-word-text2 { opacity: 0; } #one-word-text span, #one-word-text2 span { font-weight: 900; display: inline-block; opacity: 0; } @keyframes showtext { 0%{ opacity: 0; } 100%{ opacity: 1; } }