toggle버튼을 눌렀을때 클래스를 추가 삭제하여 html테마 바꾸기 (야간모드 활용가능)

body.dark{
    background: #f0f0f0;
}
.dark header .logo{
    background:url(../img/Logo_black.svg) no-repeat;
}
.dark .navButton span{
    background: #40305f;
}

✅css
1) body 태그에 클래스명을 붙여 배경색을 수정해준다
2) 수정을 원하는 태그 앞에 클래스명을 붙여 변경사항을 css로 적어준다

$("input:checkbox").on('click', function () {
    if ($(this).prop('checked')) {
        $(this).parent().addClass("selected");
        $('body').addClass("dark");
    } else {
        $(this).parent().removeClass("selected");
        $('body').removeClass("dark");
    }
});

✅jquery
1) input check박스가 클릭 했을때
2) 만약 checked되어있으면
3) 해당 input의 부모요소에 selected 클래스를 추가한다
4) body태그에 dark class를 추가한다 -> 클래스를 추가하고 작성한 css가 반영된다
5) checked되어 있지 않은경우
6) 해당 input의 부모요소에 selected 클래스를 제거한다
7) body태그에 dark class를 제거한다 -> 기존 css가 반영된다

 

https://rara-code.tistory.com/20?category=1072320

toggle버튼 만들기 참고하기

 

[css] toggle 버튼 만들기

form요소를 이용해서 toggle버튼 만들기                                                                  ✅html 1) checkbox formr과 빈 span..

rara-code.tistory.com


✔ 테마 뿐 아니라 다양한 이벤트에도 addClass를 이용하여 활용가능

 

<div class="nav">
                <a class="navButton" href="#">
                    <span></span>
                    <span></span>
                    <span></span>
                </a>
                <div class="menu">
                    <a href="#">메뉴1</a>
                    <a href="#">메뉴2</a>
                    <a href="#">메뉴3</a>
                    <a href="#">메뉴4</a>
                </div>
            </div>

✅html
1) nav 안에 navButton span으로 작성
2) 하단에 menu작성

.navButton.active-1 span:nth-of-type(1) {
    transform: translateY(12px) rotate(-45deg);
    background: #2F2725;
}

.navButton.active-1 span:nth-of-type(2) {
    opacity: 0;
}

.navButton.active-1 span:nth-of-type(3) {
    transform: translateY(-13px) rotate(45deg);
    background: #2F2725;

}

header .menu {
    position: fixed;
    top: 0;
    right: 0;
    width: 40%;
    height: 100vh;
    padding: 100px 0;
    z-index: 10;
    flex-direction: column;
    background: #f7f7f7bb;
    transform: translateX(100%);
    transition: transform 0.5s;
    box-shadow: 6px 6px 9px 2px #342D44;
}

✅css
1) 각 span 색상과 y값 지정
2) menu에 transform값설정

$(function () {
    $(".navButton").click(function () {
        $(".menu").toggleClass("on");
    });
});

var menu = $(".navButton");
menu.each(function (index) {
    var $this = $(this);

    $this.on("click", function (e) {
        e.preventDefault();
        $(this).toggleClass("active-" + (index + 1));
    })
});

✅jquery
1) .navButton클릭시 menu에 .on class가 추가되면서 transform x값 변경
2) .navButton내에 span에 index번호 생성
3) .navButton 클릭시 toggle 되며 index 1이 활성화

 

https://rara-code.tistory.com/18?category=1072321
goggle아이콘으로 모바일 햄버거 버튼 만들기 참고하기

 

[jquery/css] 모바일 햄버거버튼 만들기

javascript jQuery를 이용해서 햄버거버튼 메뉴 슬라이드형식으로 나오게 하기 메뉴 아이콘은 goggle icon사용                                                 ..

rara-code.tistory.com

 

✔️ 구글링을 통해 작성
✔️ x자가 안맞는 경우 css 수정

javascript jQuery를 이용해서 햄버거버튼 메뉴 슬라이드형식으로 나오게 하기
메뉴 아이콘은 goggle icon사용

<div class="nav">
                <button id="open">
                    <span class="material-symbols-outlined">
                        menu
                    </span>
                </button>
                <div class="menu">
                    <button id="close">
                        <span class="material-symbols-outlined">
                            close
                        </span>
                    </button>
                    <a href="../html/01_Gallery_home.html">HOME</a>
                    <a href="../html/02_Gallery_about.html">ABOUT</a>
                    <a href="../html/03_Gallery_exhibition1.html">EXHIBITION</a>
                    <a href="../html/05_Gallery_education.html">EDUCATION</a>
                    <a href="../html/06_Gallery_Ticket_main.html">TICKET</a>
                    <a href="../html/08_Gallery_Mypage.html">MYPAGE</a>
                </div>
            </div>

✅html
1) nav안에 menu아이콘과 닫기 아이콘 메뉴를 작성

header .nav button {
    display: inline;
}
header .head .nav .menu {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100vh;
    padding: 100px 0;
    z-index: 10;
    flex-direction: column;
    background: white;
    transform: translateX(-100%);
    transition: transform 0.5s;
}

header .head .nav .menu.on {
    transform: translateX(0);
}

header .head .nav .menu span {
    position: fixed;
    right: 0;
    top: 0;
}

✅css
1) menu에 transform x값과 부드러운 이동을 위해 transition을 설정한다
2) jquery함수를 통해 on과 off class를 추가할 예정이기 때문에 transform값을 설정해준다
3) 아이콘 버튼은 fixed로 고정해준다

$(function() {
    $("#open").click(function() {
        $(".menu").addClass("on");
    });
    $("#close").click(function() {
        $(".menu").removeClass("on");
    });
});

// id open을 클릭하면 menu on 추가
// id close를 클릭하면 menu on 삭제

✅jquery
1) #open id버튼 클릭시 .menu 에 class명 .on이 추가된다
-이전에 작성한 css의 효과가 추가(transform)
2) #close id버튼 클릭시 .menu 에 class명 .on이 추가된다
-이전에 작성한 css의 효과가 추가(transform)

 

https://rara-code.tistory.com/19?category=1072321

span이용하여 x자로 변하는 햄버거버튼만들기

 

[css/jquery] span을 이용하여 x자로 바뀌는 햄버거 버튼 만들기

                                                                                                     ..

rara-code.tistory.com

 

$(window).scroll(function () {
    if ($(window).scrollTop() == 0) {
        $('#scroll').show();
    } else {
        $('#scroll').hide();
    }
});

✅jquery
1) scroll 함수 작성
2) if scroll Top이 0이면 #scroll 버튼이 보이고
3) else #scroll 버튼이 사라진다

$(document).ready(function () {
    $("#scroll").on("click", function (event) {
        var offset = $(".Sec6").offset().top;
        // swiper.mousewheel.disable();
        $("html, body").animate({
            scrollTop: offset,
        }, 400);
        console.log(offset);
    });
});

✅ javascript
1) #scroll 이라는 id 버튼을 누르면
2) .Sec6 class 상단으로 이동한다
3) 부드럽게 이동하기 위해 animate 추가

javascript form 요소를 이용해서 상품 구매 페이지 만들기

<div class="form">
                    <div class="left">
                        <h3>선택내역</h3>
                        <div id="container">
                        </div>
                    </div>
                    <div class="right">
                        <div class="select">
                            <h3>
                                분류
                            </h3>
                            <div>
                                <select id="selGoods" name="selGoods"></select>
                                <button id="btnAddGoods">추가하기</button>
                            </div>
                        </div>
                        <div>
                            <h3>
                                합계
                            </h3>
                            <input id="goodsTotAmt" name="totAmt" value="0">
                        </div>
                    </div>
                </div>
                <input type="button" value="구매하기" class="button2" onClick="alert('해당페이지는 포트폴리오 페이지로 구매할 수 없습니다.')">
            </div>

✅html
1) 왼쪽에 선택목록이 나타나기 위한 빈 div만들기
2) 오른쪽에는 선택할 수 있는 select form과 추가하기 버튼 작성
3) 합계를 보여주기 위해 input으로 작성
4) 가장하단에는 구매하기 button을 작성

function Goods(){
		this.arrAllGoods = new Array();//상품 목록
		this.arrSelGoods = new Array();//선택한 상품 목록
		var p = this;
		//상품 추가 시
		this.select = function (trgtGoodsId){
			var selectedIndex = -1;
			//전체 목록 배열에서 검색하여 goodsId가 없다면 선택 목록에 push후 container안에 그려준다.
			//선택 목록에서 검색
			for(var i=0;i<p.arrSelGoods.length;i++){
				if(p.arrSelGoods[i].goodsId==trgtGoodsId){
					selectedIndex = i;
					break;
				}
			}
			if(selectedIndex<0){//선택목록에 없을 경우 추가. 잇을경우 얼럿.
				//전체목록에서 선택 추가해줌.
				for(var j=0;j<p.arrAllGoods.length;j++){
					
					if(p.arrAllGoods[j].goodsId==trgtGoodsId){
						p.arrSelGoods.push(p.arrAllGoods[j]);
						p.arrSelGoods[p.arrSelGoods.length-1].cnt = 0;//무조건 개수 초기화
						p.appendChoiceDiv(p.arrAllGoods[j]);
						break;
					}
				}
			}else{
				alert("이미 추가한 상품입니다.");
			}
			p.afterProc();
		}
		//상품 제거 시
		this.deselect = function (trgtGoodsId){
			var selectedIndex = -1;
			//배열에서 검색.
			for(var i=0;i<p.arrSelGoods.length;i++){
				if(p.arrSelGoods[i].goodsId==trgtGoodsId){
					p.removeChoiceDiv(p.arrSelGoods[i]);
					p.arrSelGoods.splice(i,1);
					break;
				}
			}
			p.afterProc();
		}
		this.appendChoiceDiv = function(prmtObj){
			var innerHtml = "";
			innerHtml += '<div id="div_'+prmtObj.goodsId+'">';			
			innerHtml += '<ul>';
			innerHtml += '	<li>'+prmtObj.goodsNm+'</li>';
			innerHtml += '	<li>수량:<input type="text" id="input_cnt_'+prmtObj.goodsId+'" name="" value="0"/>'
            innerHtml += '	<li><button type="button" id="" class="add" name="" onclick="goods.minus(\''+prmtObj.goodsId+'\');">-</button></li>';
            innerHtml += '	<li><button type="button" id="" class="remove" name="" onclick="goods.plus(\''+prmtObj.goodsId+'\');">+</button></li>';
            innerHtml += '	<li><button type="button" id="" class="remove" name="" onclick="goods.deselect(\''+prmtObj.goodsId+'\');">제거</button></li>';
			innerHtml += '	<li>가격:<input type="text" id="input_sumAmt_'+prmtObj.goodsId+'" name="" value="0"/><span> 원</span>'
			innerHtml += '</ul>';
			innerHtml += '</div>';		
			$('#container').append(innerHtml);
		}
		this.removeChoiceDiv = function(prmtObj){
			$("#div_"+prmtObj.goodsId).remove();
		}
		this.plus = function (trgtGoodsId){
			for(var i=0;i<p.arrSelGoods.length;i++){
					if(p.arrSelGoods[i].goodsId==trgtGoodsId){
						p.arrSelGoods[i].cnt++;
						break;
					}
			}
			p.afterProc();			
		}
		this.minus = function (trgtGoodsId){
			for(var i=0;i<p.arrSelGoods.length;i++){	
					if(p.arrSelGoods[i].goodsId==trgtGoodsId){
						if(p.arrSelGoods[i].cnt==0) break;
						p.arrSelGoods[i].cnt--;
						break;
					}
			}
			p.afterProc();			
		}
		//계산 후처리.
		this.afterProc = function (){
			for(var i=0;i<p.arrSelGoods.length;i++){
				$('#input_cnt_'+p.arrSelGoods[i].goodsId).val(p.arrSelGoods[i].cnt);
				$('#input_sumAmt_'+p.arrSelGoods[i].goodsId).val(p.arrSelGoods[i].cnt*p.arrSelGoods[i].goodsUnprc);
			}
			var goodsTotAmt = 0;
			for(var i=0;i<p.arrSelGoods.length;i++){
				goodsTotAmt += p.arrSelGoods[i].cnt*p.arrSelGoods[i].goodsUnprc;
			}
			$('#goodsTotAmt').val(goodsTotAmt + ' 원');
		}
	}	
	var goods = new Goods();
	//jstl로 전체 상품 목록 미리 세팅
	goods.arrAllGoods.push({goodsId:"1",goodsUnprc:20000,goodsNm:"성인"  ,cnt:0});
	goods.arrAllGoods.push({goodsId:"2",goodsUnprc:15000,goodsNm:"청소년"  ,cnt:0});
	goods.arrAllGoods.push({goodsId:"3",goodsUnprc:13000,goodsNm:"어린이",cnt:0});
	//jstl로 셀렉트 박스 옵션 채우기
    $('#selGoods').append('<option id="" value="1">성인</option>');
	$('#selGoods').append('<option id="" value="2">청소년</option>');
	$('#selGoods').append('<option id="" value="3">어린이</option>');
	$('#btnAddGoods').on('click',function(){
		goods.select($('#selGoods option:selected').val());
	});

✅css
1) 상품과 선택 상품에 대해 배열을 만든다
2) 전체 목록 배열에서 goodsId가 없으면 선택목록에 추가, 있으면 추가되지않고 alert이 띄워지는 함수작성
3) html 추가하는 함수 작성
- 선택된 목록 이름 추가
- ul li 태그로 수량, +버튼, -버튼, 목록제거버튼, 해당목록 가격 작성
4) 해당 태그 id를 불러와 +버튼, -버튼, 목록제거버튼에 대한 함수작성
5) 계산 이후 전체 합계에 대한 함수 작성
-해당 input id를 불러와 결과값을 해당 id로 추출
6) 선택 목록 세팅
- 상품명, 가격등 작성
7) 셀렉트 박스 옵션 세팅

✔ 구글링을 통해 form 요소 작성 (스크립트 너무 어렵다..)
✔ 해당 html, script와 따로작성한 css로 이미지 결과 도출

로그인창 아이디나 비밀번호 미입력시 하단에 경고문구 뜨게하기

<form action="#" method="post" name="login">
 <fieldset>
  <legend>Log In</legend>
  <input type="text" placeholder="ID 아이디" maxlength="20" name="id" id="
  <br>
  <input type="password" placeholder="PW 비밀번호" maxlength="20" name="pw" id="
  <br>
  <input type="submit" value="확인">
  <br>
  <span class="message" id="message"></span>
  </fieldset>
</form>


✅html
1) form 태그를 작성
2) 아이디, 패스워드, 확인 버튼 생성
3) 하단에 빈 span태그를 작성해준다
4) span태그에 class와 id명을 설정하여 css에서 속성과 javascript에서 속성을 설정 할 수 있게한다


window.onload = function() {
    var login = document.login;
    login.onsubmit = function() {
        if(!login.id.value){
            span = document.getElementById("message");
            txt = document.createTextNode("아이디를 입력해주세요");
            span.appendChild(txt);
            login.id.focus();
            return false;
        }
        if(!login.pw.value){
            span = document.getElementById("message");
            txt = document.createTextNode("비밀번호를 입력해주세요");
            span.appendChild(txt);
            login.pw.focus();
            return false;
        }
        else{
            span = document.getElementById("message");
            txt = document.createTextNode("잘못입력하였습니다. 아이디와 비밀번호를 확인해주세요");
            span.appendChild(txt);
            login.id.focus();
            return false;
        }
    }
}

✅Java script 방법1 ->실패
1) window.onload 함수를 선언
2) login객체를 선언
3) login 함수를 작성 if문을 활용
4) 부정문(!)을 활용하여 로그인 작성안할경우 결과값을 입력
5) if문을 만족할 경우 span에 텍스트 생성과 아이디칸에 포커스가 잡힐 수 있게 객체 생성
6) true 페이지로 넘어가지 않게 false를 반환
*pw 부분도 동일

7) else는 if문 의외의 상황시 발생
8) 성공시 페이지가 넘어가지 않도록 잘못입력하였다는 메시지와 false반환
-> 무한 flase로 계속 해서 span이 반복됨

✔️span이 확인을 누르면 무한 반복
✔️결과 값을 경고창 형식으로 바꾸고 함수를 빠져나갈 수 있게 성공 경로를 작성할 예정

 

function validate() {
    const regId = /^[a-zA-Z0-9]{4,12}$/;
    // 아이디 정규식
    const regPw = /^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$/;
    // 패스워드 정규식, 최소 8 자, 최소 하나의 문자, 하나의 숫자 및 하나의 특수 문자
    const regNull  = /\s/g;
    // 빈값
    
    let id = document.getElementById("id");
    let pw = document.getElementById("pw");
    // 정규식 조건에 위배되었을 때, alert이 출력되는 함수였다.
    // 요 값이 true이고 이걸 부정한 조건(false)일 때 넘어간다.

    // 아이디 정규식 확인
    if (!checkReg(regId, id, "아이디는 4~12자의 영문 대소문자와 숫자로만 입력")) {
        return false;
    }

    // 비밀번호 정규식 확인
    if (!checkReg(regPw, pw, "최소 8자, 최소 하나의 문자, 숫자, 특수 문자를 포함하여 입력")) {
        return false;
    }
    // 비밀번호 빈값확인
    if (!checkNull(pw, "비밀번호를 입력해 주세요")) {
        return false;
    }
}
// 정규식 확인
function checkReg(reg, what, message) {
    // 정규식에 위배되지 않았을때
    let alertMSG = what.parentNode.lastElementChild;
    if (reg.test(what.value)) {
        alertMSG.textContent = ""; // 메시지 공백화
        return true;
    }
    // 정규식에 위배되었을때
    alertMSG.textContent = message; // 메시지 출력
    what.value = ""; // 해당 위치 공백화
    what.focus(); // 해당위치로 포커싱
}
// 빈값 확인
function checkNull(what, message) {
    // 빈값없음
    let alertMSG = what.parentNode.lastElementChild;
    if (what.value !== "") {
        alertMSG.textContent = "해당페이지는 포트폴리오 사이트로 로그인 할 수 없습니다";
        return true;
    }
    // 빈값확인
    alertMSG.textContent = message; // 메시지 출력
    what.focus(); // 해당위치로 포커싱
}


let inputs = document.querySelectorAll('input');
Array.from(inputs).forEach((eachInput) => {
    eachInput.addEventListener('blur', (e) => validate(e));
});
const validation = document.querySelector('#validation');
validation.addEventListener('click', (e) => validate(e));

✅Java script 방법2 ->성공
1)아이디, 패스워드, 빈값에 대한 정규식 작성
2) 아이디 패스워드 선언
3) id 정규식확인 if문 작성 
4) pw 정규식확인 if문 작성 
5) if문을 만족할 경우 공백화, 포커싱을 작성(무한 span방지를 위해 공백화작성)

✔️span이 확인을 누르면 무한 반복해결
✔️빈칸 뿐 아니라 정규식에 대한 부분 오류 메시지 작성

✔️ 하단 let const부분 한번 더 보기

+ Recent posts