var text = `I'm [Front-end developer]<br/>I'm specialized in<br/>[HTML, CSS, Javascript, VueJS] etc`; var newText; function tt(text) { var text = text.split("<br/>"); // []를 감지해서 없는건 {normal:""}, 아닌것은 {span:""}으로 만든다. var result = text.map(one=>{ var temp = []; var isSpan = false; var tempObj = {}; for(var i = 0; i < one.length; i++) { if (one[i] === "[") { isSpan = true; if(tempObj.normal || tempObj.span) { temp.push(tempObj); } tempObj = {}; continue; } if (one[i] === "]") { isSpan = false; temp.push(tempObj); tempObj = {}; continue; } if (isSpan === false) { tempObj.normal = tempObj.normal || ""; tempObj.normal += one[i]; } if (isSpan === true) { tempObj.span = tempObj.span || ""; tempObj.span += one[i]; } } if(tempObj.normal || tempObj.span) temp.push(tempObj); return temp; }); return result; } newText = tt(text); function showText(text, id) { var arrNum = 0; var subArrNum = 0; var textNum = 0; var subTag = ""; var id = document.getElementById(id); var dom1 = ""; var dom2 = ""; var pre = "" console.log(text); function oneShowText() { subTag = text[arrNum][subArrNum].normal ? "normal" : "span"; if(textNum >= text[arrNum][subArrNum][subTag].length) { textNum = 0; subArrNum++; } if(subArrNum >= text[arrNum].length) { subArrNum = 0; arrNum++; } if(arrNum >= text.length) return; subTag = text[arrNum][subArrNum].normal ? "normal" : "span"; if(subArrNum === 0 && textNum === 0) { dom1 = document.createElement("p"); id.appendChild(dom1); } if(textNum === 0) { if(subTag === "span") { dom2 = document.createElement(subTag); dom1.appendChild(dom2); } else { dom2 = dom1; } } dom2.innerHTML += text[arrNum][subArrNum][subTag][textNum]; textNum++; setTimeout(oneShowText, 100); } oneShowText(); } showText(newText, "a");
<div class="intro"> <div id="a"></div> </div>
.intro{display:table;width:100%;height:200px;border:1px solid black;} .intro div{display:table-cell;vertical-align:middle;margin:20px;padding:20px;border:1px solid black;} .intro div p{margin-top:10px;} .intro div span{background-color:black;color:white;font-weight:bold;}