<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>


<form action="/submit.do" method="post" onsubmit="myValidator(); return false;" class="use_validator">

<fieldset> 
<legend>폼 양식</legend>


<ul>
    <li>input text only string</li>
    <li><input type="text" name="user_name" title="이름" class="use_vali only_string" placeholder="이름"></li>
</ul>

<ul>
    <li>input text only number</li>
    <li><input type="text" name="user_tel" title="연락처" class="use_vali only_number" maxlength="11" placeholder="연락처"></li>
</ul>

<ul>
    <li>input checkbox</li>
    <li>

        <input type="checkbox" name="ott[]" title="ott" value="넷플릭스" class="use_vali">
        <label for="">넷플릭스</label>

        <input type="checkbox" name="ott[]" title="ott" value="쿠팡플레이" class="use_vali">
        <label for="">쿠팡플레이</label>

        <input type="checkbox" name="ott[]" title="ott" value="왓챠" class="use_vali">
        <label for="">왓챠</label>

        <input type="checkbox" name="ott[]" title="ott" value="디즈니플러스" class="use_vali">
        <label for="">디즈니플러스</label>

        <input type="checkbox" name="ott[]" title="ott" value="티빙" class="use_vali">
        <label for="">티빙</label>

    </li>
</ul>


<ul>
    <li>input radio</li>
    <li>

        <input type="radio" name="gender" value="M" title="성별" class="use_vali">남
        <input type="radio" name="gender" value="F" title="성별" class="use_vali">여

    </li>
</ul>

<ul>
    <li>input password</li>
    <li>
        <input type="password" name="passwd" title="비밀번호" class="use_vali">
    </li>
</ul>


<ul>
    <li>textarea</li>
    <li><textarea name="remarks"  title="비고" class="use_vali"></textarea></li>
</ul>

<ul>
    <li>select</li>
    <li>
        <select name="site_list" title="사이트" class="use_vali">
            <option value="">:: 선택 ::</option>
            <option value="네이버">네이버</option>
            <option value="구글">구글</option>
            <option value="다음">다음</option>
        </select>
    </li>
</ul>


<ul>
    <li>취미</li>
    <li>

        <input type="checkbox" name="hobby[]" class="use_vali" title="취미" id="hobby1">
        <label for="hobby1"><span class="custom_inp"></span>독서</label>

        <input type="checkbox" name="hobby[]" class="use_vali" title="취미" id="hobby2">
        <label for="hobby2"><span class="custom_inp"></span>여행</label>

        <input type="checkbox" name="hobby[]" class="use_vali has_etc" title="취미" id="hobby3">
        <label for="hobby3"><span class="custom_inp"></span>기타</label>


        <input type="text" name="hobby_etc" class="use_vali" title="취미 기타" disabled>



    </li>
</ul>

</fieldset>

<input type="submit" value="확인">


</form>    




<script>


// form과 유효성 검사를 할 요소 
let frm = document.querySelector("form.use_validator");
let el = document.querySelectorAll(".use_vali");
let onlyStrEl = document.querySelectorAll(".only_string");
let onlyNumEl = document.querySelectorAll(".only_number");


// input, select, textarea 유효성검사 
function myValidator(){

    for(let i=0;i<el.length;i++){

        if(el[i].disabled) continue;

        let tagName = el[i].tagName;
        let type = el[i].getAttribute("type");
        let title = el[i].getAttribute("title");
        let name = el[i].getAttribute("name");
        let chkEl = document.getElementsByName(name);

        if(tagName == "INPUT"){

            if(type == "text" || type == "password") {

                if(el[i].value == ""){

                    alert(`${title}을(를) 입력해주세요`);
                    el[i].focus();
                    return false;

                }

            } else if(type == "checkbox" || type == "radio") {

                let count = 0;

                for(let j=0;j<chkEl.length;j++){

                    if(chkEl[j].checked) count++;

                }

                if(count < 1){

                    alert(`${title}을(를) 선택해주세요.`);
                    el[i].focus();
                    return false;

                }

            }

        } else if(tagName == "TEXTAREA"){

            if(el[i].value == ""){

                el[i].focus();
                alert(`${title}을(를) 선택해주세요.`);
                return false;

            }

        } else if(tagName == "SELECT"){

            let slctVal = el[i].options[el[i].selectedIndex].value;

            if(slctVal == ""){

                el[i].focus();
                alert(`${title}을(를) 선택해주세요.`);
                return false;

            }

        } 

    }

    return true;

}


// 유효성 검사를 사용하는 .use_vali에 대한 클릭 이벤트 
el.forEach(element => { element.addEventListener("click", isEtc); });

// 문자
onlyStrEl.forEach(element => { element.addEventListener("keyup", () => myValidator_onlyString(element)); });

// 숫자
onlyNumEl.forEach(element => { element.addEventListener("keyup", () => myValidator_onlyNumber(element)); });


// 클릭 이벤트 발생시 추가 인풋에 대한 disabled 처리 
function isEtc(){

    if(!this.classList.contains("has_etc")) return false;

    let name = this.getAttribute("name").replace("[]","");
    let etcEl = document.querySelector(`[name="${name}_etc"]`);

    if (this.checked) {

        etcEl.removeAttribute("disabled");
        etcEl.focus();

    } else {

        etcEl.setAttribute("disabled", true);
        etcEl.value = "";

    }

}


// 한영 제외 제거 함수
function myValidator_onlyString(el){

    el.value = el.value.replace(/[^ㄱ-ㅎ가-힣a-zA-Z]/g,'');

}

// 숫자 제외 제거 함수
function myValidator_onlyNumber(el){

    el.value = el.value.replace(/[^0-9]/g,'');

}



</script>


</body>
</html>
반응형

CSS 함수

CSS 변수 선언

홈페이지 color system이 있다면 변수로 저장해서 사용할 수 있고 유지보수에 유리하다.

:root {변수명:속성값}으로 작성하며 변수명 앞에는 하이픈 두 개(--)로 시작해야한다. 변수명에는 하이픈, 언더바 사용가능하다.

--basic_color:#333;
--basic-color:#000;
:root {
--main-txt-color:#333;
--sub-txt-color:#555
--main-bg-color:#ddd;
--common-border-color:#fafafa;
}

val()

val(변수명) 함수로 값을 지정할 수 있다.

h2 {color:val(--main-txt-color)}
p {color:val(--sub-main-color)}
section {background:val(--main-bg-color)}
div {border-color:val(--common-border-color)}

calc()

calculation 함수에 값은 크기나, 각도, 시간 백분율, 숫자 등 가능
너비를 계산할 때 자주 사용한다.

div {width:calc(100% - 100px)}
  • div요소 100%에서 -100px을 뺀 값을 계산한다.
  • 사칙연산자(+, -, *, /) 사용 가능
  • 피연산자는 숫자만 가능
  • 연산자 사이에 띄어쓰기 필수
  • 0으로 나눌 수 없다.

min()

min() 함수는 괄호 안에 나열된 값 중에서 가장 작은 값을 적용한다.

min(value1, value2, ...)
img {width:min(50%, 400px);}

max()

max() 함수는 괄호 안에 나열된 값 중에서 가장 큰 값을 적용한다.

min(value1, value2, ...)
img {width:min(50%, 400px);}

clamp()

clamp() 함수는 값의 범위를 고정 및 제한한다

clamp(최솟값, 최적값, 최댓값)
p {font-size:clamp(1rem, 1vw, 2em);}
반응형

'WEB PUBLISHING' 카테고리의 다른 글

가상요소(Pseudo-elements)  (0) 2024.10.25

가상요소(Pseudo-elements)

::first-line

첫번째 줄에 스타일을 적용

p::first-line {...}

::first-letter

첫 번째 단어에 스타일을 적용

p::first-letter {...}

::before

요소 앞에 콘텐츠를 추가

div::before {content:""}

::after

요소 뒤에 콘텐츠를 추가

div::after {content:""}

::before, ::after 응용

  • clearfix
.float_r::after {content:"";display:block;clear:both}
  • 불릿

ul li {padding:0 0 0 10px;position:relative}  
ul li::before {content:"";width:10px;height:10px;background:url("/src/img/bullet.png") 0 0 no-repeat;position:absolute:left:0;top:0}   

/* 아래의 방식도 가능 */
ul li::before {content:url("/src/img/bullet.png")}  
  • 뱃지(badge) : 불릿방식과 같으며 알림이 떴을 때

ul li {padding:0 0 0 10px;position:relative}  
ul li.is_alarm:before {content:"";width:10px;height:10px;background:url("/src/img/bullet.png") 0 0 no-repeat;position:absolute:left:0;top:0}  
  • 가상요소는 DOM 접근이 어렵기 때문에 토글 클래스로 처리하는게 편하다.

  • 넘버링

    • ol의 list-style로 가능하나 들여쓰거나 내어쓸 수 있다.

세미콜론 개수

css2에서 :가상요소로 등장하였고 호환성 및 이전 버전의 일관성의 이유로 세미콜론 하나도 작동되지만 css3에서는 ::가상요소로 권장하고 있다.

반응형

'WEB PUBLISHING' 카테고리의 다른 글

CSS 함수  (0) 2024.10.25

+ Recent posts