화면을 구성할때 스타일 내기위해 자주사용하는 자바스크립트를 정리해보려고 한다.
1. 부모의 자식요소 갯수를 구해 스타일로 분기처리 할때
- 부모에 아이디값을 셀렉 후 자식요소의 length를 구한다.
- classList를 사용해 부모에 클라스를 추가해 스타일을 조건에 따라 활성화한다.
var listOrder = document.getElementById('listOrder');
var nodelist = listOrder.getElementsByTagName('li').length;
if(nodelist < 16){
listOrder.classList.add('few')
} else{
listOrder.classList.add('many')
}
2. 스크롤 헤더 sticky 효과
- 부모에 아이디값을 셀렉 후 offsetTop으로 위치확인
- window.addEventListener을 사용해 스크롤 할때마다 호출해 위치를 파악한다.
- classList.add / classList.remove를 사용해 스타일 분기하여 조건에 따라 활성화한다.
var navbar = document.getElementById('beatWrap');
var sticky = navbar.offsetTop;
var scrollPosition = 0;
var ticking = false;
function doSomething(scrollPos) {
if (window.pageYOffset > sticky) {
navbar.classList.add('onscroll')
} else {
navbar.classList.remove('onscroll');
}
}
window.addEventListener('scroll', function(e) {
scrollPosition = window.scrollY;
if (!ticking) {
window.requestAnimationFrame(function() {
doSomething(scrollPosition);
ticking = false;
});
ticking = true;
}
});
3. 팝업
- style 프로퍼티명으로 직접 스타일 넣기
var modal = document.getElementById('wrapDimmed')
function popupPicture(){
modal.style.display = 'block';
}
var PopupClose = function() {
modal.style.display = 'none';
};
4. #태그 갯수에 따라 스타일 닫고 열기 스타일
- 태그의 갯수를 파악해 .children을 사용해 for문에서 length로 분기
- className으로 스타일 처리
var listTag = document.getElementById('listTag');
var tagFold = document.getElementById('tagFold');
const $li = document.querySelector('#listTag').children;
// 2줄 이상부터 마지막 태그에 붙이기
for (var i = 0; i < $li.length; i++) {
if($li.length < 6){
listTag.className = 'list_tag'
}
if(listTag.offsetHeight > 64 || $li.length > 10){
tagFold.classList.remove('hide');
}
}
5. 햄버거 메뉴(drawer menu), fold식 toggle 메뉴
- HTML에서 버튼에 onClick에 직접사용
<li id="tagFold" class="hide" onclick="toggleClass(this.parentNode, 'fold')">
<button type="button" class="btn_default">
<span class="ico_snippet ico_arr"></span>
</button>
</li>
var toggleClass = function (element, tClass) {
tClass = tClass.replace(/\s/g, "");
var classes = element.className;
element.className = classes.indexOf(tClass) !== -1
? classes.replace(" " + tClass, "")
: classes + " " + tClass;
}
6. 값이 변경될때 호출 되는 이벤트 리스너 (파일첨부)
- addEvnetListener을 이용해 input값이 바뀌면(change) e.target을 이용해 파일명 가지고 오기
- 파일이 첨부되면 class추가해 스타일 내기
var fileInput = document.getElementById('attachment');
var stateUpload = document.getElementById('stateUpload');
var attachedFileName = document.getElementById('attachedFileName');
fileInput.addEventListener('change',function(e){
attachedFileName.innerHTML = e.target.files[0].name;
attachedFileName.className = 'txt_attach txt_black'
toggleClass(stateUpload, 'on');
})
7. 글자수세기
<div class="area_item">
<label class="lab_qna">제목</label>
<span class="txt_count">(<span id="titleCount" class="txt_count">0</span>/50)</span>
<input id="inpTitle" type="text" class="qna_basic inp_contents" maxlength="50" placeholder="제목을 입력하세요" onkeyup="handlerCount(titleCount, inpTitle)"/>
</div>
<div class="area_item">
<label class="lab_qna">내용</label>
<span class="txt_count">(<span id="contentsCount" class="txt_count">0</span>/1000)</span>
<textarea id="inpContents" class="qna_basic inp_contents" maxlength="1000" placeholder="내용을 입력하세요" onkeyup="handlerCount(contentsCount, inpContents)"></textarea>
</div>
var titleCount = document.getElementById('titleCount');
var contentsCount = document.getElementById('contentsCount');
var inpTitle = document.getElementById('inpTitle');
var inpContents = document.getElementById('inpContents');
function handlerCount (id, counter){
var maxLengthCount = counter.getAttribute('maxlength');
id.innerHTML = counter.value.length;
if(maxLengthCount > counter.value.length > 0){
id.className = 'txt_count txt_black'
} else if(counter.value.length == maxLengthCount){
id.className = 'txt_count txt_red'
}
}
8. 타이머로 간단한 인터랙션
setTimeout(function(){
toggleClass(selectFold,'fold')
},3000);
9. 숫자키패드를 클릭해 핸드폰 번호 입력하기
<input type="text" id="inpNumber" class="inp_call" value="010-"/>
<div class="tab_tell">
<table>
<tr>
<td>
<button type="button" class="btn_num">1</button>
</td>
<td>
<button type="button" class="btn_num">2</button>
</td>
<td>
<button type="button" class="btn_num">3</button>
</td>
</tr>
<tr>
<td>
<button type="button" class="btn_num">4</button>
</td>
<td>
<button type="button" class="btn_num">5</button>
</td>
<td>
<button type="button" class="btn_num">6</button>
</td>
</tr>
<tr>
<td>
<button type="button" class="btn_num">7</button>
</td>
<td>
<button type="button" class="btn_num">8</button>
</td>
<td>
<button type="button" class="btn_num">9</button>
</td>
</tr>
<tr>
<td>
<button type="button" class="btn_num" style="font-size:0">Delete<span class="ico_delete"></span></button>
</td>
<td>
<button type="button" class="btn_num">0</button>
</td>
<td>
<button type="button" class="btn_num" style="font-size:0">Reset<span class="ico_clear"></span></button>
</td>
</tr>
</table>
</div>
var displayTell = document.getElementById('inpNumber'),
keys = document.querySelectorAll(".btn_num"),
value;
for (i = 0; i < keys.length; i++) {
keys[i].addEventListener("click", clicked);
}
function clicked() {
var key = this.innerText || this.textContent;
keyPressed(key);
}
window.addEventListener("keydown", function(e) {
e = e || window.event;
console.log('TEST', e)
keyPressed(e.key);
});
function keyPressed(key) {
var val = displayTell.value;
if (isNaN(key)) {
switch (key) {
case "Delete":
displayTell.value = val.substring(0, val.length - 1)
break;
case "Reset":
resetDisplay();
value = "";
break;
}
}else{
if (val.length < 12) {
displayTell.value += key;
}
}
}
function resetDisplay() {
displayTell.value = "010-";
displayTell.placeholder = '';
}
'Frontend > Javascript' 카테고리의 다른 글
Object.assign (0) | 2021.04.10 |
---|---|
JSON.parse(), JSON.stringify() (0) | 2021.03.05 |
JavaScript / Object / Element.setAttribute() / 요소의 속성 값을 정하는 메서드 (0) | 2020.11.03 |
메뉴 아코디언 표현하기 (0) | 2019.02.11 |
Array.prototype.slice.call 이해하기 (0) | 2018.12.18 |