✿∘˚˳°∘°

51일차 : [실습] 슬라이딩메뉴 / 정규표현식 / 반응형 본문

국비수업/jQuery

51일차 : [실습] 슬라이딩메뉴 / 정규표현식 / 반응형

_HYE_ 2023. 2. 8. 21:32

20230208

 

1. [실습]슬라이딩메뉴

 

1 - 1 ) 슬라이딩메뉴 기본 : 화살표를 클릭하면 다음이미지를 보여주는 메뉴(단, 처음 or 마지막이미지에 도달하면 끝)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>이미지슬라이딩</title>
    <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@48,400,0,0" />
    <script src="js/jquery-3.6.3.min.js"></script>
    <link rel="stylesheet" href="css/slide.css">
</head>
<body>
    <h1>이미지 슬라이드 기본</h1>
    <hr>
    <div class="slide-wrap">
        <ul>
            <li><img src="slideimg/bg-1.jpg"></li>
            <li><img src="slideimg/bg-2.jpg"></li>
            <li><img src="slideimg/bg-3.jpg"></li>
        </ul>
        <div class="slide-navi prev">
            <span class="material-symbols-outlined">arrow_back_ios</span>
        </div>
        <div class="slide-navi next">
            <span class="material-symbols-outlined">arrow_forward_ios</span>
        </div>
    </div>
    <script src="js/slide1.js"></script>
</body>
</html>
.slide-wrap{
    width: 1200px;
    margin: 0 auto;
    overflow: hidden;
    position: relative;
}
.slide-wrap>ul{
    margin: 0;
    padding: 0;
    list-style-type: none;
    overflow: hidden;
    /*width: 3600px;*/
    /*이미지하나넓이*갯수 이기때문에 지정하면 지정된 갯수만 사용가능하므로
    자바스크립트에서 작성해서 여러이미지를 사용할 수 있게 해줄 것*/
}

.slide-wrap>ul>li{
    width: 1200px;
    float: left;
    /*지금은 공간이 부족해서 float:left를 해도 옆으로 안붙음*/
    /*ul태그의 넓이를 지정해서 옆으로 정렬하고 부모태그에 overflow:hidden으로 감춰둘것*/
}

.slide-wrap>ul>li>img{
    width: 100%;
    height: 500px;
}

.slide-navi:hover{
    opacity: 0.8;
}
.slide-navi{
    position: absolute;
    height: 500px;
    line-height: 500px;
    top: 0;
    width: 100px;
    text-align: center;
    opacity: 0.4;
    cursor: pointer;
}
.slide-navi>span{
    font-size: 30px;
    color: #fff;
}
.prev{
    left: 0;
}
.next{
    right: 0;
}
//ul의 넓이지정하기
const ul = $(".slide-wrap>ul");
//1.이미지 갯수 구하기(이미지갯수 == li갯수)
const imgCount = ul.children().length;
//이미지 갯수에 따라 ul너비 변경
ul.css("width", (imgCount*1200)+"px");
//현재 슬라이드가 보여주고 있는 이미지번호 - 최초는 0번
let imgNo = 0; 

$(".next").on("click", function(){
    if(imgNo != imgCount-1){
        imgNo++;
        const move = imgNo * (-1200);
        ul.css("transform", "translateX("+move+"px)").css("transition-duration", "1s");
    }
});

$(".prev").on("click", function(){
    if(imgNo != 0){
        imgNo--;
        const move = imgNo * (-1200);
        ul.css("transform", "translateX("+move+"px)").css("transition-duration", "1s");
    }
});

 

1 - 2 ) 슬라이딩메뉴 심화 : 화살표를 클릭하면 다음이미지로 넘어가고, 처음 or 마지막 이미지에 도달하면 마지막 or 처음 이미지로 연결하여 무한하게 돌도록 할것 + 3초마다 자동으로 슬라이딩되는 효과

(HTML/CSS는 공통된걸 사용한다)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>이미지슬라이딩2</title>
    <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@48,400,0,0" />
    <script src="js/jquery-3.6.3.min.js"></script>
    <link rel="stylesheet" href="css/slide.css">
</head>
<body>
    <!--이미지가 무한하게 넘어감(끝나면 시작으로)-->
    <!--버튼을 누르지 않아도 시간에 따라 슬라이딩-->
    <h1>이미지 슬라이드 심화</h1>
    <hr>
    <div class="slide-wrap">
        <ul>
            <li><img src="slideimg/bg-1.jpg"></li>
            <li><img src="slideimg/bg-2.jpg"></li>
            <li><img src="slideimg/bg-3.jpg"></li>
        </ul>
        <div class="slide-navi prev">
            <span class="material-symbols-outlined">arrow_back_ios</span>
        </div>
        <div class="slide-navi next">
            <span class="material-symbols-outlined">arrow_forward_ios</span>
        </div>
    </div>
    <script src="js/slide2.js"></script>
</body>
</html>
.slide-wrap{
    width: 1200px;
    margin: 0 auto;
    overflow: hidden;
    position: relative;
}
.slide-wrap>ul{
    margin: 0;
    padding: 0;
    list-style-type: none;
    overflow: hidden;
    /*width: 3600px;*/
    /*이미지하나넓이*갯수 이기때문에 지정하면 지정된 갯수만 사용가능하므로
    자바스크립트에서 작성해서 여러이미지를 사용할 수 있게 해줄 것*/
}

.slide-wrap>ul>li{
    width: 1200px;
    float: left;
    /*지금은 공간이 부족해서 float:left를 해도 옆으로 안붙음*/
    /*ul태그의 넓이를 지정해서 옆으로 정렬하고 부모태그에 overflow:hidden으로 감춰둘것*/
}

.slide-wrap>ul>li>img{
    width: 100%;
    height: 500px;
}

.slide-navi:hover{
    opacity: 0.8;
}
.slide-navi{
    position: absolute;
    height: 500px;
    line-height: 500px;
    top: 0;
    width: 100px;
    text-align: center;
    opacity: 0.4;
    cursor: pointer;
}
.slide-navi>span{
    font-size: 30px;
    color: #fff;
}
.prev{
    left: 0;
}
.next{
    right: 0;
}
const ul = $(".slide-wrap>ul");
//마지막 li를 복사해서 첫번째자식으로 추가
ul.prepend(ul.children().last().clone());
//위에서 첫번째 자식으로 추가했으므로 맨뒤에 붙이고싶은
//원본 첫번째이미지는 두번째자식
ul.append(ul.children().eq(1).clone());

const imgCount = ul.children().length;
ul.css("width", (imgCount*1200)+"px");
let imgNo = 1;
ul.css("transform","translateX("+(-1200*imgNo)+"px)");

let intervalId; //interval함수를 실행하면 받는 값 - 이값을 통해 intval을 멈출 수 있다

$(".next").on("click", function(){
    if(imgNo != imgCount-1){
        //이미지 자동스크롤 함수를 멈춤
        window.clearInterval(intervalId);
        imgNo++;
        const move = imgNo * (-1200);
        ul.css("transform", "translateX("+move+"px)").css("transition-duration", "1s");
        //마지막이미지에 도달
        if(imgNo == imgCount-1){
            //1초이후 실행하기 위함 
            window.setTimeout(function(){
                imgNo = 1;
                const move = imgNo * (-1200);
                ul.css("transform", "translateX("+move+"px)").css("transition-duration", "0s");
                //이미 transition-duration이 1s로 지정되어 있으므로 0s를 적지않으면 1s가 그대로 적용되어 있음
            }, 1000);
        }
        //멈췄던 이미지 자동스크롤 함수를 새로 시작
        autoSlide(); 
    }
});

$(".prev").on("click", function(){
    if(imgNo != 0){
        window.clearInterval(intervalId);
        imgNo--;
        const move = imgNo * (-1200);
        ul.css("transform", "translateX("+move+"px)").css("transition-duration", "1s");
        //첫번째 이미지에 도달
        if(imgNo == 0){
            window.setTimeout(function(){
                imgNo = imgCount - 2;
                const move = imgNo * (-1200);
                ul.css("transform", "translateX("+move+"px)").css("transition-duration", "0s");
            },1000);
        }
        autoSlide();
    }
});

autoSlide();
function autoSlide(){
    //3초에 한번씩 next버튼 누르기
    intervalId = window.setInterval(function(){
        $(".next").click();
    },3000);
}

 

 

2 - 1 ) 정규 표현식

유효성검사
: 사용자가 입력한 데이터가 양식에 맞는지 검사
1) 비밀번호와 비밀번호확인값이 동일한지
2) 아이디 or 비밀번호의 복잡도가 만족하는지

- 정규표현식
: 주로 프로그래밍언어나 text editor(메모장 등)등에서 문자열의 검색/치환을 위해 사용
-- meta문자 : 정규표현식에서 사용하는 기호(어떠한 의미가 있는 문자)
                  ^ $ . + * ? () [] [^] [-] {n} {m} {n,m}

[ - ] : 범위값 지정
[ 가-힣 ] : 한글모든범위
[ a-zA-z0-9] : 영어 대소문자 숫자 - 범위값을 여러개 넣을 수 있다 

\d : 숫자
\D : 숫자빼고 나머지
\w : 영문자
\W : 영문빼고 나머지
\s : 띄어쓰기
\S : 띄어쓰기 빼고 나머지

ab?c : b라는문자가 0~1개 ac abc
ab*c : b라는문자가 0~n ac abc abbbbbbbbc
ab+c : b라는문자가 1~n abc abbbbbbbbc

{} : 갯수
[a-z]{2} - 소문자가 2개
[a-z]{2,} - 소문자가 2개이상
[a-z]{2, 4} - 소문자가 2개이상 4개이하

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>정규표현식</title>
    <script src="js/jquery-3.6.3.min.js"></script>
</head>
<body>
    <h1>정규표현식 테스트</h1>
    <input type="text" name="input" id="input">
    <button id="btn">확인</button>

    <script>
        $("#btn").on("click", function(){
            const value = $("#input").val();
            let regExp;
            //1. a라는 문자가 포함되어 있으면
            //regExp = /a/; // 정규표현식 입력 
            
            //2. a로 시작하면
            // regExp = /^a/;

            //3. a 또는 b가 포함되어 있으면
            //regExp = /[ab]/;

            //4. a 또는 b로 시작하는
            //regExp = /^[ab]/;

            //5. a로 끝나면
            //regExp = /a$/;

            //6. a또는 b로 끝나면
            //regExp = /[ab]$/;

            //7. a로 시작해서 b로 끝나면(단, 중간에 어떤문자가 얼만큼 와도 상관없음)
            //regExp = /^a.*b$/;

            //8. 숫자만입력(영어대/소문자, 한글 포함하면 안됨)
            //regExp = /^[0-9]+$/;

            //9. 영어 대/소문자만 입력하고 싶은 경우(1글자 이상)
            //regExp = /^[a-zA-Z]+$/;

            //10. 영어 대/소문자/숫자만 입력하고 싶은 경우
            //regExp = /^[a-zA-Z0-9]+$/;

            //11. 한글만 입력하고 싶은 경우
            //regExp = /^[ㄱ-ㅎㅏ-ㅣ가-힣]+$/;

            //12. 한글 3글자만 입력(이름)
            //regExp = /^[가-힣]{3}$/;

            //13. 한글 2글자~5글자
            //regExp = /^[가-힣]{2,5}$/

            //14. 아이디(영어 소문자/대문자/숫자 -> 글자수제한 6글자~15글자) 
            //regExp = /^[a-zA-Z0-9]{6,15}$/;

            //15. 영어소문자/대문자/숫자 6~15글자 -> 시작은 무조건 소문자
            //regExp = /^[a-z][a-zA-Z0-9]{5,14}$/; //합치면 6~15글자


            //정규표현식에 test()함수를 이용해서 검사
            //정규표현식.test(문자열); : 정규표현식 만족 시 true / 아니면 false 리턴
            const check = regExp.test(value);
            if(check){
                alert("정규표현식 패턴 만족");
            }else{
                alert("불만족");
            }
        });
    </script>
</body>
</html>

2 - 2 ) 정규표현식 회원가입

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>정규표현식 회원가입</title>
    <script src="js/jquery-3.6.3.min.js"></script>
</head>
<body>
    <h1>회원가입</h1>
    <hr>
    <form action="join.html" method="post" autocomplete="off">
        <!-- autocomplete="off" : 자동완성 비활성화 -->
        <table>
            <tr>
                <th>아이디</th>
                <td>
                    <input type="text" name="id">
                    <span class="comment"></span>
                </td>
            </tr>
            <tr>
                <th>비밀번호</th>
                <td>
                    <input type="password" name="pw">
                    <span class="comment"></span>
                </td>
            </tr>
            <tr>
                <th>비밀번호확인</th>
                <td>
                    <input type="password" name="pwRe">
                    <span class="comment"></span>
                </td>
            </tr>
            <tr>
                <th>이름</th>
                <td>
                    <input type="text" name="name">
                    <span class="comment"></span>
                </td>
            </tr>
            <tr>
                <th>전화번호</th>
                <td>
                    <input type="text" name="phone1">
                    -
                    <input type="text" name="phone2">
                    -
                    <input type="text" name="phone3">
                    <span class="comment"></span>
                </td>
            </tr>
            <tr>
                <th>이메일</th>
                <td>
                    <input type="text" name="email1">
                    <span class="comment"></span>
                </td>
            </tr>
            <tr>
                <th colspan="2">
                    <input type="submit" value="회원가입">
                    <input type="reset" value="취소">
                </th>
            </tr>
        </table>
    </form>
    <script src="js/regJoin.js"></script>
</body>
</html>

 

3. 반응형 단위

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>반응형 단위</title>
    <link rel="stylesheet" href="css/responsive.css">
</head>
<body>
    <!-- 반응형 웹 (responsive web) 
    https://www.naver.com/ pc화면
    https://m.naver.com/ 모바일화면
    
    https://www.kakaocorp.com/page/
    pc와 모바일의 주소는 같지만 화면의 크기에 따라 css가 달라진다.(브라우저 크기)
 
    width/height
    모바일 min-width,max-width / min-height,max-height
    -->
    <h1>반응형 단위</h1>
    <hr>
    <div class="test">
        <div class="div1"></div>
        <div class="div1"></div>
        <div class="div1"></div>
        <div class="div1"></div>
    </div>
    <hr>
    <div class="test">
        <div class="div2"></div>
        <div class="div2"></div>
        <div class="div2"></div>
        <div class="div2"></div>
    </div>
    <div class="test2">
        <div class="div2"></div>
        <div class="div2"></div>
        <div class="div2"></div>
        <div class="div2"></div>
    </div>
    <div class="test3">
        <div class="div3"></div>
    </div>
</body>
</html>
body{
    margin: 0;
    /* width: 1000px; */
}
 
.test{
    background-color: antiquewhite;
    overflow: hidden;
    width: 100%;
    /* 브라우저 창이 아무리 작아져도 최소 넓이를 가짐 */
    min-width: 500px;
    /* 브라우저 창이 아무리 커져도 최대 넓이를 가짐 */
    max-width: 600px;
}
 
.div1{
    width: 100px;
    height: 100px;
    background-color: coral;
    border: 1px solid black;
    float: left;
}
 
.div2{
    /* 부모 넓이 기준 상대크기 -> (부모 넓이 빼면) 브라우저 창 크기에 따라 */
    width: 15%;
    height: 100px;
    background-color: cadetblue;
    border: 1px solid black;
    float: left;
}

.test2{
    /*너비를 따로주지않음 : 항상 100%를 가져감 */
    background-color: cornflowerblue;
    overflow: hidden;
    /*vw(viewport width) : 현재브라우저 크기의 너비를 100등분*/
    width: 50vw; /*부모기준이 아닌 현재 브라우저 크기의 50% - 브라우저가 줄어들면 같이 줄어든다 */
    /*vh(viewport height) : 현재브러우저 크기의 높이를 100등분*/
    height: 30vh;
    /*vw,vh : 브라우저크기가 바뀌면 동시에 변경됨*/
}

.test3{
    width: 500px;
    height: 300px;
    background-color: chocolate;
}

.div3{
    width: 50vw;
    height: 50vh;
    background-color: blue;
}

 

 

Comments