제이쿼리에 대해 배우고 있는데 메서드들이 많아서 수업시간에 다루는 메서드들은 암기할 필요가 있습니다.

오늘은 웹페이지를 작성할 때 제이쿼리에서 많이 사용되는 것을 배움

→ 객체 조작

 

제이쿼리의 객체조작

 

html(), html(요소명)

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script
            src="https://code.jquery.com/jquery-3.7.1.js"
            integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4="
            crossorigin="anonymous"></script>
        <script>
            $(function () {
                // 객체조작
                // 속성조작
                // html(),html(요소명) : 특정 태그를 포함한 텍스트까지를 범위로 하는 함수(메서드),(하위요소)
                // html() : 해당 대상을 읽어올 때 ()만 쓴다
                // html(요소명) : 해당 범위 안에 요소를 추가

                let result1 = $("#sec_1").html();
                console.log(result1)
                $("#sec_1 p").html("<a href=\"#\">Text1</a>");

                // text(), text("텍스트") 태그의 텍스트 부분만 범위로 사용한다

                let result2 = $("#sec_2").text();
                console.log(result2)
                $("#sec_2 h2").text("text()");
            });
        </script>
    </head>

    <body>
        <h1>
            <strong>객체 조작 및 생성</strong>
        </h1>
        <section id="sec_1">
            <h2>
                <em>html()</em>
            </h2>
            <p>내용1</p>
        </section>
        <section id="sec_2">
            <h2>
                <em>텍스트()</em>
            </h2>
            <p>내용2</p>
        </section>
    </body>
</html>

 

 

태그의 속성조작

attr("속성명"), attr("속성명", "새로운 값")
removeAttr("속성명") - 삭제
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script
            src="https://code.jquery.com/jquery-3.7.1.js"
            integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4="
            crossorigin="anonymous"></script>
        <script>
            $(function () {
                // 태그의 속성 조작
                // attr("속성명"), attr("속성명", "새로운 값")
                // removeAttr("속성명") - 삭제

                let srcVal = $("#sec_1 img").attr("src");
                console.log(srcVal);

                // 여러개의 속성을 줄 때는 , 로 구분한다
                $("#sec_1 img").attr({
                    "width":200, 
                    "src":srcVal.replace("1.jpg","2.jpg"),
                    "alt":"바위"
                }).removeAttr("border");
            });
        </script>
    </head>

    <body>

        <h1>
            <strong>객체 조작 및 생성</strong>
        </h1>
        <section id="sec_1">
            <h2>이미지 속성</h2>
            <p><img src="images/math_img_1.jpg" alt="바위" border="2"></p>
        </section>

    </body>
</html>

 

 

class 속성을 조작하는 메서드

addClass("class값").removeClass("class값")
toggleClass("class값"),hasClass("class값")
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script
            src="https://code.jquery.com/jquery-3.7.1.js"
            integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4="
            crossorigin="anonymous"></script>
        <script>
            $(function () {
                // class 속성을 조작하는 메서드 
                // addClass("class값").removeClass("class값")
                // toggleClass("class값"),hasClass("class값")

                $("#p1").addClass("aqua");
                $("#p2").removeClass("red");
                $("#p3").toggleClass("green"); // 없으면 들어가고 있으면 뺀다. -> 상태가 뭐냐에 따라 반대로 작업
                $("#p4").toggleClass("green"); // toggle 자체가 '없으면 들어가고 있으면 뺀다' 같은 개념
                $("#p6").text($("#p5").hasClass("yellow")); // 값이 있는지 없는지 판단. 있으면 true, 없으면 false
                // hasClass() 기존 값이 사라지고 새로운 값이 들어감

            });
        </script>
        <style>
            .aqua {
                background-color: #0ff;
            }
            .red {
                background-color: #f00;
            }
            .green {
                background-color: #0f0;
            }
            .yellow {
                background-color: #ff0;
            }
        </style>
    </head>

    <body>

        <p id="p1">내용1</p>
        <p id="p2" class="red">내용2</p>
        <p id="p3">내용3</p>
        <p id="p4" class="green">내용4</p>
        <p id="p5" class="yellow">내용5</p>
        <p id="p6"></p>

    </body>
</html>

 

 

폼태그의 값 조작

일반태그일 떄 text()
폼 태그일 땐 val() 
                
폼태그의 값 조작
val(), val("새로운 값")
prop() -> true, false : 선택상자, 체크박스, 라디오버튼 이런 것들을 활용하고 싶을 때
prop() -> 선택되었을 때 true, 선택되지 않았을 때 false , 선택 유무를 알려준다. 상태 체크!
prop("defalutValue")
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script
            src="https://code.jquery.com/jquery-3.7.1.js"
            integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4="
            crossorigin="anonymous"></script>
        <script>
            $(function () {
                // 일반태그일 떄 text()
                // 폼 태그일 땐 val() 
                
                // 폼태그의 값 조작
                // val(), val("새로운 값")
                // prop() : 선택상자, 체크박스, 라디오버튼 이런 것들을 활용하고 싶을 때
                // prop("defalutValue")

                let result1 = $("#user_name").val();  // 값을 읽어온다
                console.log(result1);

                let result2 = $("#user_id").val("javascript"); // () 안의 새로운 값으로 바뀐다
                console.log($("#user_id").val());

                let result3 = $("#user_id").prop("defaultValue");
                console.log(result3);
            });
        </script>
    </head>

    <body>
        <h1>객체 조작 및 생성</h1>
        <form action="#" id="form_1">
            <p>
                <label for="user_name">이름</label>
                <input type="text" name="user_name" id="user_name" value="용대리">
            </p>
            <p>
                <label for="user_id">아이디</label>
                <input type="text" name="user_id" id="user_id" value="hello">
            </p>
        </form>
    </body>
</html>

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script
            src="https://code.jquery.com/jquery-3.7.1.js"
            integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4="
            crossorigin="anonymous"></script>
        <script>
            $(function () {

                let result1 = $("#chk1").prop("checked"); 
                console.log(result1);  // false

                let result2 = $("#chk2").prop("checked"); 
                console.log(result2);  // true

                // 동적처리를 통해 스크립트에서 체크 표시를 변경 가능
                let result3 = $("#chk3").prop("checked",true); 

                // 그룹으로 묶여있을 때
                // 부모그룸을 지정하면 하위 그룹을 반환해준다
                // selected 되어진 인덱스 번호를 반환해준다.
                let result4 = $("#se_1").prop("selectedIndex");
                console.log(result4);  // 2

            });
        </script>
    </head>

    <body>

                <h1><strong>객체 조작 및 생성</strong></h1>
            <form action="#" id="form_1">
            <p>
                <input type="checkbox" name="chk1" id="chk1">
                <label for="chk1">chk1</label>
                <input type="checkbox" name="chk2" id="chk2" checked>
                <label for="chk2">chk2</label>
                <input type="checkbox" name="chk3" id="chk3">
                <label for="chk3">chk3</label>
            </p>
            <p>
                <select name="se_1" id="se_1">
                    <option value="opt1">option1</option>
                    <option value="opt2">option2</option>
                    <option value="opt3" selected>option3</option>
                </select>
            </p>
        </form>
    </body>
</html>

 

 

수치조작 메서드

 

객체조작 메서드 ( 수치 조작 메서드 )

객체 조작 메서드 ( 수치 조작 메서드 )

velog.io

width(), height() ....
width("새로운 값"), height("새로운 값") : 크기 변경
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script
            src="https://code.jquery.com/jquery-3.7.1.js"
            integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4="
            crossorigin="anonymous"></script>
        <script>
            $(function () {
                // 수치조작 메서드
                // width(), height() ....
                // width("새로운 값"), height("새로운 값") : 크기 변경

                let w1 = $("#p1").height();
                console.log(w1); // 50

                let w2 = $("#p1").innerHeight();
                console.log(w2); // 90

                let w3 = $("#p1").outerHeight();
                console.log(w3); //100

                $("#p2").outerWidth(100).outerHeight(100);

                
            });
        </script>
        <style>
            *{padding: 0;}
            #p1, #p2{
               width: 100px;
               height: 50px;
               padding:20px;
               border: 5px solid #000;
               background-color: #ff0;
            }
         </style>
    </head>

    <body>
        <h1>수치 조작 메서드</h1>
         <p id="p1">내용1</p>
         <p id="p2">내용2</p>
    </body>
</html>

 

 

요소의 위치 조작

position().[left, top, right, bottom] : 상대 위치값 
offset().[left, top]: 절대 위치값 -> 브라우저로 부터 떨어진 거리
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script
            src="https://code.jquery.com/jquery-3.7.1.js"
            integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4="
            crossorigin="anonymous"></script>
        <script>
            $(function () {
               // 요소의 위치 조작
               // position().[left, top, right, bottom] : 상대 위치값 
               // offset().[left, top]: 절대 위치값 -> 브라우저로 부터 떨어진 거리

               let $txt1 = $(".txt_1 span"), 
                   $txt2 = $(".txt_2 span"), 
                   $box = $(".box");

                let off_t = $box.offset().top;  // 100 브라우저가 기준
                let pos_t = $box.position().top;  // 50 부모, 현재 자신이 기준

                $txt1.text(off_t);
                $txt2.text(pos_t);

            });
        </script>
        <style>
            *{margin:0;padding:0;}
            #box_wrap{
               width:300px;
               height:200px;
               margin:50px auto 0;
               position: relative; 
               background-color:#ccc;
            }
            .box{
               width:50px;height:50px;
               position:absolute;
               left:100px;top:50px;
               background-color:#f00;
            }
         </style>


    </head>

    <body>
        <div id="box_wrap">
            <p class="box">박스</p>
         </div>
         <p class="txt_1">절대 top위칫값: <span></span></p>
         <p class="txt_2">상대 top위칫값: <span></span></p>
    </body>
</html>

 

 

브라우저의 스크롤 수치 조작

scrollTop(), scrollLeft() : 수치를 읽어올 때
scrollTop(새로운 값), scrollLeft(새로운 값)
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script
            src="https://code.jquery.com/jquery-3.7.1.js"
            integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4="
            crossorigin="anonymous"></script>
        <script>
            $(function () {
                // 브라우져의 스크롤 수치 조작
                // scrollTop(), scrollLeft() : 수치를 읽어올 때
                // scrollTop(새로운 값), scrollLeft(새로운 값)

                // let topNum = $("h1").offset().top; 
                // console.log(topNum);  // 2000px
                // $(window).scrollTop(topNum);

                // let sct =  $(window).scrollTop();
                // console.log(sct);  // 2000px 만큼 위치 이동

                $(window).scroll(function(){
                    let sct = $(window).scrollTop();
                    console.log(sct);

                    if(sct <= 2000){
                        $("body").css({"background-color":"tomato"});
                    }else if(sct > 2000 && sct <= 3000){
                        $("body").css({"background-color":"orange"});
                    }else{
                        $("body").css({"background-color":"yellow"});
                    }
                });
            });
        </script>
        <style>
            *{
                margin:0;
                padding:0;
            }

            body{
                line-height:1;
            }

            #wrap{
                  height:5000px;
                  padding-top:2000px;
            }
         </style>
    </head>

    <body>
        <div id="wrap">
            <h1>위치 메서드</h1>
      </div>
    </body>
</html>

 

 

객체 요소 편집

생성

before(), after(), 
append(), appendTo(), 
prepend(), prependTo(), 
insertBefore(), insertAfter()
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script
            src="https://code.jquery.com/jquery-3.7.1.js"
            integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4="
            crossorigin="anonymous"></script>
        <script>
            $(function () {
              // 객체 요소 편집
              // 생성, ...
              // before(), after(), 
              // append(), appendTo(), 
              // prepend(), prependTo(), 
              // insertBefore(), insertAfter()
              // remove()

            // 동위
            //   $("#wrap p:eq(2)").after("<p>After</p>"); // 기준을 앞에 정의
            //   $("<p>insertAfter</p>").insertAfter("#wrap p:eq(1)"); // 기준을 뒤에 정의

            //   $("#wrap p:eq(1)").before("<p>Before</p>"); 
            //   $("<p>insertBefore</p>").insertBefore("#wrap p:eq(0)");

            // 하위
            $("<li>appendTo</li>").appendTo("#listZone");  // 가장 마지막에 위치한다
            $("#listZone").prepend("<li>prepend</li>");  // 가장 앞쪽에 위치한다.


            });
        </script>

    </head>

    <body>

        <ul id="listZone">
            <li>리스트</li>
         </ul>

        <!-- <div id="wrap">
            <p>내용1</p>
            <p>내용2</p>
            <p>내용3</p>
         </div> -->
    </body>
</html>

 

복제, 삭제 ...
clone() : 복제
remove() : 삭제(해당요소를 포함한 모두 삭제)
empty() : 삭제(해당요소의 하위 요소만 삭제, 해당요소 자체는 남겨둔다.)
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script
            src="https://code.jquery.com/jquery-3.7.1.js"
            integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4="
            crossorigin="anonymous"></script>
        <script>
            $(function () {
              // 객체 요소 편집
              // 복제, 삭제 ...
              // clone() : 복제
              // remove() : 삭제(해당요소를 포함한 모두 삭제)
              // empty() : 삭제(해당요소의 하위 요소만 삭제, 해당요소 자체는 남겨둔다.)

              // children() 자식요소들을 가지고 옴
              let copyObj = $(".box1").children().clone();
              $(".box2").remove();

              $(".box3").empty();
              $(".box3").append(copyObj);

            });
        </script>

    </head>

    <body>
        <div class="box1">
            <p>내용1</p>
            <p>내용2</p>
         </div>
         <div class="box2">
            <p>내용3</p>
            <p>내용4</p>
         </div>
         <div class="box3">
            <p>내용5</p>
            <p>내용6</p>
         </div>
    </body>
</html>

 

 

제이쿼리의 이벤트

참고)

 

[jQuery]이벤트(Event) 종류

⊙ 이벤트(Event) •기본적으로 전역에 작성된 프로그램은 프로그램이 실행됨과 동시에 바로 실행되...

blog.naver.com

 

 

제이쿼리 이벤트를 주는 두 가지 방식

 

mouseover, mouseout, focus, blur

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script
            src="https://code.jquery.com/jquery-3.7.1.js"
            integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4="
            crossorigin="anonymous"></script>
        <script>
            $(function () {
                // 제이쿼리 이벤트를 주는 두 가지 방식
                // 단독 이벤트, 그룹 이벤트

                // 단독 이벤트
                // $("선택자").이벤트(익명함수 방식의 핸들러 function(){});

                // 그룹 이벤트 만드는 방식 두 가지.
                // 이벤트 나열할때 스페이스로 구분
                // $("선택자").on("이벤트종류1 이벤트종류2 이벤트종류n" , 익명함수 방식의 핸들러 function(){});
                // $("선택자").on({"이벤트종류1 이벤트종류2 이벤트종류n":function(){
                // }
                // });

                $(".btn1").click(function(){
                    $(".btn1").parent().next().css({"color":"red"});
                });

                // mouseover 마우스를 해당요소에 올려놓았을 때 
                // mouseout 마우스를 해당 요소에서 다른 곳에 두었을 때
                // focus 노드가 포커스를 획득했을 때
                // blur 포커스가 해당 요소를 벗어날때 -> tap으로 실행해볼 수 있음
                $(".btn2").on({
                    "mouseover focus":function(){
                        $(".btn2").parent().next().css({"color":"red"});
                    },
                    "mouseout blur":function(){
                        $(".btn2").parent().next().css({"color":"blue"});
                    }
                });

                // 이벤트 제거(이벤트를 동결시킬 때 사용)
                $(".btn1").off("click"); 
                
            });
        </script>
    </head>
    <body>
        <p>
            <button class="btn1">버튼1</button>
            </p>
            <p>내용1</p>
            <p>
               <button class="btn2">버튼2</button>
            </p>
            <p>내용2</p>
    </body>
</html>

 

 

hover

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script
            src="https://code.jquery.com/jquery-3.7.1.js"
            integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4="
            crossorigin="anonymous"></script>
        <script>
            $(function () {
                // mouseover 마우스를 해당요소에 올려놓았을 때 
                // mouseout 마우스를 해당 요소에서 다른 곳에 두었을 때

                // mouseover와 mouseout 사용
                $(".btn1").on({
                    "mouseover":function(){
                        $(".txt1").css({"background-color":"yellow"});
                    },
                    "mouseout":function(){
                        $(".txt1").css({"background":"none"});
                    }
                });

                // mouseover와 mouseout를 같이 처리해주는 hover
                // hover => mouseover + mouseout
                // hover는 focus와 같은 그륩이벤트 적용이 안된다.
                $(".btn2").hover(
                    function(){  // mouseover
                        $(".txt2").css({"background-color":"skyblue"});
                    },
                    function(){  // mouseout
                        $(".txt2").css({"background":"none"});
                    }
                );

            });
        </script>
    </head>
    <body>
        <p><button class="btn1">Mouse Over/Mouse Out</button></p>
        <p class="txt1">내용1</p>
        <p><button class="btn2">Hover</button></p>
        <p class="txt2">내용2</p>
    </body>
</html>

 

 

mousemove 이벤트

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script
            src="https://code.jquery.com/jquery-3.7.1.js"
            integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4="
            crossorigin="anonymous"></script>
        <script>
            // mousemove
            // mouse가 움직이는 좌표값을 받아서 이벤트를 발생
            // function(e) -> e 는 event 객체, X축과 Y축의 값을 받아올 수 있다
            // 키보드와 마우스는 운영체제가 관리
            // 윈도우를 띄웠을 때 보이는 흰색 배경을 document라고 한다.
            $(function () {
                $(document).on("mousemove",function(e){
                    $(".posX").text(e.pageX);
                    $(".posY").text(e.pageY);
                });
            });
            
        </script>
    </head>
    <body>
        <h1>mousemove</h1>
        <p>X : <span class="posX">0</span>px</p>
        <p>Y : <span class="posY">0</span>px</p>
    </body>
</html>

시험에서 나온 문제들

기록용으로 문제도 남겼어야 했는데 답만 적었다.. 뭔지 알아두는 게 좋을 듯하다.

 

GUI(그래픽 유저 인터페이스, Graphical User Interface

-> 그래픽 유저 인터페이스(GUI, Graphical User Interface)는 사용자가 컴퓨터와 상호작용할 수 있는 방법 중 하나로, 아이콘, 메뉴, 창 등 그래픽 요소를 통해 정보를 표현하고 사용자 입력을 받아들입니다. 사용자가 마우스, 키보드 등의 장치를 통해 그래픽 요소를 조작함으로써 소프트웨어를 제어할 수 있습니다. 이는 명령어를 직접 입력해야 하는 텍스트 기반 인터페이스에 비해 직관적이고 사용하기 쉽다는 장점이 있습니다.

와이어프레임(Wireframe)

-> 와이어프레임(Wireframe)은 웹사이트나 애플리케이션의 구조를 시각적으로 표현하는 방법입니다. 이는 화면 레이아웃, 페이지 간의 연결관계, 사용자 인터페이스 요소의 배치와 우선순위 등을 보여주는 역할을 합니다. 와이어프레임을 통해 개발자와 디자이너는 제품의 흐름, 기능, 사용성 등을 이해하고, 사용자 경험을 최적화하는 데 도움이 됩니다.

W3C(World Wide Web Consortium)

-> W3C(World Wide Web Consortium)는 월드 와이드 웹을 위한 표준을 개발하고 관리하는 국제 커뮤니티입니다. 이 조직은 웹의 장기적인 성장을 보장하기 위해 웹 표준을 개발하며, HTML, CSS 등 많은 중요한 웹 기술 표준을 제공하고 있습니다.

웹 표준(Web Standards)

-> 웹 표준(Web Standards)는 웹에서 사용되는 기술이나 규칙을 표준화하여, 웹이 운영체제, 브라우저, 장치 등에 상관없이 일관되게 동작할 수 있도록 하는 규약입니다. 이는 웹 접근성을 보장하고, 웹의 호환성을 높이는데 큰 역할을 합니다. 웹 표준을 준수하면, 웹사이트의 유지보수가 용이하고, 검색 엔진 최적화(SEO)에도 유리합니다.

 

시험에선 이걸 만들었는데 저 흰색 부분 구현이 안됐고.. 로그인과 자켓 등 뭐 선택하는 태그들에도 데코레이션 논을 안줬다. 생각이 안났다.. 찾아보면 되는건데 왜 그렇게 정신이 없었는지ㅠ

 

 

제이쿼리 속성선택자

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://code.jquery.com/jquery-3.7.1.js" integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4=" crossorigin="anonymous"></script>
    <script>
        $(function(){

            // 속성 선택자
            $("#wrap a[target]").css("color","red");
            $("#wrap a[href^=https]").css("color","blue");
            //앞에 https가 들어간 녀석이 있으면 blue로 바꿔라 , 가장 최근에 사용된 css가 적용이 된다
            $("#wrap a[href$=net]").css("color","green");
            //net로 끝나는 값이 있으면 green으로 바꿔라
        });

    </script>
</head>
<body>
    <div id="wrap">
        <p><a href="https://www.naver.com" target="_blank">naver</a></p>
        <p><a href="http://www.daum.net">daum</a></p>
    </div>

</body>
</html>

 

 

제이쿼리 속성선택자2_1

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script
            src="https://code.jquery.com/jquery-3.7.1.js"
            integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4="
            crossorigin="anonymous"></script>
        <script>
            $(function(){
                // 속성의 상태 탐색, css를 두 개 이상 주는 법
                $('#wrap p:hidden').css({"display":"block","color":"red"});

                // val() -> 폼의 value 속성을 가져오는 메서드
                // :selected 처럼 뒤에 뭐가 붙어있는지 볼 때 띄어쓰기를 하면 안된다!
                let z1 = $("#zone1 :selected").val();
                console.log(z1);

                let z2 = $("#zone2 :checked").val();
                console.log(z2);
            });

        </script>
    </head>
    <body>
        <div id="wrap">
            <p>내용1</p>
            <p style="display:none">내용2</p>
            <p>내용3</p>
        </div>
        <form action="#">
            <p id="zone1">
                <select name="course" id="course">
                    <option value="opt1">옵션1</option>
                    <option value="opt2" selected="selected">옵션2</option>
                    <option value="opt3">옵션3</option>
                </select>
            </p>
            <p id="zone2">
                <input type="checkbox" name="hobby1" value="독서">
                독서
                <input type="checkbox" name="hobby2" value="자전거">
                자전거
                <input type="checkbox" name="hobby3" value="등산" checked="checked">
                등산
            </p>
            <p id="zone3">
                <input type="radio" name="gender" value="male">
                남성
                <input type="radio" name="gender" value="female" checked="checked">
                여성
            </p>
        </form>

    </body>
</html>

 

제이쿼리 속성선택자2_2

<script>
        $(function(){
                // 속성선택자
                $("#member_f :text").css("background-color","red");
                $("#member_f :password").css("background-color","blue");
            });
    </script>
</head>
<body>
    <form action="#" method="get" id="member_f">
        <p>
           <label for="user_id">아이디</label>
           <input type="text" name="user_id" id="user_id">
        </p>
        <p>
           <label for="user_pw">비밀번호</label>
           <input type="password" name="user_pw" id="user_pw">
        </p>
     </form>

 

 

콘텐츠 탐색 선택자

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script
    src="https://code.jquery.com/jquery-3.7.1.js"
    integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4="
    crossorigin="anonymous"></script>
    <script>

        $(function() {
            //contains() : 해당 요소에 해당 문자가 포함되어 있는지 포함되어 있으면 : 해라~
            $("#inner_1 p:contains(내용1)").css("color", "red");

            //contains() : 해당 요소의 하위요소(1 depth = 1 밑에 = 바로 밑에) 텍스트와 태그노드를 선택
            $("#outer_wrap").contents().css({"border":"1px dashed #00f"});

            //has() : 해당요소가 지정한 태그를 포함하면 선택
            $("#inner_1 p:has(strong)").css("color", "blue");

            //not() : 지장한 요소를 제외한 나머지 선택
            $("#inner_2 p").not(":first").css({"background-color":"yellow"});

            //end() : 현재 선택된 요소의 이전 요소를 선택하는 메서드
            //$("#inner_2 p").eq(2).end().css("color","green");

            // $("tr")....eq(0)  : 첫번째가 선택
            // $("tr")....eq(-1)  : 마지막에서 첫번째 선택
            // $("tr")....eq(-2)  : 마지막에서 두번째 선택
            $("#inner_2 p").eq(1).css("color", "yellow").end();
        });

    </script>
</head>
<body>
    <div id="outer_wrap">
        <h1>콘텐츠 탐색 선택자</h1>
        <section id="inner_1">
           <h1>contains( ), contents( ), has( )</h1>
           <p><span>내용1</span></p>
           <p><strong>내용2</strong></p>
           <p><span>내용3</span></p>
        </section>
        <section id="inner_2">
           <h1>not( ), end( )</h1>
           <p>내용4</p>
           <p>내용5</p>
           <p>내용6</p>
        </section>
     </div> 
</body>
</html>

 

 

end() 메서드

 

다음은 체이닝과 관련된 end() 메소드입니다. 
체이닝이란 

$('h1').css('background','orange').filter(':even').css('color', 'red');
 
이렇게 한줄에 여러 메소드를 이어서 쓰는 걸 말해요. 

그리고 필터 메소드의 단점은 사용할수록 범위를 계속 좁게만 선택할 수 있게 되는거에요. 

그래서 end()메소드가 필요합니다. end()메소드는 문서객체 선택을 한단계 뒤로 돌려요.
 

알통몬의 인생 : 네이버 블로그

알통몬입니다. 이웃신청 다 받아요^^ 티스토리 블로그도 해요. https://altongmon.tistory.com 문의 E-mail: rain483@naver.com kakaoTalk: psk0918

blog.naver.com

 

 

find(), filter() 메서드

<script>
        $(function(){

            //find() : 하위 요소 중에 필터링 할 요소
            $("#inner_1").find(".txt1").css("color", "red");

            //filter() : 선택한 요소 중에 필터링할 요소
            $("#inner_1 p").filter(".txt2").css("color", "blue");

            $("#inner_2 p").filter(function(idx,obj){    
                console.log(idx);
                // 0이 짝수로 판단되어진다
                return idx % 2 === 0;
            }).css({"background-color" :"yellow"});

        });
    </script>
</head>
<body>
    <div id="outer_wrap">
        <h1>콘텐츠 탐색 선택자</h1>
        <section id="inner_1">
           <h2>find( ), filter( )</h2>
           <p class="txt1">내용1</p>
           <p class="txt2">내용2</p>
        </section>
        
        <section id="inner_2">
           <h2>filter(function)</h2>
           <p>index 0</p>
           <p>index 1</p>
           <p>index 2</p>
           <p>index 3</p>
        </section>
     </div>
</body>

 

 

 

작성 : 2024. 5. 3. 8:47

 

나는 빡대가리가 맞았다.

그리고 퐁규도 어쩌면 빡대가리일지도..

자동차 색깔 바꾸는 프로그래밍 초창기 내가 망친 ver.

계산 됨. 색 안됨

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>자동차 견적내기</title>
        <style type="text/css">
            * {
                margin: 0;
                padding: 0;
            }

            body {
                font: 12px/1.5 dotum,"돋움", gulim, "굴림", sans-serif;
            }

            li {
                list-style: none;
            }

            table {
                border-collapse: collapse;
                border-spacing: 0;
            }

            h1 {
                text-align: center;
            }

            #carZone {
                width: 600px;
                margin: 0 auto;
            }

            #estimate {
                width: 100%;
            }

            #estimate th,
            td {
                border: 1px solid #ccc;
                height: 30px;
            }

            #estimate th {
                background-color: #333;
                color: #fff;
            }

            #carZone td {
                text-align: center;
            }

            tfoot {
                font-size: 15px;
                font-weight: bold;
            }

            #total {
                border: none 0;
                background: none;
                font-size: 1.5em;
                font-weight: bold;
                text-align: center;
            }
        </style>

        <script>
            // 자동차 가격 바꾸기
            function car() {
                //let basic_car = parseInt(document.getElementById("total").defaultValue);
                let basic_car = Number(document.getElementById("total").defaultValue);
                let color_price = 0;

                let colorChkCnt = document
                    .querySelectorAll('.opt4:checked')
                    .length;
                let colorChk = document.getElementById("opt4")
                if (colorChkCnt > 0) {
                    color_price += Number(colorChk.value);
                }

                for (let i = 1; i <= 3; i++) {
                    let chkObj = document.getElementById("opt" + i)
                    if (chkObj.checked) {
                        basic_car += Number(chkObj.value)
                    }
                }

                basic_car += color_price;
                document.getElementById("total").value = basic_car;
            }

            // 자동차 색 바꾸기
            // function changeColor(colorIndex) {
            // // 모든 이미지를 숨김
            // let images = document.querySelectorAll('#showColor img');
            // images.forEach(image => {
            // image.style.display = 'none';
            // });

            // // 선택한 색상의 이미지만 보이도록 변경
            // images[colorIndex].style.display = 'block'; 
            //}

            function showColor() {
                document.getElementsByName("").sre = "./"
            }


        </script>

    </head>
    <body>

        <h1>자동차 견적</h1>

        <div id="carZone">
            <p id="showColor">
                <img src="images/car4.jpeg" alt="자동차"/>
                <img src="images/car.jpeg" alt="자동차"/>
                <img src="images/car3.jpeg" alt="자동차"/>
                <img src="images/car2.jpeg" alt="자동차"/>
            </p>

            <table id="estimate">
                <colgroup>
                    <col width="380px"/>
                    <col width="160px"/>
                    <col width="160px"/>
                </colgroup>
                <thead>
                    <tr>
                        <th scope="row">옵 션</th>
                        <th scope="row">추가 가격</th>
                        <th scope="row">선택</th>
                    </tr>
                </thead>
                <tfoot>
                    <tr>
                        <th scope="col">(기본)차량가격</th>
                        <td colspan="2">
                            <input
                                type="text"
                                name="total"
                                id="total"
                                value="13450000"
                                readonly="readonly"/>
                        </td>
                    </tr>
                </tfoot>
                <tbody>
                    <tr>
                        <td>
                            <label for="opt1">인조가죽시트</label>
                        </td>
                        <td>250000</td>
                        <td>
                            <!-- 옵션 체크박스에 클릭할 때 마다 car()에 저장된 일련의 실행문을 실행합니다. -->
                            <input type="checkbox" name="opt1" id="opt1" value="250000" onclick="car();"/></td>
                    </tr>
                    <tr>
                        <td>
                            <label for="opt2">내비게이션</label>
                        </td>
                        <td>250000</td>
                        <td><input type="checkbox" name="opt2" id="opt2" value="250000" onclick="car();"/></td>
                    </tr>
                    <tr>
                        <td>
                            <label for="opt3">선루프</label>
                        </td>
                        <td>440000</td>
                        <td><input type="checkbox" name="opt3" id="opt3" value="440000" onclick="car();"/></td>
                    </tr>
                    <tr>
                        <td>
                            <label for="opt4">색상선택</label>
                        </td>
                        <td>100000</td>
                        <td>
                            <input
                                type="radio"
                                name="opt4"
                                id="opt4"
                                value="100000"
                                class="opt4"
                                onclick="car();"/>red
                            <input
                                type="radio"
                                name="opt4"
                                id="opt4"
                                value="100000"
                                class="opt4"
                                onclick="car();"/>green
                            <input
                                type="radio"
                                name="opt4"
                                id="opt4"
                                value="100000"
                                class="opt4"
                                onclick="car();"/>blue
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
    </body>
</html>

 

 

두번째, 뭔가 더 해본 ver.

계산 됨, 색 안됨

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>자동차 견적내기</title>
        <style type="text/css">
            * {
                margin: 0;
                padding: 0;
            }

            body {
                font: 12px/1.5 dotum,"돋움", gulim, "굴림", sans-serif;
            }

            li {
                list-style: none;
            }

            table {
                border-collapse: collapse;
                border-spacing: 0;
            }

            h1 {
                text-align: center;
            }

            #carZone {
                width: 600px;
                margin: 0 auto;
            }

            #estimate {
                width: 100%;
            }

            #estimate th,
            td {
                border: 1px solid #ccc;
                height: 30px;
            }

            #estimate th {
                background-color: #333;
                color: #fff;
            }

            #carZone td {
                text-align: center;
            }

            tfoot {
                font-size: 15px;
                font-weight: bold;
            }

            #total {
                border: none 0;
                background: none;
                font-size: 1.5em;
                font-weight: bold;
                text-align: center;
            }
        </style>

        <script>
            // 자동차 가격 바꾸기
            function car() {
                //let basic_car = parseInt(document.getElementById("total").defaultValue);
                let basic_car = Number(document.getElementById("total").defaultValue);

                for (let i = 1; i <= 6; i++) {
                    let chkObj = document.getElementById("opt" + i)
                    if (chkObj.checked) {
                        basic_car += Number(chkObj.value)
                    }
                }
                document.getElementById("total").value = basic_car;
            }

            자동차 색상 변경 함수
            function carColor(obj) {

                let carImage = document.getElementById("selected-image");
                switch(obj.id) {
                case "opt4":
                    carImage.src = "images/car.jpeg";
                    break;
                case "opt5":
                    carImage.src = "images/car3.jpeg";
                    break;
                case "opt6":
                    carImage.src = "images/car2.jpeg";
                    break;
            }

            }


        </script>

    </head>
    <body>

        <h1>자동차 견적</h1>

        <div id="carZone">
            <p id="showColor">
                <img src="images/car4.jpeg" alt="기본 자동차" id="selected-image"/>
            </p>

            <table id="estimate">
                <colgroup>
                    <col width="380px"/>
                    <col width="160px"/>
                    <col width="160px"/>
                </colgroup>
                <thead>
                    <tr>
                        <th scope="row">옵 션</th>
                        <th scope="row">추가 가격</th>
                        <th scope="row">선택</th>
                    </tr>
                </thead>
                <tfoot>
                    <tr>
                        <th scope="col">(기본)차량가격</th>
                        <td colspan="2">
                            <input
                                type="text"
                                name="total"
                                id="total"
                                value="13450000"
                                readonly="readonly"/>
                        </td>
                    </tr>
                </tfoot>
                <tbody>
                    <tr>
                        <td>
                            <label for="opt1">인조가죽시트</label>
                        </td>
                        <td>250000</td>
                        <td>
                            <!-- 옵션 체크박스에 클릭할 때 마다 car()에 저장된 일련의 실행문을 실행합니다. -->
                            <input type="checkbox" name="opt1" id="opt1" value="250000" onclick="car();"/></td>
                    </tr>
                    <tr>
                        <td>
                            <label for="opt2">내비게이션</label>
                        </td>
                        <td>250000</td>
                        <td><input type="checkbox" name="opt2" id="opt2" value="250000" onclick="car();"/></td>
                    </tr>
                    <tr>
                        <td>
                            <label for="opt3">선루프</label>
                        </td>
                        <td>440000</td>
                        <td><input type="checkbox" name="opt3" id="opt3" value="440000" onclick="car();"/></td>
                    </tr>
                    <tr>
                        <td>
                            <label for="opt4">색상선택</label>
                        </td>
                        <td>100000</td>
                        <td>
                            <input
                                type="radio"
                                name="colorRed"
                                id="opt4"
                                value="100000"
                                class="opt4"
                                onclick="car();"/>red
                            <input
                                type="radio"
                                name="colorGreen"
                                id="opt5"
                                value="100000"
                                class="opt4"
                                onclick="car();"/>green
                            <input
                                type="radio"
                                name="colorBlue"
                                id="opt6"
                                value="100000"
                                class="opt4"
                                onclick="car();"/>blue
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
    </body>
</html>

 

 

우리 조의 구세주 ver.

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style type="text/css">
            * {
                margin: 0;
                padding: 0;
            }
            body {
                font: 12px/1.5 dotum,"돋움", gulim, "굴림", sans-serif;
            }
            li {
                list-style: none;
            }
            table {
                border-collapse: collapse;
                border-spacing: 0;
            }

            h1 {
                text-align: center;
            }
            #carZone {
                width: 600px;
                margin: 0 auto;
            }
            #estimate {
                width: 100%;
            }
            #estimate th,
            td {
                border: 1px solid #ccc;
                height: 30px;
            }
            #estimate th {
                background-color: #333;
                color: #fff;
            }
            #carZone td {
                text-align: center;
            }
            tfoot {
                font-size: 15px;
                font-weight: bold;
            }
            #total {
                border: none 0;
                background: none;
                font-size: 1.5em;
                font-weight: bold;
                text-align: center;
            }
        </style>
        <script>
            function car() {
                //let basic_car =parseInt(document.getElementById("total").defaultValue);
                let basic_car = Number(document.getElementById("total").defaultValue); //parseInt(정수전체) = Number(숫자전체)

                for (let i = 1; i <= 6; i++) {
                    let chkObj = document.getElementById("opt" + i)
                    if (chkObj.checked) {
                        basic_car += Number(chkObj.value)
                    }
                }
                document.getElementById("total").value = basic_car;

                let carcolor1 = document.getElementById("opt4")
                let carcolor2 = document.getElementById("opt5")
                let carcolor3 = document.getElementById("opt6")

                if (carcolor1.checked) {
                    document
                        .getElementById("carcolor")
                        .src = "./images/car1.jpeg"
                }
                if (carcolor2.checked) {
                    document
                        .getElementById("carcolor")
                        .src = "./images/car3.jpeg"
                }
                if (carcolor3.checked) {
                    document
                        .getElementById("carcolor")
                        .src = "./images/car2.jpeg"
                }
            }
        </script>

    </head>
    <body>
        <h1>자동차 견적</h1>
        <div id="carZone">
            <p ><img id="carcolor" src="./images/car4.jpeg" alt="자동차"/></p>
            <table id="estimate">
                <colgroup>
                    <col width="380px"/>
                    <col width="160px"/>
                    <col width="*"/>
                </colgroup>
                <thead>
                    <tr>
                        <th scope="row">옵 션</th>
                        <th scope="row">추가 가격</th>
                        <th scope="row">선택</th>
                    </tr>
                </thead>
                <tfoot>
                    <tr>
                        <th scope="col">(기본)차량가격</th>
                        <td colspan="2">
                            <input
                                type="text"
                                name="total"
                                id="total"
                                value="13450000"
                                readonly="readonly"/>
                        </td>
                    </tr>
                </tfoot>
                <tbody>
                    <tr>
                        <td>
                            <label for="opt1">인조가죽시트</label>
                        </td>
                        <td>250000</td>
                        <td>
                            <!-- 옵션 체크박스에 클릭할 때 마다 car()에 저장된 일련의 실행문을 실행합니다. -->
                            <input type="checkbox" name="opt1" id="opt1" value="250000" onclick="car();"/></td>
                    </tr>
                    <tr>
                        <td>
                            <label for="opt2">내비게이션</label>
                        </td>
                        <td>250000</td>
                        <td><input type="checkbox" name="opt2" id="opt2" value="250000" onclick="car();"/></td>
                    </tr>
                    <tr>
                        <td>
                            <label for="opt3">선루프</label>
                        </td>
                        <td>440000</td>
                        <td><input type="checkbox" name="opt3" id="opt3" value="440000" onclick="car();"/></td>
                    </tr>
                    <tr>
                        <td>
                            <label for="opt4">색상선택</label>
                        </td>
                        <td>100000</td>
                        <td>
                            <input type="radio" name="opt4" id="opt4" value="100000" onclick="car();"/>red
                            <input type="radio" name="opt4" id="opt5" value="100000" onclick="car();"/>green
                            <input type="radio" name="opt4" id="opt6" value="100000" onclick="car();"/>blue
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
    </body>
</html>

함수를 두 개 못쓰면 그냥 안쓰면 되는 것이었다..ㅋ

함수를 하나 더 만든 바람에 함수 두개를 어떻게 써야하지? 이러고 해맴..

 


 

 

이제 오늘의 내용 :

   <script>

        // EM6 버전으로 넘어오며 생긴 것들
        // var, let, const 버전이 업되면서 구분되기 위해 사용
        // 될 수 있으면 let을 사용
        // 함수의 호이스팅
        // 화살표 함수 

         this.num = 10;
        
         let obj = {
             num : 5,
             add1 : function(a) {
                 console.log(this.num + a , this);  // 8
             },

             add2 : (a) => {
                 // 화살표 함수는 this가 없다 
                 console.log(this.num + a , this);  // NaN
             }
         }

         obj.add1(3);
         obj.add2(3);


---------------------------------------------------------------------------


        // 기본값에 대해
         function addNum(a = 0, b = 0){
             console.log(a + b); // 기본값 넣기 전 : NaN , 넣은 후 : 5
             console.log(a);  // 기본값 넣기 전 : 5 , 넣은 후 : 5
             console.log(b);  //기본값 넣기 전 : undefined , 넣은 후 : 0
         }

         addNum(5); 
     
         
---------------------------------------------------------------------------


        // EM5 
         function addNum(){ //가변형인자
             // argument 
             for(let i = 0; i < arguments.length; i++){
                 console.log(arguments[i])
             }
         }
         console.log(addNum());
         console.log(addNum(1));
         console.log(addNum(1, 2, 3));  // 배열구조
   
        
---------------------------------------------------------------------------
        

        // EM6 가변인자를 직접 표시해서 사용 , 자바와 똑같음
         function addNum(... number){
             for(let i = 0; i < number.length; i++){
                  console.log(number[i])
              }
         }
         addNum(1, 2, 3);
         
         
---------------------------------------------------------------------------


        // 펼침연산자
          let numbers = [1, 2, 3, 4, 5];
          let max;

          max = Math.max(...numbers);
          console.log(max); // 5

         console.log(numbers);  // [1, 2, 3, 4, 5]
         console.log(...numbers);  // 1, 2, 3, 4, 5

         let numbers = [1, 2, 3, 4, 5];
         let max;

         for(let i = 0; i < numbers.length; i++) {
             if (numbers[i] > numbers[0]) {
                 max = numbers[i];
             }
         }

         console.log(max); // 5
         
         
---------------------------------------------------------------------------


        // 스크립트의 향상된 for문
         let numbers = [1, 2, 3, 4, 5];
         for (let i of numbers) {
             console.log(i);
         }
         
         
---------------------------------------------------------------------------


        // ~ 자판 영어 상태일 때는 `가 입력된다.
        // 표현식 (백티)
         let name = 'hong';
         console.log("나의 이름은" + name + "입니다.");

         let num1 = 1;
         let num2 = 2;
         let text = `${num1}과 ${num2}의 합계는 ${num1} + ${num2} 입니다`
         console.log(text);
         
         
---------------------------------------------------------------------------


        // 배열의 비구조화
         let numbers = [3, 4];
         let a, b; 

         a = numbers[0];
         b = numbers[1];

         let numbers = [3,4,5];
         let [a, b] = numbers; 
         let [c, ,d] = numbers;

         console.log(a);  // 3
         console.log(b);  // 4
         console.log(`${c} ${d}`);  // 3 5

         let numbers = [1, 2, 3];
         let [a, ...b] = numbers;
         console.log(a); // 1
         console.log(b);  // (2) [2, 3]


    </script>

 

 

제이 쿼리

$(function(){

});

위와 같이 쓰는 것이

window.onload = function(){  // 현재 페이지가 모두 로딩되기 전까지 대기

}

와 같다.

 

제이쿼리를 CDN 방식으로 불러와 작성

    <script src="https://code.jquery.com/jquery-3.7.1.js" integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4=" crossorigin="anonymous"></script>
    <script>


        // 제이쿼리 문법으로 위 식을 표현하기 onload 이벤트와 똑같음.
        // $("document").ready(function(){

        // });

        // 생략된 버전
        $(function(){
             $("선택자").기능();  // 제이쿼리의 기본 문법
             $("#title").css("color", "red");
             $("*").css("color","red");
             $(".tit").css("color","blue");
             $("h3").css("color","green");
             $("h1,h2").css("color", "red"); // 두 가지 태그를 넣기

            // 종속선택자
             $("h2.tit").css("color", "red");

             parent(), parents(), parents(div)와 같이 선택할 수 있음, closest(요소이름)
             next(), prev(), siblings()
             nextAll(), prevAll()

             $("h2").next().css("color", "red");
             $("h2").parent().css("border", "1px solid red");
             $("#inner_wrap h1").css("color", "green");

            // 자식선택자
             $("#inner_wrap > p").css("color", "red");
             $(".txt").siblings().css("color", "red");  // 나를 뺀 형제들을 선택할 때
             $(".txt").parents().css("border", "1px solid red")

            // 상위요소 closest()

            $(".txt1").closest("div").css("border", "1px solid red");

        });

    </script>
</head>
<body>
    <!-- <h1 id="title">제목</h1> -->
    <!-- <h1>선택1</h1>
    <h2 class="tit">선택2</h2>
    <h2>선택2_1</h2>
    <h3>선택3</h3> -->

    <!-- 인접선택자 -->

    <!-- a는 c의 상위 closest
    b는 c의 부모 parent
    c는 b의 자식 children
    d는 e의 형 prev
    f는 e의 동생 next -->

    <!-- <div id ="wrap"> 
        <div id="inner_wrap">
            <h1>제목1</h1>
            <h2>제목2</h2>
            <p class="txt">내용1</p>
            <p>내용2</p>
            <p>내용3</p> -->

        <h1 class="title">선택자</h1>
        <div>
            <div>
                <p class="txt1">내용</p>
            </div>
        </div>

</body>

형식은 무조건 외워야 함. 이해의 문제가 아니라 어떻게 코드를 쓰는 건지는 기본적으로 익숙하게 쳐야 한다.

 

 

 

a는 c의 상위 closest

b는 c의 부모 parent

c는 b의 자식 children

d는 e의 형 prev

f는 e의 동생 next

 

 

탐색선택자 / 배열 관련 메서드

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script
            src="https://code.jquery.com/jquery-3.7.1.js"
            integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4="
            crossorigin="anonymous"></script>
        <script>
            $(function () {
                // 탐색선택자
                // $("#menu li:first").css("color", "red");
                // $("#menu li:last").css("color", "red");

                // $("#menu li:even").css("color", "red"); // 짝수 (기준은 인덱스번호 0, 2)
                // $("#menu li:odd").css("color", "blue"); // 홀수 (기준은 인덱스번호 1, 3)

                // $("#menu li").eq(2).css("color", "red"); // eq() 가로 안에는 인덱스 번호
                // $("#menu li:lt(2)").css("color", "blue"); // lt = less then 자기 자신보다 작은, 미만 (자신 포함 x)
                // $("#menu li:gt(2)").css("color", "blue");  // gt = greater then 자기 자신보다 큰 (자신 포함 x)

                // nth-child() -> 가로 안에 작성된 순서, 위치 번호 적기 
                // $("#menu1 li:nth-child(1)").css("color", "red");
                // $("#menu1 li:nth-child(2n)").css("color", "blue");  

                // $("#menu1 li:nth-last-child(2)").css("color", "green"); // 역순


---------------------------------------------------------------------------

                // 배열 관련 메서드 -> 읽기 (효율성 증가)
                // 배열 안에 객체가 들어있음
                 each, foreach -> return 이 없다 
                 map : 반복문 -> 결과를 새로운 배열로 만든다.
                 index() : 요소의 인덱스 번호

                 let obj = [
                     {"area" : "서울"},
                     {"area" : "부산"},
                     {"area" : "전주"}
                 ];

                 $(obj).each(function(i, o){  // i => index, o -> 배열의 값
                     console.log(i + ":" , o)  // 객체로 출력
                 });

                // $.each($("#menu2 li"), function(i, o){  // i => index, o -> 배열의 값
                //     console.log(i + ":" , o)  // <li></li> 태그 출력
                // });

                // obj.forEach(function(value,index,array){
                //     console.log(`Value: ${value}, Index: ${index}, Array: ${array}`)
                // });

                let arr1 = [
                    {
                        "area" : "서울",
                        "name" : "무대리"
                    },

                    {
                        "area" : "부산",
                        "name" : "홍과장"
                    },

                    {
                        "area" : "대전",
                        "name" : "박사장"
                    },

                    {
                        "area" : "서울",
                        "name" : "빅마마"
                    }
                ];

                // map : 반복문, for문이라고 생각하면 된다 -> 결과를 새로운 배열로 만든다. 
                let arr2 = $.map(arr1, function(a, b){  // a가 배열의 값을 받아온다, b가 인덱스
                    if (a.area === "서울"){
                        return a;
                    }
                });

                console.log(arr1);
                console.log(arr2);
                

                let index = $("li").index($("#list3"));
                console.log(index); // 2

            });
        </script>
    </head>
    <body>


        <ul id="menu1">
            <li>내용1_1</li>
            <li>내용1_2</li>
            <li id="list3">내용1_3</li>
            <li>내용1_4</li>

        </ul>
        <!-- <ul id="menu2">
            <li>내용2_1</li>
            <li>내용2_2</li>
            <li>내용2_3</li>
        </ul> -->
    </body>
</html>

 

 

 

자바스크립트 이벤트

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        // Event 2가지 방식
        // 1. 인라인 정의 방식
        // 2. 내부 정의 방식

        window.onload = function(){
            let btn = document.getElementById("target");
            btn.addEventListener("click", function(event){
                alert('hellow world' + btn.value);
               //alert('hellow world' + event.target.value);
            });
        }
    </script>
</head>
<body>
    <!-- 1번 방식 -->
    <input type="button" onclick="alert('hello' + this.value)" value="인라인 이벤트">

    <input type="button" id="target" value="내부 이벤트">
</body>
</html>

 

 

 

이벤트 예제

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

            * {
                list-style-type: none;
            }

            a {
                text-decoration: none;
                color: inherit;  
            }

            .tab {
                display: flex;
                align-items: center;
                padding: 1rem;
            }

            .tab__item {
                padding: 0.6rem 1.3rem;
                margin-right: 1rem;
                border: 1px solid #ddd;
                border-radius: 2rem;
            }

            .tab__item.active {
                display: inline-block;
                border: 1px solid tomato;
                background-color: tomato;
                color: white;
            }

            .tab__content-wrapper {
                padding: 1rem;
            }

            .tab__content {
                display: none;
            }

            .tab__content.active {
                display: block;
            }

        </style>
        <script>
            window.onload = function(){
                let tabItem = document.querySelectorAll(".tab__item");
                let tabContent = document.querySelectorAll(".tab__content");

                tabItem.forEach((item, index) => {

                    item.addEventListener("click", function(event){
                        event.preventDefault(); // a 태그 속성 제거 -> 링크 속성 금지
                        
                        tabContent.forEach((content) => {
                            content.classList.remove("active");
                        });

                        tabItem.forEach((content) => {
                            content.classList.remove("active");
                        });

                        tabItem[index].classList.add("active");
                        tabContent[index].classList.add("active");

                    }); //addEventListener end
                }); // forEach end
            };
        </script>
    </head>
    <body>

        <ul class="tab">
            <li class="tab__item active">
                <a href="#tab1">Tab 1</a>
            </li>
            <li class="tab__item">
                <a href="#tab2">Tab 2</a>
            </li>
            <li class="tab__item">
                <a href="#tab3">Tab 3</a>
            </li>
            <li class="tab__item">
                <a href="#tab4">Tab 4</a>
            </li>
        </ul>

        <!-- 탭 내용 영역 -->
        <div class="tab__content-wrapper">
            <div id="tab1" class="tab__content active">첫번째 탭 내용</div>
            <div id="tab2" class="tab__content">두번째 탭 내용</div>
            <div id="tab3" class="tab__content">세번째 탭 내용</div>
            <div id="tab4" class="tab__content">네번째 탭 내용</div>
        </div>

    </body>
</html>

 

 

추가적으로 공부하며 이렇게 만듦.

로그인 버튼들과 단체여행 있는 부분을 나란히 두고 싶은데ㅠ 안된다..

작성 : 2024. 4. 26

 

어제 배웠던 BOM 에 속해있는 DOM 이라는 객체

DOM → 문서에 접근하는 객체이다

퐁규 :

BOM은 DOM(Document Object Model)의 일부입니다. BOM은 웹 브라우저의 창이나 프레임을 조작하는 데 사용되는 객체 모델이고, DOM은 HTML, XHTML 또는 XML 문서의 구조화된 표현을 제공합니다. DOM은 문서의 요소에 접근하고 조작하는 데 사용되는 반면, BOM은 브라우저 창과 같은 브라우저 창과 상호 작용하는 데 사용됩니다.

 

getElementById()

+ 스크립트가 코드 상단에 있을 때와 아래에 있을 때

상단)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        // getElementById() 태그의 아이디 속성값을 이용해 요소를 객체형식으로 읽어온다
        // querySelector()
        // getElementByClassName()
        // querySelectorAll

        let ptag = document.getElementById("p1");
        ptag.innerHTML = "반갑습니다." 
        // Uncaught TypeError: Cannot set properties of null (setting 'innerHTML') at dom.html:14:24 
        // ptag 부분이 에러가 뜬다 -> 값이 없는 상태 

    </script>
</head>
<body>
    <p id = "p1">안녕하세요</p>
</body>
</html>

 

아래)

<body>
    <p id = "p1">안녕하세요</p>

    <script>
        // getElementById() 태그의 아이디 속성값을 이용해 요소를 객체형식으로 읽어온다
        // querySelector()
        // getElementByClassName()
        // querySelectorAll

        let ptag = document.getElementById("p1");
        ptag.innerHTML = "반갑습니다." 
        // 스크립트를 아래로 내리면 오류가 생기지 않는다.

    </script>
</body>

 

메모리에 할당되는 시점에 따라 달라진다.

때문에 위와 같이 나타내거나 아래와 같이 나타내 오류를 해결한다.

<title>Document</title>
    <script>
        // getElementById() 태그의 아이디 속성값을 이용해 요소를 객체형식으로 읽어온다
        // querySelector()
        // getElementByClassName()
        // querySelectorAll

        // 바디부분이 실행될때까지 기다린 후 끝나면 이 함수를 실행해라 -> 콜백함수
        window.onload = function(){
            let ptag = document.getElementById("p1");
            ptag.innerHTML = "반갑습니다." 
        };
        
    </script>

</head>
<body>
    <p id = "p1">안녕하세요</p>
</body>
<script>
        // getElementById() 태그의 아이디 속성값을 이용해 요소를 객체형식으로 읽어온다
        // getElementByClassName()
        // querySelectorAll
        // querySelector()

        // 바디부분이 실행될때까지 기다린 후 끝나면 이 함수를 실행해라 -> 콜백함수
        window.onload = function(){
             let ptag1 = document.getElementById("p1");
             ptag1.innerHTML = "반갑습니다." 

             // 아이디값에 #를 준다.
             let ptag2 = document.querySelector("#p2");
             ptag2.innerHTML = "이순신"

            // 클래스 형태로 가지고 온다 
            let ptag3 = document.getElementsByClassName("p3")[0];
            ptag3.innerHTML = "배고프다"
            
            
            // let ptag3 = document.getElementsByClassName("p3");
            // ptag3[1].innerHTML = "배고프다"
            // 보통 이렇게 쓴다.
        };

    </script>

</head>

<body>

    <p id = "p1">안녕하세요</p>

    <p id = "p2">홍길동</p>

    <p class = "p3">안보인다</p>
    
</body>

let ptag3 = document.getElementsByClassName("p3")[0];

→ getElementById 와 getElementsByClassName 은 성질이 다름

 

id 값은 전체 클래스에서 유니크하게, 유일하게 사용한다. id 속성값은 디자인 요소보단 스크립트에서 객체화하기 위해 쓴다 (스크립트에서 제어하기 위해서) 그래서 속성의 값은 유니크해야한다. (약속)

class는 여러 태그에 동일한 이름을 만들어도 문제가 없다. 디자인을 위해 만든 태그이기 때문이다.

class 이름을 여러 개 동일하게 만들 수 있다는 걸 가정해 getElementsByClassName는 클래스들을 배열의 형태로 받는 것이다.

        let ptag3 = document.getElementsByClassName("p3");
        ptag3[1].innerHTML = "배고프다"

 

 

getElementsByClassName

<scirpt>
let htag = document.getElementsByClassName("myclass");
            // console.log(htag);

            // htag 를 이용해서 뭔가 하겠다
            // class 이름을 이용할 땐 배열 형식으로 써라
            // 자바스크립트에서 css를 동적으로 쓸 때 이런 기능을 이용
            setTimeout(()=> {
                htag[0].style.Color = "red";  // Object.style.속성 = 값 -> 요즘은 제이쿼리가 처리해준다
                // Object.style.fontSize -> 이런 식으로 - 를 빼고 대문자로 바꿔 써야한다.
            }, 3000);
            
            
</scirpt>
</head>
<body>

<h1 class = "myclass"> 고양이</h1>

</body>

 

 

querySelector / querySelectorAll

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload = function(){
            let sections = document.querySelectorAll("#sections .section");
            sections.forEach(section => {
                section.style.border = "1px solid #ff0000";
            });
        };
    </script>
</head>
<body>
    <div id="sections">

        <ol class="section">
            1
            <li>1-1</li>
            <li>1-2</li>
            <li>1-3</li>
        </ol>

        <ol class="section">
            2
            <li>2-1</li>
            <li>2-2</li>
            <li>2-3</li>
        </ol>
    </div>
</body>
</html>

 

form>table>tr7>td2>input[name] 이렇게만 쳐도 자동으로 표가 나온다

 

한번에 여러 항목에 체크/해제하기

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        function accpetAll() {
            // 전체선택하기
            let chAll = document.querySelector('#checkAll');

            if (chAll.checked){
                let checkboxs = document.querySelectorAll('.chk');

                // 향상된 for 문
                for (let checkbox of checkboxs) {
                    checkbox.checked = true;
                }
            } else {
                let checkboxs = document.querySelectorAll('.chk');

                // 향상된 for 문
                for (let checkbox of checkboxs) {
                    checkbox.checked = false;
                }
            }
        }

    </script>
</head>
<body>
    <table border="1">
        <tr>
            <td colspan="3">
                <input type="checkbox" id="checkAll" onclick="accpetAll()"> 전체동의
            </td>
        </tr>
        <tr>
            <td> <input type="checkbox" class="chk"> 필수동의1</td>
            <td> <input type="checkbox" class="chk"> 필수동의2</td>
            <td> <input type="checkbox" class="chk"> 필수동의3</td>
        </tr>
    </table>
</body>
</html>

 

 

회원가입 시 적어야 할 항목체크 프로그램 만들기

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        function memChk(frm) {
           // 회원가입 항목 눌렀을 때 하나라도 값이 없으면 알림창 떠서 회원가입 완료 가능하게 만들기

           let checkCnt = document.querySelectorAll('.chk:checked').length;
           // 최소 하나 이상 선택하면 되기 때문에 카운트가 1 이상이면 된다.

           let genderChkCnt = document.querySelectorAll('.genderChk:checked').length;


           // document.memfrm.id.value = "홍길동";
           // = frm.id.value 같은 표현

           if (frm.id.value === "") {
            alert("아이디를 입력하세요");
            frm.id.focus();  // 자동포커스
            return false; // 이 문제가 해결되지 않으면 아래 항목을 체크하는 의미가 없으므로 끝내기
           }

           if (frm.pw1.value === "") {
            alert("비밀번호를 입력하세요");
            frm.pw1.focus();  // 자동포커스
            return false; 
           }

           if (frm.pw2.value === "") {
            alert("비밀번호 확인을 입력하세요");
            frm.pw2.focus();  // 자동포커스
            return false; 
           }

           if(frm.pw1.value !== frm.pw2.value){
            alert("비밀번호가 일치하지 않습니다.");
            frm.pw2.focus();  // 자동포커스
            return false; 
           }

           if (frm.email.value === "") {
            alert("이메일을 입력하세요");
            frm.email.focus();  // 자동포커스, 입력폼일때만 의미가 있음
            return false; 
           }

           // frm.gender.value === ""
           // frm.gender.checked === false
           if(genderChkCnt === 0){
            alert("성별을 선택하세요");
            return false; 
           }

           if(frm.jop.value === ""){
            alert("직업을 선택하세요");
            return false; 
           }

            if(checkCnt === 0 ){
             alert("관심분야를 선택하세요");
             return false; 
            }

            if(frm.content.value === ""){
            alert("가입인사를 입력하세요.");
            return false; 
           }

        }
    </script>
</head>
<body>
    <!-- onsubmit 이 먼저 발생 -->
    <form action="http://www.naver.com" name="memfrm" onsubmit="return memChk(this)">
        <table>
            <tr>
                <td><label>아이디</label></td>
                <td><input type="text" name="id"></td>
            </tr>
            <tr>
                <td><label>비밀번호</label></td>
                <td><input type="password" name="pw1"></td>
            </tr>
            <tr>
                <td><label>비밀번호 확인</label></td>
                <td><input type="password" name="pw2"></td>
            </tr>
            <tr>
                <td><label>이메일</label></td>
                <td><input type="email" name="email"></td>
            </tr>
            <tr>
                <td><label>성별</label></td>
                <td>
                    <!-- checked 가 되어있으면 true -->
                    <input type="radio" name="gender" value="m" class="genderChk">남자 
                    <input type="radio" name="gender" value="f" class="genderChk">여자
                </td>
            </tr>
            <tr>
                <td><label>직업</label></td>
                <td>
                    <select name="jop">
                        <option value=""> -- 직업선택 -- </option>
                        <option value="job1"> 회사원 </option>
                        <option value="job2"> 자영업 </option>
                        <option value="etc"> 기타 </option>
                    </select>
                </td>
            </tr>
            <tr>
                <td><label>관심분야</label></td>
                <td>
                    <input type="checkbox" name="hobby" value="h1" class="chk"> 운동
                    <input type="checkbox" name="hobby" value="h2" class="chk"> 독서
                    <input type="checkbox" name="hobby" value="h3" class="chk"> 등산
                </td>
            </tr>
            <tr>
                <td><label>가입인사</label></td>
                <td>
                    <textarea row = '7' cols= '25' name="content"></textarea>
                </td>
            </tr>
            
        </table>
        <input type="submit" value="회원가입">
        <input type="reset" value="취소">
    </form>

   
</body>
</html>

 

 

 

자동차 옵션 선택 프로그램 만들기

 

일단 가격이 바뀌는 건 다 됨! → 근데 내가 어렵게 한거고 그냥 아이디나 클래스의 옵션만 바꿔서 다들 풀었더라..

그리고 색상 바꾸는건 안됐다.. 나만 정말 바보인듯

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>자동차 견적내기</title>
        <style type="text/css">
            * {
                margin: 0;
                padding: 0;
            }

            body {
                font: 12px/1.5 dotum,"돋움", gulim, "굴림", sans-serif;
            }

            li {
                list-style: none;
            }

            table {
                border-collapse: collapse;
                border-spacing: 0;
            }

            h1 {
                text-align: center;
            }

            #carZone {
                width: 600px;
                margin: 0 auto;
            }

            #estimate {
                width: 100%;
            }

            #estimate th,
            td {
                border: 1px solid #ccc;
                height: 30px;
            }

            #estimate th {
                background-color: #333;
                color: #fff;
            }

            #carZone td {
                text-align: center;
            }

            tfoot {
                font-size: 15px;
                font-weight: bold;
            }

            #total {
                border: none 0;
                background: none;
                font-size: 1.5em;
                font-weight: bold;
                text-align: center;
            }
        </style>

        <script>
            function car(){
                //let basic_car = parseInt(document.getElementById("total").defaultValue);
                let basic_car = Number(document.getElementById("total").defaultValue);
                let color_price = 0;

                let colorChkCnt = document.querySelectorAll('.opt4:checked').length;
                let colorChk = document.getElementById("opt4")
                if (colorChkCnt > 0) {
                    color_price += Number(colorChk.value);
                }

                for (let i = 1; i <= 3; i++){
                    let chkObj = document.getElementById("opt" + i)
                    if (chkObj.checked) {
                        basic_car += Number(chkObj.value)
                    }
                }

                basic_car += color_price;
                document.getElementById("total").value = basic_car;
            }

        </script>

    </head>
    <body>

        <h1>자동차 견적</h1>

        <div id="carZone">
            <p><img src="images/car.jpeg" alt="자동차"/></p>

            <table id="estimate">
                <colgroup>
                    <col width="380px"/>
                    <col width="160px"/>
                    <col width="160px"/>
                </colgroup>
                <thead>
                    <tr>
                        <th scope="row">옵 션</th>
                        <th scope="row">추가 가격</th>
                        <th scope="row">선택</th>
                    </tr>
                </thead>
                <tfoot>
                    <tr>
                        <th scope="col">(기본)차량가격</th>
                        <td colspan="2">
                            <input
                                type="text"
                                name="total"
                                id="total"
                                value="13450000"
                                readonly="readonly"/>
                        </td>
                    </tr>
                </tfoot>
                <tbody>
                    <tr>
                        <td>
                            <label for="opt1">인조가죽시트</label>
                        </td>
                        <td>250000</td>
                        <td>
                            <!-- 옵션 체크박스에 클릭할 때 마다 car()에 저장된 일련의 실행문을 실행합니다. -->
                            <input type="checkbox" name="opt1" id="opt1" value="250000" onclick="car();"/></td>
                    </tr>
                    <tr>
                        <td>
                            <label for="opt2">내비게이션</label>
                        </td>
                        <td>250000</td>
                        <td><input type="checkbox" name="opt2" id="opt2" value="250000" onclick="car();"/></td>
                    </tr>
                    <tr>
                        <td>
                            <label for="opt3">선루프</label>
                        </td>
                        <td>440000</td>
                        <td><input type="checkbox" name="opt3" id="opt3" value="440000" onclick="car();"/></td>
                        </tr>
                        <tr>
                            <td>
                                <label for="opt4">색상선택</label>
                            </td>
                            <td>100000</td>
                            <td> <input type="radio" name="opt4" id="opt4" value="100000" class="opt4" onclick="car();"/>red
                                <input type="radio" name="opt4" id="opt4" value="100000" class="opt4" onclick="car();"/>green
                                <input type="radio" name="opt4" id="opt4" value="100000" class="opt4" onclick="car();"/>blue
                            </td>
                        </tr>
                     </tbody> 
                    </table> 
                </div> 
            </body> 
            </html>

        // 객체
        // 유무형의 모든 사물
        // 내장객체, 사용자 정의 객체
        // 브라우져 객체(BOM)
        // 문서객체(DOM) -> 태그들( <p> , <div> 등 )
        
        
        
        result = arr1.slice(1,3); 의
        slice 는 데이터의 변화를 감지하는 것에 사용됨 
        프론트에서 아주 중요하게 쓰임!

 

  • 배열
        let arr1 = ["공덕", "등촌", "대곡"];
        let arr2 = ["신반포", "염창", "수서"];

        result = arr1.splice(2, 1);  // 데이터를 삭제하는 것 (시작인덱스, 몇개 삭제할지 갯수)
        console.log(result); //대곡 

        result = arr2.pop();  // 마지막 데이터를 읽어온다 (삭제)
        console.log(result); 
        console.log(arr2); // 마지막 값만 삭제하고 남김 

        result = arr2.shift();  // 맨 앞쪽 값을 읽어온다 (삭제)
        console.log(result);
        console.log(arr2);  // 맨 앞쪽 값만 남기고 나머지 삭제

        arr1.push(result);  // 배열의 맨 뒤쪽에 삽입
        console.log(arr1);

        arr1.unshift(result);  // 배열의 맨 앞쪽에 삽입
        console.log(arr1);

 

 

 

  • 문자열 객체
        // 문자열 객체
        // 인덱스 번호가 존재
        // chatAt(), indexof(), substring()
        // length

        // let str = "hong"; // 이렇게 써도 됨, 실제 이렇게 씀
        // let str = new String("hong"); // 자바스크립트에서 문자열을 쓰는 정석

        // 이름과 전화번호받고 전화번호 뒷자리 4개 암호화
        let userName = prompt("이름을 입력하세요 :", "");
        document.write(userName, "<br>"); 

        let userNum = prompt("휴대폰 번호를 입력하세요 (구분 없이 입력):", "01012345678");  
        // 0101234**** 과 같이 뒤 4자리 암호화 
        let result = userNum.substring(0, userNum.length - 4) + "****";
        document.write(result);

 

 

  • 메일의 유효성 검증하는 프로그램
        // 메일의 유효성 검증하는 프로그램 만들기
 
        let userEmail = prompt("이메일 주소 :", "");

        let arrUrl = [".co.kr", ".com", ".net", ".or.kr", ".go.kr"];
        // userEmail 에서 getElementById 로 @ 이전의 아이디를 가져오기  -> chk1
        // 그 다음 나머지 글자들에서 arrUlr 안에 있는 url이 있는지 보기 위해 for문을 돌리기  -> chk2

        let chk1 = false;  // @가 있는지 체크
        let chk2 = false;  // url 이 arrUlr 중 하나인지 체크

        // indexOf 를 사용
        // 아이디가 한 자 이상일 것이기 때문에 0 보다 커야한다.
        if (userEmail.indexOf('@') > 0) {
                chk1 = true;
        } 

        for (let i = 0; i < arrUrl.length; i++) {
            if (userEmail.indexOf(arrUrl[i]) > 0) {
                chk2 = true;
            }
        }

        if(chk1 && chk2) {
            document.write(userEmail);
        } else {
            alert("이메일 형식이 부적합 합니다")
        }

 

  • userEmail 에서 getElementById 로 @ 이전의 아이디를 가져오기

-> chk1

  • 그 다음 나머지 글자들에서 arrUlr 안에 있는 url이 있는지 보기 위해 for문을 돌리기

-> chk2

접근은 맞았지만 식으로 나타내는 걸 잘 못했다.

그래도 비슷하게 접근을 했다는 게 좀 발전이 된 것 같다.

접근이 정말 중요한 듯! 코드는 어떻게든 연습하면 된다.

 

 

브라우저 객체 BOM

<script>
        // 브라우저 객체 BOM
        // 자바는 자바버츄얼이 컴파일을 해줬지만 자바스크립트는 스스로 컴파일을 할 수 있다.
        // '표준화에 대한 수용'
        // 브라우저 기능을 활용하는 용도

        // alert(), prompt(), confirm(), open(), close()
        // window.alert("hello");  // window 생략 가능

        window.open("문서, url", "새 창 이름(생략가능)", "창의 옵션(창의 위치와 크기 = 정보전달의 목적)"); // 새 창 열기 
        // 부모창이 있어야 한다. 
        // 부모창 <-> 자식창 


        // 부모창과 자식창을 만들어 띄워보기
    </script>

 

window.open 를 이용해 부모창과 자식창을 만들어 띄워보기

// window.open("문서, url", "새 창 이름(생략가능)", "창의 옵션(창의 위치와 크기 = 정보전달의 목적)"); // 새 창 열기 
// 부모창이 있어야 한다. 
// window.close() -> self.close()
// 부모창 <-> 자식창

 

 

  • 부모창 만들기
<script>
    // 부모창
    // 실행할 때는 부모를 실행해야 한다.

    window.open("winpop.html", "pop1", "width = 350px, height = 420px, left = 300px, top = 50px");

</script>

 

  • 새로운 파일에서 작성된 자식창
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 자식창 -->
    <p>
        <img src = "./images/winpop.jpg" usemap="#intro"/>
        <map name = "intro" id = "intro">
          <area shape="rect" coords="230, 368, 280, 390" href="#" onclick="window.close()"/>
        </map>
    </p>
</body>
</html>

 

 

부모창과 자식창을 만들어 띄우고 서로 값을 주고 받을 수 있게 만들기

  • 부모창
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        function newWin() {
            window.open("winC.html", "", "width = 400, height = 300, top = 50, left = 50");
        }
    </script>
</head>
<body>
    <h1>Parent</h1>
    <p> 
        <input type= "text" id="ParentValue">
        <input type= "button" value="new window" onclick="newWin()">
    </p>
</body>
</html>

 

  • 자식창
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Child</h1>
    <p>
        <input type= "text" id="childValue">
        <input type= "button" value="send window" onclick="sendVal()">
    </p>
    <script>
        // value 속성 -> 태그에 있는 정보를 가지고 온다
        // childValue의 값을 가지고 올 수 있다
        // 부모의 값을 자식이 가지고 온다
        document.getElementById("childValue").value = window.opener.document.getElementById("ParentValue").value;  

        // 자식의 값을 부모에게 넘겨준다
        function sendVal() {
            window.opener.document.getElementById("ParentValue").value = document.getElementById("childValue").value;  
            window.close();
        }
    </script>
</body>
</html>

→ 부모창에서 자식창에게 값을 전달

 

→ 자식창에서 부모창에게 값 전달

 

 

+그밖의 객체들

// setInterval() : 일정 시간의 간격을 두고 무한 반복
// clearInterval() : 중단시키고 싶을 떄

// setTimeout() : 일정 시간 이후 한번만 실행
// clearTimeout() : 중단시키고 싶을 떄

// location 객체
// href 속성 : 특정 url로 이동
// reload() : 페이지 새로 고침

// history 객체
// back(), forword(), go(-3)점프하기

 

 

setInterval() : 일정 시간의 간격을 두고 무한 반복
clearInterval() : 중단시키고 싶을 떄

예제 ) 

<script>
        let addNum = 0;
        let subNum = 100;

        // setInterval(함수, 시간간격) 시간간격을 기준으로 함수가 작동

        let auto1 = setInterval(function(){
            addNum++;
            console.log("addNum : " + addNum);
        }, 3000);

        let auto2 = setInterval(function(){
            subNum--;
            console.log("subNum : " + subNum);
        }, 3000)

    </script>
</head>
<body>
    <button onclick="clearInterval(auto1)">증가 정지</button>
    <button onclick="clearInterval(auto2)">감소 정지</button>
</body>

 

 

 location 객체
 href 속성 : 특정 url로 이동
 reload() : 페이지 새로 고침

예제 )

<script>
        // let url = prompt("사이트주소 입력 ", "");
        // location.href = url;

        //  //함수로 묶으면 호출하기 전까지 실행되지 않는다
        // function site() {
        //     location.href = "http://www.google.com";
        // }
        
        let auto = setInterval(function(){
            location.reload();
        }, 1000);   // 페이지 새로 고침 1초에 한번씩 발생

    </script>
</head>
<body>
    location 객체 테스트
    <!-- 스크립트를 헤더에 넣느냐, 바디에 넣느냐에 따라 실행 시간의 차이 -->

    <!-- <button onclick="site()">사이트 이동</button> -->
</body>

 

 history 객체
 back(), forword(), go(-3)점프하기
 
 예제 ) 
 
 <script>
        function backs(){  // back은 새로고침
            history.back();
        }

        function forwords(){  // forwords는 새로 고침 X
            history.forward();
        }
        
    </script>
</head>
<body>
    <button onclick="backs()">이전 가기</button>
    <button onclick="forwords()">다음 가기</button>
</body>

 

배운 게 너무 많으면 자주 쓰이는 기능이라도 검색해서 연습해봐라

자바스크립트 자주 쓰이는 Array 기능

 

[JavaScript] 자주 쓰는 10가지 Array 함수 정리

JavaScript 자주 쓰는 Array 함수 10가지 정리

velog.io

 

 

함수 작성 방식

        // 함수 생성(작성) 방식
        // 1. 명명 함수
        // 2. 익명 함수
        // 3. 변수를 사용한 명명 함수
        // 4. 즉시 실행 함수
        // 5. 화살표 함수


        // 1번 형식으로 만든 함수들
        function add() {
            document.write(2 + 3 + "<br>");
        }

        add();

        function add2(x, y) {
            document.write(x + y + "<br>");
        }

        add2(3, 4);

        function add3(x, y) {
            let sum = x + y;
            return sum; 
        }

        document.write(add3(10, 20));   // 이 자체가 sum 이 된다

        function add4(x) {
            if (x === 10){
                return;  // 매서드의 종료 : return
            }
            document.write(x);
        }
				// 2. 익명함수 형식 = 콜백함수
        // setInter 에서 써봤다!

        // 변수명을 가지고 이름으로 사용한다
        let anadd = function(){
            document.write("hello" + "<br>");
        }

        anadd();

        // 4. 즉시 실행 함수
         (function(){
             document.write("즉시실행함수" + "<br>");  // 호출 없이 즉시 실행
         })()

        (function(x, y){
            document.write(x + "," + y + "<br>");
            document.write("즉시실행함수" + "<br>"); 
        })(10, 20)


        // 5. 화살표 함수
        //() => document.write("화살표 함수");  // 이 자체로는 활용할 방법이 없음

        let arrow = () => document.write("화살표 함수"); // 이름을 받아 사용
        arrow();

 

 

 

함수의 스코프

        스코프(Scope)
        // 함수의 호출 특징
        // 호이스팅 -> 함수를 만드는 위치 (선언위치와 호출위치의 관계)
        // 호이스팅 뜻은 낚시바늘 , 함수의 선언 , 코드의 실행 위에서 부터 아래 , 함수가 만들어져 있어야 함
        // 함수의 선언위치 밑에 호출 함수가 와야하는데 호출이 먼저 발생했다 -> ?
        // 그럼 함수가 없는 상태에서 실행되는 것 -> 오류가 발생함
        // 그 오류를 방지하기 위해 낚시바늘로 선언 함수를 가지고 오는 것 -> 함수의 호이스팅이라고 함

        // 함수의 호이스팅 가능
        
         add2();

          function add2(x, y) {
              document.write(x + y + "<br>");   
              // nan -> x, y를 선언하지 않았기 때문에 nan이 나옴
          }


        // 익명함수의 호이스팅 불가능
        
         anadd();

         let anadd = function(){
             document.write("hello");
         }
         
         
 ----------------------------------------------------------------------------

        // 변수 스코프
        // 1. var : 함수 레벨 스코프

         function func() {
             if (true) {
                 var a = 5; 
                 console.log(a)
              }
             console.log(a)
         }

         func();
         console.log(a)  // 에러 : a is not defined at function.html:112:21


        // 2. let, const : 블록레벨스코프
        
        function func() {
            if (true) {
                let a = 5;  // 특정블록에서만 유효한 지역변수
                console.log(a)
             }
            console.log(a)  // 에러 a라는 변수가 없다
        }

        func();
        
        
        
        
        변수의 호이스팅
        // var 타입은 호이스팅이 가능 -> 빚을 지는 거라고 생각하면 됨
        // -> 불안정, 호이스팅을 많이 하는 것이 좋은 것이 아님

        console.log(a)
        var a = 5;  // 미리 할당이 되어있지만 값이 없는 것 undefined

        // let, const 타입은 호이스팅이 불가능

        console.log(b)
        let b = 5;  // 만든 후에 사용하는 것이 안정정

함수를 알면 사용자 정의 객체를 만들 수 있다.

 

 

사용자 정의 객체

 사용자 정의 객체 만드는 방법

            // 1번째 방식, 함수형 객체 -> 생성해서 사용한다
             function CheckWeight(name, height, weight) {
                 this.userName = name;
                 this.userHeight = height;
                 this.userWeight = weight;

                 this.getInfo = function(){
                     let str = "";
                     str += "이름 : " + this.userName + ",";
                     str += "키 : " + this.userHeight + ",";
                     str += "몸무게 : " + this.userWeight + ",";

                     return str;
                 }
             }

             let kim = new CheckWeight("장보리", 160 , 62);
             console.log(kim);
             console.log(kim.userName);  // 함수에서 정보를 가지고 오는 방법
             console.log(kim.getInfo());


-------------------------------------------------------------------------
           
           
            // 2번째 방식 -> let obj = {}
            // 생성없이 사용한다
            // 참조타입
            let obj = {    // let obj = [] 배열
                cat: "meow", 
                dog: "woof",

                animal: function() {
                    return "현재 동물은" + this.dog + "와" + this.cat + "가 있습니다.";
                }
            }
            console.log(obj.cat);
            console.log(obj.animal());

오늘도 자바스크립트

 

  • 조건식
        let x = 10;
        let y = 20;

        조건식에
        0, null, ""(빈문자), undefined 등 값이 들어갈 수도 있다. -> false
        제외한 나머지 값들 -> true 
        자바와 다른 점은 값 자체를 쓸 수 있다는 것!

        if ( x === y ){
            document.write ("같다");
        } else {
            document.write ("다르다");
        }

        let money = 1000;

        if (money){
            document.write("true");
        } else {
            document.write("false");
        }

 

        confirm() 함수 -> 사용자에게 한 번 더 실행여부를 물어보는 역할
        confirm() -> 확인을 누르면 true
        confirm() -> 취소를 누르면 false

        let result = confirm("정말 탈퇴하시겠습니까?");

        if (result) {
            document.write("회원 탈퇴 완료");
        } else {
            document.write("회원 탈퇴 취소");
        }

 

        // else if 문

        if (){

        } else if {

        } else if {

        } else {

        }

        // 충첩반복문

        if (){
            if (){

            } else {

            }
        }


        반복문을 쓰지 않고 아이디, 패스워드가 같은지 확인하는 프로그램 만들기

        let id = "kang"
        let pw = "1234"

        let userId = prompt("아이디 입력", "");
        let userPw = prompt("비밀번호 입력", "");

        if (id === userId){
            if (pw === userPw){
                document.write(userId + "님 환영합니다!");
            }else {
                alert("비밀번호 불일치")
                location.reload();  // 페이지 새로 고침 기능
            }
        } else {
            alert("아이디 불일치")
            location.reload();  // 페이지 새로 고침 기능
        }

 

 

  • switch 조건문
switch 조건문

        switch(){
            case 값1 : 실행코드;
            break;
            case 값2 : 실행코드;
            break;
            case 값3 : 실행코드;
            break;
            default : 실행코드;
        }

        // switch 조건문을 이용해서 원하는 사이트에 들어가게 만들기

        let site = prompt("네이버, 다음, 구글 중에 입력하세요", "");
        let url;

        switch(site){
            case "네이버": url = "www.naver.com";
            break;
            case "다음": url = "www.daum.net";
            break;
            case "구글": url = "www.google.co.kr";
            break;
            default : alert("사이트를 잘못 입력했습니다.");
        }

        if (url){
            location.href = "http://" + url;
        }

 

 

  • 순서도에 대한 이해

참조)

https://www.tcpschool.com/codingmath/flowchart

순서도를 먼저 그린 후 코드로 옮기는 작업을 많이 해야 합니다.

그런 의미에서 i 가 10번 도는 순서도 그려보기!

 

위 순서도를 코드로 나타내보기

        //반복문
        //for, while, do-while 

        //for(초기값; 조건문; 증감식) {
        //    실행문;
        //}

        var i = 0;

        for (i = 0; i < 10; i++) {
            document.write(i + "<br>");
        } 


	// 반복문을 이용해 1부터 10까지 더하기
				
	var sum = 0;

	for (i = 0; i < 10; i++) {
	sum += i;
	}

	document.write(sum);

 

1부터 10까지 더하기 순서도 :

        // 초기값
        // while(조건식){
        //     실행문
        //     증감식
        // }

        // 1 ~ 30, 2와 6의 공배수 구하기

        let i = 1;
        while(i <= 30){
            if (i % 2 === 0 && i % 6 === 0){
                document.write(i + " ");
            }

            i++;
        }

        // 6 12 18 24 30 가 나온다

 

 

순서도 :

 

 

 

표를 만들어 그 안에 구구단 넣기

 

  • 자바스크립트로 표 만들기
        // 중첩반복문

         for () {
             for () {

             }
        }

        // for 문을 이용해 테이블 만들기
        // 행과 열을 표현하기 위해 중첩 반복문을 쓴다

        // 게시판의 리스트를 구성하는 일반적인 방식
         let str;
         str = "<table border = '1'>";

         for (let i = 1; i <= 3; i++){
             str += "<tr>";
             for (let j = 1; j <= 2; j++){
                 str += "<td>"+ i + "행" + j + "열" +"</td>";
             }
             str += "</td>";
         }

         str += "</table>";

         document.write(str);

 

 

  • 구구단을 표에 넣기
            document.write("<table border = '1'>");
            document.write("<tr>");
            for (let i = 2; i <= 9; i++) {
            document.write("<th>"+ "<h3>" + i + "단</h3>" + "</th>"); 
            }

            document.write("</tr>");
            document.write("<tr>");
            for (let i = 1; i <= 9; i++){
                for (let j = 2; j <= 9; j++){
                    document.write("<td>" + i + " * " + j + " = " + i * j + "</td>");
                }
                document.write("</tr>");
            }
            document.write("</table>");

 

<script>

        let str;
        str = "<table border='1'>"

        for(let i =1 ; i<=9; i++){
            str +="<tr>" 
            for(let j = 2 ; j<=9 ; j++){
                if(i==1){
                    str+="<td>"+"<h3>"+j+"단"+"</h3>"+"</td>"
                }
                else{
                    str+="<td>"+j+"*"+i+"="+j*i+"</td>"
                }
            }
            str += "</tr>"
        }
        str += "</ table>"

        document.write(str);


    </script>

이렇게 간단하게 작성할 수도 있었음..

코드를 짤 때 생각하고 짜기

순서도, 논리를 만들기

 

 

자바스크립트의 객체

        // 객체
        // 유무형의 모든 사물
        // 내장객체, 사용자 정의 객체
        // 브라우져 객체(BOM)
        // 문서객체(DOM)

        // 속성과 기능이 무조건 들어있음
        // 참조변수, 속성
        // 참조변수, 기능

 

        // 내장객체 Date로 날짜 알아보기
        
        let today = new Date();
        document.write(today);
        document.write("<br>");

        document.write(today.getFullYear());
        document.write("<br>");

        document.write(today.getMonth()+1); // 0 ~ 11 까지 나타냄
        document.write("<br>");

        document.write(today.getDate());
        document.write("<br>");

        document.write(today.getDay());  // 3-화 4-수 5-목 6-금 0-토 1-일 2-월  0 ~ 6


        let date1 = new Date(2024,2,24);
        let date2 = new Date();

        // 1970년부터 얼마나 시간이 흘렀는지 알려주는 getTime()
        let diff = date2.getTime() - date1.getTime();
        document.write(Math.ceil(diff / (60 * 1000 * 60 * 24)) + "일 차이가 있다."); // millisecond 로 나옴, 천분의 일초
        Math.ceil 소수점 버리고 강제 올림

 

        // Math 객체

        // document.write(Math.random());  // 0.0 <= r < 1
        
        // 1 ~ 7 사이의 난수
        // 예를 들어 37.8 이 있다
        // round() : 반올림
        // ceil() : 강제 올림
        // floor() : 강제 내림

        document.write("round() : " + Math.round(37.8)); //38
        document.write("ceil() : " + Math.ceil(37.8)); //38
        document.write("floor() : " + Math.floor(37.8)); //37

        // 1부터 7까지 랜덤으로 숫자 뽑기
        let randomNum = Math.random() * 7
        let randomNumFloor = Math.floor(randomNum + 1)
        document.write(randomNumFloor);
       
        // 위와 같은 코드
        let r = Math.floor((Math.random() * 7 )) + 1;
        document.write(r)

 

        // 랜덤으로 이미지 돌리기
        let r = Math.floor((Math.random() * 7 )) + 1;
        document.write(r)

        if (r === 1) {
            document.write("<img src='images/1.jpg' width = '100' height ='100'>");
        } else if (r === 2) {
            document.write("<img src='images/2.jpg' width = '100' height ='100'>");
        } else if (r === 3) {
            document.write("<img src='images/3.jpg' width = '100' height ='100'>");
        } else if (r === 4) {
            document.write("<img src='images/4.jpg' width = '100' height ='100'>");
        } else if (r === 5) {
            document.write("<img src='images/5.jpg' width = '100' height ='100'>");
        } else if (r === 6) {
            document.write("<img src='images/6.jpg' width = '100' height ='100'>");
        } else if (r === 7) {
            document.write("<img src='images/7.jpg' width = '100' height ='100'>");
        }

 

 

자바스크립트의 배열

       let arr = new Array();
        arr[0] = 10;  // 값이 들어오는 갯수가 배열의 크기
        arr[1] = 20;
        arr[2] = 30;
        arr[3] = 40;
        arr[5] = 50;

        document.write(arr[1]);
        document.write("<br>");

        arr[3] = 400;
        document.write(arr[3]);

        let arr = new Array("a", 1, true);
        document.write(arr[2]);

        let arr = []; // 값이 없는 배열
        let arr = [1, 2, 3, 4, 5]; // 생성
        // document.write(arr[0]);

        for (let i = 0; i < arr.length; i++) {
            document.write(arr[i], "<br>");
        }

 

  • concat, slice 와 같이 자바스크립트에서 쓸 수 있는 것들
        let arr1 = ["사당", "등촌", "풍산", "홍대입구", "방배"];
        let arr2 = ["용산", "압구정", "효창공원"];

        let result;
        result = arr1.concat(arr2);  // concat 배열합치기
        console.log(result);
        document.write(result);

        result = arr1.slice(1,3); // slice 배열을 새로 생성한다. 1번 인덱스부터 2번 인덱스까지 복사해서 만들어준다.
        console.log(result);

 

 

 

자습시간에 공부하다 알게된 것 :

증감연산자를 이제 이해하게 됨;;;;

첫번째 식에서 i는 3,

두번째 식에서 i값을 3으로 하고 3 + 3, j 의 값을 계산. i 뒤에 증감연산자가 붙으므로

i 에게만 +1을 해줌 그럼 i = 4 , j = 6 이 됨.

세번째 식에서는 4가 된 i 앞에 증감연산가가 붙었으므로 먼저 i 에 1을 더해준다.

i + 1 = 5 , i = 5가 되고 k 를 구하기 위해 5가 된 i + 5 를 하면 k 는 10!

그럼 답은 콘솔창과 같이 i = 5, j = 6, k = 10 이 나온다.

이번 시간을 끝으로 CSS, HTML은 마무리. 자바스크립트를 배우며 또 할 예정.

  • 그리드에 대해 배웁니다.

플렉스는 가로 세로 중에 하나를 놓고 배치함. → 1차원

그리드는 가로와 세로를 모두 사용함. → 2차원

 

그리드 레이아웃

  • display : grid
  • grid-template-columns: 200px 200px 200px (각 컬럼의 크기)
  • 값의 형식

 

-1fr 1fr 1fr

-200px 200px 200px

-refeat(3, 1fr)

-repeat(auto-fit, minmax(200px, 1fr))

-repeat(auto-fill, minmax(200px, 1fr))

  • grid-template-row: 100px
  • grid-gap : 컬럼간격 줄간격
  • grid-column : 1/4 (컬럼기준으로 번호를 부여한 것)
  • grid-column-strat : 1; 컬럼기준 시작하는 줄을 정해준다
  • grid-row : 2/4 (줄 번호 기준으로 번호를 부여한 것)
  • grid-row-strat : 3; 줄 번호 기준 시작하는 줄을 정해준다
  • grid-template-area → 구조를 어떻게 만들것인지를 정해두고 쓰는 속성

 

플렉스 레이아웃 그리드 레이아웃
display : flex
flex-direction : row(주축) , column(교차축)
flex-wrap : wrap , nowrap
flex-flow : row wrap
justify-content : .... 주축에대한정렬
align-items : ..... 교차축에 대한 정렬
align-self: ..... 특정 요소에 대한 처리
align-content :... 여러줄의 교차축 정렬
display : grid
grid-template-columns: 200px 200px 200px (각 컬럼의 크기)
grid-template-row: 100px grid-gap : 컬럼간격 줄간격

 

 

  • display : grid
  • grid-template-columns: 200px 200px 200px (각 컬럼의 크기)
  • grid-template-row: 100px

 

구현화면 :

<style>
            #wrapper {
                display: grid;
                /* 균등하게 한 칸씩 구성 - 상대크기, 배수의 개념으로 조절 가능 */
                /* 상대값 : 1fr 1fr 1fr / 절대값 : 200px 200px 200px  */
                /* repeat(3, 1fr) = 1fr을 3번 써라 */
                grid-template-columns: repeat(3, 1fr); 
                /* 절대값 : 100px */
                /* 상대값 : minmax(100px, auto) 높이에 따라 자동으로 늘이고 줄이고 */
                grid-template-rows: minmax(100px, auto);
            }

            .items {
                padding: 10px;
                background-color: #eee;
            }

            /* 구조 선택자 */
            .items:nth-child(odd) {
                background-color: #e0ecb6;
            }

        </style>

 

 

  • grid-template-columns: repeat(auto-fit, minmax(200px, 1fr))
  • grid-template-columns: repeat(auto-fill, minmax(200px, 1fr))
  • grid-gap : 컬럼간격 줄간격

 

구현화면 :

<style>
            #wrapper1 {
                display: grid;
                grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
                margin-bottom: 20px;
            }

            #wrapper2 {
                display: grid;
                grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
                grid-gap: 20px 30px;
            }

            .items {
                padding: 15px;
                background-color: #eee;
            }

            .items:nth-child(odd) {
                background-color: #e0ecb6;
            }
        </style>

 

 

grid로 레이아웃 구성하기

  • grid-column : 1/4 (컬럼기준으로 번호를 부여한 것)
  • grid-column-strat : 1; 컬럼기준 시작하는 줄을 정해준다
  • grid-row : 2/4 (줄 번호 기준으로 번호를 부여한 것)
  • grid-row-strat : 3; 줄 번호 기준 시작하는 줄을 정해준다

<style>
        #wrapper {
            width: 700px;
            display: grid;
            grid-template-columns: repeat(3, 1fr);
            grid-template-rows: repeat(3, 100px);
        }

        .box {
            padding: 15px;
            color: #fff;
            font-weight: bold;
            text-align: center;
        }

        .box1 {
            background-color: rgb(173, 207, 161);
            grid-column : 1/4
        }

        .box2 {
            grid-column-start: 1;
            background-color: rgb(255, 240, 79);
            grid-row : 2/4 /* 컬럼의 번호 2~4까지 채워라 */
        }

        .box3 {
            grid-row-start: 2;
            background-color: rgb(243, 157, 117);
            grid-column : 2/4
        }

        .box4 {
            background-color: rgb(153, 218, 248);
            grid-row-start: 3;
            grid-column-start: 3;
        }


    </style>
</head>
<body>
    <div id="wrapper">
        <div class="box box1">box1</div>
        <div class="box box2">box2</div>
        <div class="box box3">box3</div>
        <div class="box box4">box4</div>
      </div>
</body>

 

 

 

 

  • grid-template-area → 구조를 어떻게 만들것인지를 정해두고 쓰는 속성

사용방법 :

       grid-template-areas:
       "box1 box1 box1"
       "box2 box3 box3"
       "box2 . box4"

위와 같이 행과 열을 맞춰 그대로 적어주면 알아서 만들어준다.

정말 편리해보이지만 레이아웃이 고정된 형식이 아니면 유연성은 떨어진다.

 

 

 

<style>
        /* 그리드로 쉽게 레이아웃 구성 */
        #wrapper {
           width: 700px;
           display: grid;
           grid-template-columns: repeat(3,1f);
           grid-template-rows: repeat(3,100px);
           grid-template-areas:
           "box1 box1 box1"
           "box2 box3 box3"
           "box2 . box4"
            /* 아무것도 표시하고 싶지 않는 영역은 . 으로 표현 */
             /* 고정된 형식이라면 편하지만 유연성은 떨어짐 */
        }

        .box {
            padding: 15px;
            color: #fff;
            font-weight: bold;
            text-align: center;
        }

        .box1 {
            background-color: rgb(173, 207, 161);
            grid-column : 1/4
        }

        .box2 {
            grid-column-start: 1;
            background-color: rgb(255, 240, 79);
            grid-row : 2/4 /* 컬럼의 번호 2~4까지 채워라 */
        }

        .box3 {
            grid-row-start: 2;
            background-color: rgb(243, 157, 117);
            grid-column : 2/4
        }

        .box4 {
            background-color: rgb(153, 218, 248);
            grid-row-start: 3;
            grid-column-start: 3;
        }

    </style>
</head>
<body>
    <div id="wrapper">
        <div class="box box1">box1</div>
        <div class="box box2">box2</div>
        <div class="box box3">box3</div>
        <div class="box box4">box4</div>
      </div>
</body>

 

 

 

에어비엔비 사이트 클론 코딩

 

구현화면 :

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <link rel="stylesheet" href="css/style.css">
        <link
            rel="shortcut icon"
            sizes="76x76"
            type="image/x-icon"
            href="https://a0.muscache.com/airbnb/static/logotype_favicon-21cc8e6c6a2cca43f061d2dcabdf6e58.ico">
    </head>

    <body>

        <header>
            <nav>
                <div class="logo">
                    <svg
                        viewbox="0 0 1000 1000"
                        role="presentation"
                        aria-hidden="true"
                        focusable="false"
                        style="height: 1em; width: 1em; display: inline-block; fill: currentcolor;">
                        <path
                            d="m499.3 736.7c-51-64-81-120.1-91-168.1-10-39-6-70 11-93 18-27 45-40 80-40s62 13 80 40c17 23 21 54 11 93-11 49-41 105-91 168.1zm362.2 43c-7 47-39 86-83 105-85 37-169.1-22-241.1-102 119.1-149.1 141.1-265.1 90-340.2-30-43-73-64-128.1-64-111 0-172.1 94-148.1 203.1 14 59 51 126.1 110 201.1-37 41-72 70-103 88-24 13-47 21-69 23-101 15-180.1-83-144.1-184.1 5-13 15-37 32-74l1-2c55-120.1 122.1-256.1 199.1-407.2l2-5 22-42c17-31 24-45 51-62 13-8 29-12 47-12 36 0 64 21 76 38 6 9 13 21 22 36l21 41 3 6c77 151.1 144.1 287.1 199.1 407.2l1 1 20 46 12 29c9.2 23.1 11.2 46.1 8.2 70.1zm46-90.1c-7-22-19-48-34-79v-1c-71-151.1-137.1-287.1-200.1-409.2l-4-6c-45-92-77-147.1-170.1-147.1-92 0-131.1 64-171.1 147.1l-3 6c-63 122.1-129.1 258.1-200.1 409.2v2l-21 46c-8 19-12 29-13 32-51 140.1 54 263.1 181.1 263.1 1 0 5 0 10-1h14c66-8 134.1-50 203.1-125.1 69 75 137.1 117.1 203.1 125.1h14c5 1 9 1 10 1 127.1.1 232.1-123 181.1-263.1z"></path>
                    </svg>
                </div>
                <div class="menu">
                    <ul>
                        <li>
                            <a href="#">호스트가 되어보세요</a>
                        </li>
                        <li>
                            <a href="#">도움말</a>
                        </li>
                        <li>
                            <a href="#">회원가입</a>
                        </li>
                        <li>
                            <a href="#">로그인</a>
                        </li>
                    </ul>
                </div>
            </nav>
            <section>
                <div class="search__box">
                    <div class="search__title">특색 있는 숙소와 즐길<br/>
                        거리를 예약하세요.</div>
                    <table>
                        <tr>
                            <td colspan="2" class="search__sub__title">목적지</td>
                        </tr>
                        <tr>
                            <td colspan="2"><input class="search__input" type="text" placeholder=" 모든 위치"></td>
                        </tr>
                        <tr>
                            <td class="search__sub__title">체크인</td>
                            <td class="search__sub__title">체크아웃</td>
                        </tr>
                        <tr>
                            <td><input class="search__input" type="date"/></td>
                            <td><input class="search__input" type="date"/></td>
                        </tr>
                        <tr>
                            <td colspan="2" class="search__sub__title">인원</td>
                        </tr>
                        <tr>
                            <td colspan="2">
                                <select class="search__input">
                                    <option>인원</option>
                                </select>
                            </td>
                        </tr>
                    </table>
                    <div class="search__button">
                        <button>검색</button>
                    </div>
                </div>
            </section>
        </header>

        <main>
            <section>
                <div class="sec__title">
                    에어비앤비 둘러보기
                </div>
                <div class="card__box">
                    <div class="card">
                        <div class="card__img1 card__img"></div>
                        <div class="card__content">숙소 및 부티크 호텔</div>
                    </div>
                    <div class="card">
                        <div class="card__img2 card__img"></div>
                        <div class="card__content">트립</div>
                    </div>
                    <div class="card">
                        <div class="card__img3 card__img"></div>
                        <div class="card__content">어드벤처</div>
                    </div>
                    <div class="card">
                        <div class="card__img4 card__img"></div>
                        <div class="card__content">레스토랑</div>
                    </div>
                </div>
            </section>

            <section>
                <div class="ad1"></div>
            </section>

            <section>
                <div class="sec__title">추천 여행지</div>
                <div class="choo__box">
                    <div class="choo_img1"></div>
                    <div class="choo_img2"></div>
                    <div class="choo_img3"></div>
                    <div class="choo_img4"></div>
                    <div class="choo_img5"></div>
                </div>
            </section>

            <section>
                <div class="sec__title2">에어비앤비 플러스를 만나보세요!</div>
                <div class="sec__content">퀄리티와 인테리어 디자인이 검증된 숙소 셀렉션</div>
                <div class="ad2"></div>
            </section>

            <section>
                <div class="sec__title">전 세계 숙소</div>

                <div class="home__box">
                    <div class="home">
                        <div class="home__img1"></div>
                        <div class="home__info">
                            <div class="info1">오두막 · BALIAN BEACH, BALI</div>
                            <div class="info2">BALIAN TREEHOUSE w beautiful pool</div>
                            <div class="info3">
                                <span class="star">★★★★★</span>
                                <span class="count">185</span>
                                <span class="type">슈퍼호스트</span>
                            </div>
                        </div>
                    </div>

                    <div class="home">
                        <div class="home__img2"></div>
                        <div class="home__info">
                            <div class="info1">키클라데스 주택 · 이아(OIA)</div>
                            <div class="info2">Unique Architecture Cave House</div>
                            <div class="info3">
                                <span class="star">★★★★★</span>
                                <span class="count">188</span>
                                <span class="type">슈퍼호스트</span>
                            </div>
                        </div>
                    </div>

                    <div class="home">
                        <div class="home__img3"></div>
                        <div class="home__info">
                            <div class="info1">성 · 트웬티나인 팜스(TWENTYNINE PALMS)</div>
                            <div class="info2">Tile House</div>
                            <div class="info3">
                                <span class="star">★★★★★</span>
                                <span class="count">367</span>
                                <span class="type">슈퍼호스트</span>
                            </div>
                        </div>
                    </div>

                    <div class="home">
                        <div class="home__img4"></div>
                        <div class="home__info">
                            <div class="info1">검증됨 · 케이프타운</div>
                            <div class="info2">Modern, Chic Penthouse with Mountain, City & Sea Views</div>
                            <div class="info3">
                                <span class="star">★★★★★</span>
                                <span class="count">177</span>
                                <span class="type">슈퍼호스트</span>
                            </div>
                        </div>
                    </div>

                    <div class="home">
                        <div class="home__img5"></div>
                        <div class="home__info">
                            <div class="info1">아파트 전체 · 마드리드(MADRID)</div>
                            <div class="info2">솔광장에 위치한 개인 스튜디오</div>
                            <div class="info3">
                                <span class="star">★★★★★</span>
                                <span class="count">459</span>
                                <span class="type">슈퍼호스트</span>
                            </div>
                        </div>
                    </div>

                    <div class="home">
                        <div class="home__img6"></div>
                        <div class="home__info">
                            <div class="info1">집 전체 · HUMAC</div>
                            <div class="info2">Vacation house in etno-eco village Humac</div>
                            <div class="info3">
                                <span class="star">★★★★★</span>
                                <span class="count">119</span>
                                <span class="type">슈퍼호스트</span>
                            </div>
                        </div>
                    </div>

                    <div class="home">
                        <div class="home__img7"></div>
                        <div class="home__info">
                            <div class="info1">개인실 · 마라케시</div>
                            <div class="info2">The Cozy Palace</div>
                            <div class="info3">
                                <span class="star">★★★★★</span>
                                <span class="count">559</span>
                                <span class="type">슈퍼호스트</span>
                            </div>
                        </div>
                    </div>

                    <div class="home">
                        <div class="home__img8"></div>
                        <div class="home__info">
                            <div class="info1">게스트용 별채 전체 · 로스앤젤레스</div>
                            <div class="info2">Private Pool House with Amazing Views!</div>
                            <div class="info3">
                                <span class="star">★★★★★</span>
                                <span class="count">170</span>
                                <span class="type">슈퍼호스트</span>
                            </div>
                        </div>
                    </div>
                </div>
            </section>
        </main>
    </body>
    <footer>
        <div class="footer__box">
            <div class="callcenter">
                <ul>
                    <li>made by yuna</li>
                    <li class="p">개인정보 | 이용약관 | 사이트맵 | 환불정책</li>
                </ul>
            </div>
        </div>
    </footer>
</html>
* {
    padding: 0;
    margin: 0;
    box-sizing: border-box;
}

header {
    background-image: url("../images/background.jpg");
    height: 880px;
    background-size: 100% 100%;
}

nav {
    display: grid;
    grid-template-columns: auto auto; /* 같은 비율로 균등분할 */
    justify-content: space-between;
    padding: 20px;
}

.logo {
    color: white;
    font-size: 40px;
    font-weight: bold;
}

.menu ul {
    display: grid;
    grid-template-columns: auto auto auto auto; /* 인라인으로 바뀜 */
    list-style-type: none ;
    grid-gap: 30px;
}

.menu ul a {
    text-decoration: none;
    color: white;
    font-weight: bold;
}

.search__box {
    width: 430px;
    display: inline-block;
    padding: 20px 30px;
    background-color: white;
    position: relative;
    top: 10px;
    left: 50px;
    border-radius: 10px;
    box-shadow: 0 2px 2px 0 rgb(214, 214, 214);
}

table {
    width: 100%;
}

.search__title {
    padding: 10px 0;
    font-size: 30px;
    font-weight: bold;
    color: rgb(75, 74, 74);
}

.search__sub__title {
    padding: 10px 0;
    font-size: 12px;
    font-weight: bold;
}

.search__input {
    height: 45px;
    width: 100%;
    color: rgb(75, 74, 74);
    font-size: 15px;
    border: 1px solid #dddd;
}

.search__button {
    display: grid;
    justify-content: end;  /* 오른쪽 끝 정렬 */
    padding: 20px 0;
}

.search__button button {
    background-color: rgb(255, 71, 108);
    border: 0;
    color: white;
    font-weight: bold;
    height: 45px;
    width: 70px;
    font-size: 15px;
    cursor: pointer;  /* 마우스 가져다대면 손가락 모양으로 바뀜 */
    border-radius: 6px;
}

main {
    margin: 30px 80px;
}

.sec__title {
    font-size: 25px;
    font-weight: bold;
    color: rgb(75, 74, 74);
    margin: 0 0 20px 0;
}

.sec__title2 {
    font-size: 25px;
    font-weight: bold;
    color: rgb(75, 74, 74);
    margin: 5px 0;
}

.card__img1 {
    background-image: url(../images/card1.jpg);
    height: 70px;
    background-size: 100% 100%;
}

.card__img2 {
    background-image: url(../images/card2.jpg);
    height: 70px;
    background-size: 100% 100%;
}

.card__img3 {
    background-image: url(../images/card3.jpg);
    height: 70px;
    background-size: 100% 100%;
}

.card__img4 {
    background-image: url(../images/card4.jpg);
    height: 70px;
    background-size: 100% 100%;
}

.card__box {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr 1fr;
    grid-gap: 10px;
}

.card__content {
    display: grid;
    align-items: center;
    font-weight: bold;
    margin: 0 0 0 10px;  /* 글자 수직의 가운데 정렬 */
}

.card {
    display: grid;
    grid-template-columns: 1fr 3fr;
    border: 1px solid #dddd;
    border-radius: 6px;
    box-shadow: 0 2px 2px 0 rgb(214, 214, 214);
    color: #212121dd;
}

.ad1 {
    background-image: url("../images/ad1.jpg");
    border-radius: 10px;
    margin: 40px 0;
    height: 350px;  /* 이미지는 높이값을 주지 않으면 안나옴 */
    background-size: 100% 100%;
}

.ad2 {
    background-image: url("../images/ad2.png");
    margin: 20px 0;
    height: 300px;  /* 이미지는 높이값을 주지 않으면 안나옴 */
    background-size: 100% 100%;
}

.choo_img1 {
    background-image: url(../images/choo1.png);
    height: 250px;
    background-size: 100% 100%;
}

.choo_img2 {
    background-image: url(../images/choo2.png);
    height: 250px;
    background-size: 100% 100%;
}

.choo_img3 {
    background-image: url(../images/choo3.png);
    height: 250px;
    background-size: 100% 100%;
}

.choo_img4 {
    background-image: url(../images/choo4.png);
    height: 250px;
    background-size: 100% 100%;
}

.choo_img5 {
    background-image: url(../images/choo5.png);
    height: 250px;
    background-size: 100% 100%;
}

.choo__box {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
    grid-gap: 5px;
    padding-bottom: 30px;
}

.home__box {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr 1fr;
    grid-gap: 10px;
}

.home__box .info1 {
    font-size: 13px;
    margin: 7px 0;
    color: #535151dd;
}

.home__box .info2 {
    font-weight: bold;
}

.home__box .star {
    color: rgb(73, 77, 188);
    font-size: 15px;
}

.home__box .count {
    font-size: 13px;
}

.home__box .type {
    font-size: 13px;
}

.sec__title {
    margin-top: 40px;
}

.home__img1 {
    background-image: url(../images/home1.png);
    height: 150px;
    background-size: 100% 100%;
}

.home__img2 {
    background-image: url(../images/home2.png);
    height: 150px;
    background-size: 100% 100%;
}

.home__img3 {
    background-image: url(../images/home3.png);
    height: 150px;
    background-size: 100% 100%;
}

.home__img4 {
    background-image: url(../images/home4.png);
    height: 150px;
    background-size: 100% 100%;
}

.home__img5 {
    background-image: url(../images/home5.png);
    height: 150px;
    background-size: 100% 100%;
}

.home__img6 {
    background-image: url(../images/home6.png);
    height: 150px;
    background-size: 100% 100%;
}

.home__img7 {
    background-image: url(../images/home7.png);
    height: 150px;
    background-size: 100% 100%;
}

.home__img8 {
    background-image: url(../images/home8.png);
    height: 150px;
    background-size: 100% 100%;
}

.footer__box {
    background-color: #eeee;
    height: 100px;
    border-top: 1px solid #cccccc;
}

.footer__box .callcenter ul{
    margin: 40px 80px;
    font-size: 12px;
    color: #434343e4;
    list-style-type: none ;
    display: grid;
    grid-template-columns: auto;
}

 

 

 

새로 알게 된 것 :

svg → 문자 취급이 가능한 이미지, 용량도 작아짐

 

 

자바스크립트

클론 코딩을 마지막으로 자바스크립트로 넘어갔다.

 

HTML

  • CSS - 디자인
  • JAVAscript - 동적인 페이지 구현, 생기있는 페이지를 만들 수 있다.

 

자바스크립트를 잘 하려면 css를 잘 알아야 한다!

on 뒤에 오는 것 이벤트처리

 

 

자바스크립트 사용방식

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script src="./testscript.js"></script>
        <script>
            // message 함수 입니다.
            function message() {
                alert('hello');
            }
        </script>
    </head>
    <body>
        <!-- 자바스크립트 사용 방식 1.임베디드한 방식 -->
        <p onclick="alert('hello')">여기를 클릭하세요</p>
        <!-- 2.내부에 정의하는 방식 -->
        <p onclick="message()">
            여기를 클릭하세요</p>
        <!-- 3. 외부에 정의하는 방식 -->
        <p onclick="message2()">
            여기를 클릭하세요</p>
    </body>
</html>

 

function message2() {
    alert("massage2");

 

 

자바스크립트 문법

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        // 자바스크립트 문법

        // 변수 선언 방법
        var x;
        x = 10; // 값을 받으면 타입을 알 수 있게 됨
        console.log(x);
        document.write(x + "<br>");

        var x,y,z;
        x = 10;
        y = 20;
        z = 30;
        // 문자열이 들어가도 되고, 같은 이름으로 변수가 설정되어도 된다.
        x = "kang";
        document.write(typeof(x) + "<br>"); //바로 위의 x의 타입을 출력

        x = 100;
        document.write(typeof(x) + "<br>");
        var x;
        x = 23.6

        // 문자, 숫자, 논리, 객체, undifinded (값이 없다)

        x = true;
        x = 5 > 3;

        var u;
        document.write(typeof(u) + "<br>");  // undefined : 변수의 값이 없을 때

        // 1. 숫자가 맨 앞에 오면 안된다
        // 2. 예약어를 사용하면 안된다 document같은 것
        // 3. 대문자 구분

        // 변수 앞에 붙일 수 있는 것
        // var, let, const
        let o;
        o = 10;
        document.write(o, "<br>");

       //let o;  // 중복선언 

       const i  = 100; // 상수이기 때문에 무조건 값을 줘야 함.
       //i = 200;
       document.write(i, "<br>");

    </script>
</head>
<body>
    
</body>
</html>

와 정말 소개만 하고 끝냄;;

 

 

자바스크립트의 연산자들

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script>
            // 산술연산자 + , - , * , % , / 문자연결 3 + "hello" -> "3hello" 문자열이 된다 대입연산자
            // = , += , -=, /= , *= , ...

            // 증감연산자
            // ++ , --

            // 비교연산자
            // === , != , < , > , >= , <= 

            // 논리연산자
            // && , || , !

            // 삼항연산자
            // 조건식 ? 결과1 : 결과2


            // 값을 입력박고 싶을 때 쓰는 함수 
            // prompt("당신의 몸무게를 입력하세요", "");
            // 데이터 타입이 문자 

            let w = prompt("당신의 몸무게 입력:", "0");
            // 프롬프터로 입력받은 값은 문자이기때문에 문자를 숫자로 바꾸는 작업을 해야한다.
            w = parseInt(w);
            document.write(w); // 이때 타입은 넘버로 바뀐다.

            let h = prompt("당신의 키 입력:", "0");
            h = parseInt(h);
            document.write(h); 
            
            let avg = (h - 100) * 0.9;
            document.write(avg); 

        </script>
    </head>
    <body></body>
</html>

 

아래와 같이 자바스크립트로 표를 만들 수도 있다!

// 산술연산자를 이용해 스크립트로 표를 만들 수도 있다.
 // 바깥쪽이 큰 따옴표면 안쪽은 작은 따옴표로 감싸야 한다

             let str = "<table border = '1'>";
             str += "<tr>";
             str += "<td>1</td> <td>2</td> <td>3</td>"
             str += "</tr>";
             str += "</table>"
             document.write(str);

'2024_UIUX 국비 TIL' 카테고리의 다른 글

UIUX _국비과정 0425  (1) 2024.06.03
UIUX _국비과정 0424  (1) 2024.06.03
UIUX _국비과정 0422  (0) 2024.05.30
UIUX _국비과정 0419  (0) 2024.05.30
UIUX _국비과정 0418 [HTML + CSS]  (0) 2024.05.30

해남고구마협회 사이트 만들기

 

내가 하다만 구현 화면 :

아니 저렇게 잘 나오다가 왜!!!! 갑자기 저게 밑으로 내려가는지 ㅠ 환장

 

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>해남고구마 생산자 협회</title>
        <link href="ha_swap.css" rel="stylesheet" type="text/css">

    </head>

    <body >
        <div class="topyellow">
            <header>
                <div class="toplogo"><img src="images/ha_logo.jpg" width="131" height="97" alt=""/></div>
                <nav class="topmini">
                    <ul>
                        <li><img src="images/ha_mini01.jpg" width="52" height="19" alt=""/></li>
                        <li><img src="images/ha_mini02.jpg" width="62" height="19" alt=""/></li>
                        <li><img src="images/ha_mini03.jpg" width="72" height="19" alt=""/></li>
                        <li><img src="images/ha_mini04.jpg" width="60" height="19" alt=""/></li>
                        <li><img src="images/ha_mini05.jpg" width="72" height="19" alt=""/></li>
                    </ul>
                </nav>
                <div class="search">
                    <input type="text" name="textfield" id="textfield">
                    <img src="images/ha_search.jpg" width="62" height="35" alt=""/></div>
                <div class="topsns"><img src="images/ha_sns01.jpg" width="125" height="40" alt=""/></div>
            </header>
        </div>
        <div class="topmenubg">
            <nav id="mainmenu">
                <a
                    href="#"
                    onmouseout="MM_swapImgRestore()"
                    onmouseover="MM_swapImage('Image9','','images/ha_menu01_r.jpg',1)"><img src="images/ha_menu01.jpg" alt="고구마" width="145" height="51" id="Image9"></a>
                <a
                    href="#"
                    onmouseout="MM_swapImgRestore()"
                    onmouseover="MM_swapImage('Image10','','images/ha_menu02_r.jpg',1)"><img
                    src="images/ha_menu02.jpg"
                    alt="고구마가공식품"
                    width="188"
                    height="51"
                    id="Image10"></a>
                <a
                    href="#"
                    onmouseout="MM_swapImgRestore()"
                    onmouseover="MM_swapImage('Image11','','images/ha_menu03_r.jpg',1)"><img
                    src="images/ha_menu03.jpg"
                    alt="고구마종순"
                    width="166"
                    height="51"
                    id="Image11"></a>
                <a
                    href="#"
                    onmouseout="MM_swapImgRestore()"
                    onmouseover="MM_swapImage('Image12','','images/ha_menu04_r.jpg',1)"><img src="images/ha_menu04.jpg" alt="농자재" width="161" height="51" id="Image12"></a>
                <a
                    href="#"
                    onmouseout="MM_swapImgRestore()"
                    onmouseover="MM_swapImage('Image13','','images/ha_menu05_r.jpg',1)"><img src="images/ha_menu05.jpg" alt="구매후기" width="169" height="51" id="Image13"></a>
                <a
                    href="#"
                    onmouseout="MM_swapImgRestore()"
                    onmouseover="MM_swapImage('Image14','','images/ha_menu06_r.jpg',1)"><img src="images/ha_menu06.jpg" alt="이벤트" width="171" height="51" id="Image14"></a>
            </nav>
        </div>
        <div class="mainimgbg">
            <div class="mainimg">
                <div class="change"><img src="images/ha_mainimg01.jpg" alt="" width="755" height="360"/></div>
                <ul>
                    <li>
                        <p>달콤보들 풍미가득</p>
                        <h3>호박고구마
                        </h3>
                    </li>
                    <li>
                        <p>감미료 무첨가 간식</p>
                        <h3>해남반시고구마
                        </h3>
                    </li>
                    <li>
                        <p>아침 거르지 마세요</p>
                        <h3 >아이스군고구마</h3>
                    </li>
                </ul>
            </div>
        </div>
        <article class="container">
            <section class="mainban"><img src="images/ha_title01.jpg" width="357" height="57" alt=""/>
                <div class="banframe"><img src="images/ha_banner01.jpg" width="316" height="155" alt=""/><img src="images/ha_banner02.jpg" width="316" height="155" alt=""/><img src="images/ha_banner03.jpg" width="316" height="155" alt=""/></div>
            </section>
            <section class="item"><img src="images/ha_title02.jpg" width="357" height="56" alt=""/>
                <div class="itemarea">
                    <div class="itemlist"><img src="images/ha_item01.jpg" width="317" height="318" alt=""/>
                        <div class="textaea">꿀맛나는 고구마 입안에 퍼지는 달콤함
                            <br>
                            <span class="textpoint1">대월농장 해남고구마 3kg</span><br>
                            <span class="textpoint2">18,000 원</span>
                            <span class="textpoint3 textpoint1">9,900 원</span></div>
                    </div>
                    <div class="itemlist"><img src="images/ha_item02.jpg" width="318" height="318" alt=""/>
                        <div class="textaea">아침거르지마세요 1분이면 건강식 군고구마가~<br>
                            <span class="textpoint1">해남 아이스군로구마 2kg</span><br>
                            <span class="textpoint2">26,000 원</span>
                            <span class="textpoint3 textpoint1">19,900 원</span></div>
                    </div>
                    <div class="itemlist"><img src="images/ha_item03.jpg" width="317" height="318" alt=""/>
                        <div class="textaea">꿀맛나는 고구마 입안에 퍼지는 달콤함
                            <br>
                            <span class="textpoint1">해남 반시 고구마 60g, 10개</span><br>
                            <span class="textpoint2">29,000 원</span>
                            <span class="textpoint3 textpoint1">19,500 원</span></div>
                    </div>
                </div>
            </section>
            <section class="callcenter">
                <div class="notice">
                    <img src="images/ha_notice.jpg" width="277" height="27" alt=""/>
                    <ul>
                        <li>해남 홈페이지가 새롭게 리뉴얼했습니다.</li>
                        <li>무이자 이벤트 안내</li>
                        <li>신규가입고객20% 추가 할인 이벤트</li>
                        <li>[공지]배송지연 안내</li>
                    </ul>
                </div>
                <div class="callnum"><img src="images/ha_call.jpg" width="340" height="147" alt=""/></div>
                <div class="quick"><img src="images/ha_icon.jpg" width="255" height="147" alt=""/></div>
            </section>
        </article>
        <footer>
            <div class="footerbg">
                <div class="footermenu">회사소개 | 이용약관 | 개인정보취급방침 | 이용안내 | FAQ</div>
            </div>
            <div class="address"><img src="images/ha_address.jpg" width="527" height="78" alt=""/></div>
        </footer>
    </body>
</html>
body {
    margin: 0;
    /* 마진값 초기화 */
    padding: 0;
    /* 패딩값 초기화 */
    font-family: "굴림", "굴림체", "돋움", "돋움체";
    font-size: 9pt;
    line-height: 170%;
}

img {
    border-width: 0;
}

.topyellow {
    width: 100%;
    height: 125px;
    background-color: #FFD747;
    /* rgb(257, 216, 73); */
}

.topyellow header {
    width: 1000px;
    padding-top: 12px;
    margin-left: auto;
    /* 가운데 정렬 */
    margin-right: auto;
    /* 가운데 정렬 */
    height: 112px;
    /* 자식에 float이 있으면 부모에 height 값 주기 */
    background-color: #FFD747;
}

.topyellow header .toplogo {
    width: 131px;
    height: 97px;
    float: left;
}

.topyellow header .topmini {
    float: right;
}

.topyellow header .search {
    float: left;
    margin-top: 30px;
    margin-left: 158px;
    width: 420px;
}

.topyellow header .topsns {
    width: 125px;
    height: 40px;
    float: right;
    clear: right;
    margin-top: 28px;
}

header .search img {
    float: right;
}

header .search #textfield {
    float: left;
    width: 350px;
    height: 31px;
    border: 1px solid #FFD747;
}

.topyellow header .topmini ul {
    padding: 0;
    margin: 0;
    list-style-type: none;
}


.topyellow header .topmini ul li {
    display: inline;
    /* float도 가능 */
}

.topyellow header .topmini ul li img {
    float: left;
}

.topmenubg {
    height: 51px;
    width: 100%;
    background-color: #4C0A00;
    clear: both;
}

.topmenubg #mainmenu {
    width: 1000px;
    margin-left: auto;
    margin-right: auto;
    height: 51px;
    color: #ffff;
}

.topmenubg #mainmenu a {
    float: left;
}

.mainimgbg {
    width: 100%;
    height: 380px;
    border: 1px solid #cccc;
    background-color: #fbfafa;
    clear: both;
}

.mainimgbg .mainimg {
    width: 1000px;
    height: 360px;
    margin: 0 auto;
}

.mainimgbg .mainimg .change {
    width: 755px;
    height: 360px;
    float: left;
}

.mainimg ul {
    list-style-type: none;
    padding : 30px 0 0 0;
    margin:0;
    float:left;
}

.mainimg ul li{
    width: 234px;
    height: 65px;
    border: 1px solid #cccc;
    text-align: center;
    padding: 18px;
    margin-top: 10px;
}

.mainimg ul li p{
    margin: 0px;
}

.mainimg ul li h3{
    margin: 0;
    padding: 0;
}

.container {
    width: 1000px;
    margin: 0 auto;
    padding-top: 15px;
    clear: both;
}

.container .mainban .banframe {
    width: 986px;
    height: 160px;
    border: 1px solid #cccc;
    background-color: #fbfafa;
    clear: both;
    float: left;
    padding-top: 6px;
    padding-left: 13px;
}

.container .mainban img {
    margin-right: 11px;
}

.container .item {
    padding-top: 14px;
    clear: both;
}

.container .item .itemlist {
    width: 317px;
    height: 410px;
    padding-left: 8px;
    padding-right: 8px;
    float: left;
}

.container .item .itemlist .textaea {
    background-color: #fbfafa;
    height: 82px;
    padding-top: 10px;
    text-align: center;
}

.container .callcenter {
    clear: both;
    float: left;
    border: 1px solid #ddd;
    height: 174px;
    width: 100%;
    padding-bottom: 20px;
    margin-top: 20px;
}

.container .item .itemarea {
    clear: both;
}

.container .callcenter .notice {
    width: 300px;
    border-right: 1px solid #ddd;
    padding-top: 27px;
    clear: both;
    float: left;
}

.notice ul {
    padding: 0;
    margin: 0;
    list-style-type: none;
    width: 277px;
}

.notice ul li {
    padding-top: 5px;
    border-bottom: 1px dashed #ddd;
    padding-bottom: 3px;
}

.container .callcenter .callnum {
    width: 372px;
    border-right: 1px solid #ddd;
    float: left;
    padding-top: 27px;
    padding-left: 28px;
}

.container .callcenter .quick {
    float: left;
    padding-top: 27px;
    padding-left: 20px;
}

body footer {
    clear: both;
}

.footerbg {
    background-color: #e8e8e8cc;
    border-top: 1px solid #cccc;
    border-bottom: 1px solid #cccc;
}

.footerbg .footermenu {
    width: 1000px;
    height: 25px;
    margin: 0 auto;
    /* 글자를 민 것이 아니라 박스를 민 것 */
    padding-top: 7px;
}

body footer .address {
    width: 1000px;
    height: 20px;
    margin: 0 auto;
    /* 글자를 민 것이 아니라 박스를 민 것 */
    margin-top: 20px;
    margin-bottom: 20px;
}
  • margin: 0 auto; /* 글자를 민 것이 아니라 박스를 민 것 */ 에 대한 이해가 확실하게 된 것 같다!

근데 저 코드에선 고구마랑 메뉴가 나란히 나오지 않는다..

강사님꺼랑 똑같은데 뭐가 문제일까!!!!!

다시 비교해봐야겠다.

 

 

제대로 된 구현 화면 :

 

 

강사님 코드 :

body {
    padding: 0px;
    margin: 0px;
    font-size: 9pt;
    line-height: 170%;
    font-family: "굴림", "굴림체", "돋움", "돋움체";
 }
 img {
    border-width: 0px;
 }
 
 .topyellow {
     width: 100%;
     height: 125px;
     background-color: #ffd747;
 }
 
 .topyellow header {
     width: 1000px;
     margin-left: auto;
     margin-right: auto;
     /* padding-top: 12px; */
     height: 112px;
     background-color: #ffd747;
 }
 
 .topyellow header .toplogo {
     width: 131px;
     height: 97px;
     float: left;
 }
 
 .topyellow header .topmini {
     float:right;
 }
 
 .topyellow header .search {
     float: left;
     margin-top: 30px;
     margin-left: 158px;
     width: 420px;
 }
 
 .topyellow header .topsns {
     width: 125px;
     height: 40px;
     float: right;
     clear: right;
     margin-top: 28px;
 }
 
 header .search img {
     float:right;
 }
 
 header .search #textfield {
     float: left;
     width: 350px;
     height: 31px;
     border: 1px solid #f0ca3f;
 }
 
 .topyellow header .topmini ul {
     padding: 0;
     margin: 0;
     list-style-type: none;
 }
 
 .topyellow header .topmini ul li{
     display: inline;
 }
 
 .topyellow header .topmini ul li img{
     float:left;
 }
 
 .topmenubg {
     height: 51px;
     width:100%;
     background-color: #4c0a00;
     clear: both;
 }
 
 .topmenubg #mainmenu {
     width: 1000px;
     margin: 0 auto;
     height: 51px;
     color: #FFFFFF;
 }

 .topmenubg #mainmenu a {
    float: left;
}
 
 .mainimgbg {
     width: 100%;
     height: 360px;
     border: 1px solid #cccccc;
     background-color: #fbfafa;
     clear: both;
 }
 
 .mainimgbg .mainimg {
     width: 1000px;
     height: 360px;
     margin: 0 auto;
 }
 
 .mainimgbg .mainimg .change {
     width: 755px;
     height: 360px;
     float: left;
 }
 
 .container{
     width: 1000px;
     margin: 0 auto;
     padding-top: 15px;
     clear: both;
 }
 
 .container .mainban .banframe {
     width: 986px;
     height: 160px;
     border: 1px  solid #cccccc;
     background-color: #fbfafa;
     clear: both;
     float: left;
     padding-top: 12px;
     padding-left: 12px;
 }
 
 .container .mainban img{
     margin-right: 11px;
 }
 
 .container .item{
     padding-top: 14px;
     clear: both;
 }
 
 .container .item .itemlist{
     width: 317px;
     height: 410px;
     padding-left: 8px;
     padding-right: 8px;
     float: left;
 }
 
 .container .item .itemlist .textaea{
     background-color: #fbfafa;
     height: 82px;
     padding-top: 10px;
     text-align: center;
 }
 
 /* .item .itemlist img {
    display: block;
 } */
 
 .container .callcenter {
     clear: both;
     float: left;
 }
 
 .container .item .itemarea {
    clear: both;
 }
 
 .container .callcenter {
     border: 1px solid #ddd;
     height: 174px;
     width: 100%;
     padding-bottom: 20px;
     margin-top: 20px;
     /* float: left; */
 }
 
 .container .callcenter .notice {
     width: 300px;
     border-right: 1px solid #ddd;
     padding-top: 27px;
     clear: both;
     float:left;
 }
 
 .notice ul {
     padding: 0;
     margin: 0;
     list-style-type: none;
     width: 277px;
 }
 
 .notice ul li {
     padding-top: 5px;
     border-bottom: 1px dashed #ddd;
     padding-bottom: 3px;
 }
 
 .container .callcenter .callnum {
     width:372px;
     border-right: 1px solid #ddd;
     float: left;
     padding-top: 27px;
     padding-left: 28px;
 }
 
 .container .callcenter .quick {
     float: left;
     padding-top: 27px;
     padding-left: 20px;
 
 }
 
 
 
 body footer{
     clear: both;
 }
 
 .footerbg{
     background-color: #f4f3f3;
     border-top: 1px solid #cccccc;
     border-bottom: 1px solid #cccccc;
 
 }
 
 .footerbg .footermenu {
     width: 1000px;
     height: 25px;
     margin:0 auto;
     padding-top: 10px;
 }
 
 .address {
     width: 1000px;
     height: 20px;
     margin:0 auto;
     margin-top: 20px;
     margin-bottom: 20px;
 
 }
 
 .mainimg ul {
     list-style-type: none;
     padding : 30px 0 0 0;
     margin:0;
     float:left;
 }
 
 .mainimg ul li{
     width: 234px;
     height: 65px;
     border: 1px solid #C4C4C4;
     text-align: center;
     padding-top: 18px;
     margin-top : 10px;
 }
 
 .mainimg ul li p{
     margin:0px;
 }
 
 .mainimg ul li h3{
     margin:0px;
     padding:0px;
 }

 

 

전에 내가 하다만 코드:

.topmini > ul{
    position: absolute;
    z-index: 50;
    list-style-type: none;
}

.topmini > ul > li{
    float: left;
    padding: 0;
    position: relative;
    top: -105px;
    left: 200%;
}

.toplogo {
    position: relative;
    padding: 10px;
}

.search > input {
    position: relative;
    height: 35px;
    width: 350px;
    float: left;
    border: 0;
}

.search > img {
    position: relative;
    margin-left: 3px;
}

.topsns {
    position: absolute;
    bottom: 15px;
    z-index: 30;
    right: 15%;
}

.search {
    position: absolute;
    float: left;
    margin-right: 200px;
    bottom: 20px;
    left: 30%;
}

.topmenubg {
    margin: 0 auto;
    width: 100%;
    height: 52px;
    background-color: #4C0A00;
}

.mainimgbg {
    position: relative;
    width: 100%;
    height: 360px;
    position: relative;
}

.mainimg > li {
    position: absolute;
    float: left;
}

내가 했던 코드, 헤드 부분,, position을 이용하려니 헤더만 작성해도 하루가 거의 다 갔다..

 

그래도 오늘의 작은 성취 하나.. : 밑에 footer 부분은 어찌저찌 직접 구현함.

 

 

 

반응형 웹

: 화면의 크기나 해상도에 따라 반응이 달라진다.

: 디바이스의 디스플레이의 종류에 반응하여 그에 맞도록 적절하게 UI 요소들이 유기적으로 배치되도록 설계된 을 말한다. (나무위키)

예시)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        h1 {
            font-size: 5vw;  /* 현재를 기분으로 화면을 픽셀로 쪼개는 것이기 때문에 화면 크기에 따라 글씨크기가 달라짐! */
            text-align: center;
        }
    </style>

</head>
<body>
    <h1>안녕하세요?</h1>
</body>
</html>

 

 

다양한 화면 해상도를 체험하는 법 :

콘솔창에서 확인할 수 있음!

 

 

  • 현재의 해상도에 반응하는 코드 :
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style>

            /* 현재 해상도에 반응하는 코드 */
            body {
                background: url("images/bg1.jpg") no-repeat fixed;
                background-size: cover;
            }

            /* @media screen and */
            /* screen 컴퓨터나 스마트폰, and 뒤에는 해상도 */
            @media screen and (max-width:1024px) {
                body {
                    background: url("images/bg2.jpg") no-repeat fixed;
                    background-size: cover;
                }
            }

            @media screen and (max-width:768px) {
                body {
                    background: url("images/bg3.jpg") no-repeat fixed;
                    background-size: cover;
                }
            }

            @media screen and (max-width:320px) {
                body {
                    background: url("images/bg4.jpg") no-repeat fixed;
                    background-size: cover;
                }
            }
        </style>
    </head>
    <body></body>
</html>

 

실행 :

해상도에 따라 이미지들이 다르게 나온다.

 

 

그리드 레이아웃 - 플렉스

참고)

 

[HTML/CSS] 그리드 레이아웃(플렉서블 박스 레이아웃)

플렉서블 박스 레이아웃 배치

velog.io

 

쓰는 방법 :

 

우선, 플렉스를 쓰겠다는 선언을 해야 함.

부모에

  • display : flex

라고 선언한 뒤 다음 필요한 flex 사용하기

  • flex-direction : row(주축), column(교차축)
  • flex-wrap : wrap(감싼다), nowrap(안감싼다)
  • flex-flow : row wrap
  • justify-content : 주축에 대한 정렬
  • (재정의)
  • align-item : 교차측에 때한 정렬
  • align-self : 특정요소에 대한 처리
  • align-content : 여러 줄의 교차축 정렬

 

 

코드와 화면 구현

  • flex-direction : row(주축), column(교차축)

<style>
            .container {
                width: 700px;
                display: flex;
                background-color: khaki;
                border: 1px solid #5c4d3d;
                margin-bottom: 30px;
            }

            .box{
                padding: 5px 45px;
                margin: 5px;
                width: 80px;
                background-color: tomato;
            }

            #opt1 {
                flex-direction: row;
            }

            #opt2 {
                flex-direction: row-reverse;
            }

            #opt3 {
                flex-direction: column;
            }

            #opt4 {
                flex-direction: column-reverse;
            }

            p {
                color: white;
            }


        </style>

 

 

  • flex-wrap : wrap(감싼다), nowrap(안감싼다)

        <style>
            .container {
                display: flex;
                background-color: khaki;
                border: 1px solid #5c4d3d;
                margin-bottom: 30px;
            }

            .box {
                padding: 5px 45px;
                margin: 5px;
                width: 80px;
                background-color: tomato;
            }

            #opt1 {
                flex-wrap: nowrap;
            }

            #opt2 {
                flex-wrap: wrap;
            }

            #opt3 {
                flex-wrap: wrap-reverse;
            }

            p {
                color: white;
            }


        </style>

 

 

 

  • justify-content : 주축에 대한 정렬

<style>
            .container {
                display: flex;
                background-color: khaki;
                border: 1px solid #5c4d3d;
                margin-bottom: 30px;
            }

            .box {
                padding: 5px 45px;
                margin: 5px;
                width: 80px;
                background-color: tomato;
            }

            #opt1 {
                justify-content: flex-start; /* 주축의 정렬방식 */
            }

            #opt2 {
                justify-content: flex-end; /* 끝부터 정렬방식 */
            }

            #opt3 {
                justify-content: center; /* 가운데부터 퍼져나가는 정렬방식 */
            }

            #opt4 {
                justify-content: space-between; 
            }

            #opt5 {
                justify-content: space-around; 
            }

            p {
                color: white;
            }

        </style>

 

 

  • align-item : 교차측에 대한 정렬

<style>
        .container {
                width: 100%;
                height: 100px;
                display: flex;
                background-color: khaki;
                border: 1px solid #5c4d3d;
                margin-bottom: 30px;
            }

            .box {
                padding: 5px 45px;
                margin: 5px;
                width: 70px;
                background-color: tomato;
            }

            /* 교차축(세로)의 정렬 방식 */
            #opt1 {
                align-items: flex-start;
            }

            #opt2 {
                align-items: flex-end;
            }

            #opt3 {
                align-items: center;
            }

            #opt4 {
               align-items: baseline;  /* 글자를 기준으로 크기가 바뀜 */
            }

            #opt5 {
                align-items: stretch; /* 쭉 늘어남 */
            }

            p {
                color: white;
            }
    </style>

 

 

  • align-self : 특정요소에 대한 처리

<style>
            .container {
                width: 450px;
                height: 150px;
                display: flex;
                background-color: khaki;
                border: 1px solid #5c4d3d;
                margin-bottom: 20px;
                align-items: center;
            }

            .box {
                padding: 5px 45px;
                margin: 5px;
                width: 80px;
                background-color: tomato;
            }

            /* 하나씩 조정 -> 불규칙한 조절이 가능하다 */
            #box1 {
                align-self: flex-start;
            }

            #box3 {
                align-self: stretch;
            }

            p {
                color: white;
                text-align: center;
            }

        </style>

 

 

  • align-content : 여러 줄의 교차축 정렬 , flex-flow : row wrap
flex-flow : row wrap
= 부모요소 가로 세로크기 맞춰 section들이 순서대로 하나씩 정렬 된 것.

 

출처:

 

[CSS] flex 관련 속성 정리 flex-direction / flex-wrap / flex-flow

1. flex-direction - 요소들 나열 방향 지정 A B C D E F main { width: 200px; height: 200px; border: 1px solid lightgray; display: flex; flex-direction:row; } main div { width: 50px; height: 50px; } flex-direction 속성의 부모 요소에 display:f

chlolisher.tistory.com

 

 

 

<style>
            .container {
                float: left;
                width: 200px;
                height: 150px;
                display: flex;
                background-color: khaki;
                border: 1px solid #5c4d3d;
                flex-flow: row wrap;  <- 부모에 들어감
                margin: 30px;
            }

            .box {
                width: 80px;
                background-color: tomato;
                border: 1px solid #5c4d3d;
            }

            /* 여러 줄의 교차축 정렬방식 */
            #opt1 {
                align-content: flex-start;
            }

            #opt2 {
                align-content: flex-end;
            }

            #opt3 {
                align-content: center;
            }

            #opt4 {
               align-content: space-between;
            }

            #opt5 {
                align-content: space-around;
            }

            #opt6 {
                align-content: stretch;
            }

            p {
                color: white;
                text-align: center;
            }
            
        </style>

+ Recent posts