작성 : 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>

 

JS Basics #1 - 자바스크립트 참조 타입(객체 타입)

자바스크립트에서는 앞선 챕터에서 알아본 숫자, 문자열, 불린값, null, undefined 같은 기본 타입을 제외한 모든 값은 객체로 취급됩니다. 따라서 배열, 함수, 정규표현식 등도 모두 결국 자바스크

webclub.tistory.com

위 블로그 내용을 보며 공부한 내용을 정리한 글입니다. 

 

 

 

자바스크립트 객체 생성하기

  1. 기본제공(내장함수)되는 object() 객체 생성자 함수 이용
  2. 객체 리터럴 이용
  3. 생성자 함수 이용

 

1. 내장 Object() 생성자 함수 이용하기

// Object() 를 이용하여 foo 빈 객체 생성
let foo = new Object();

foo.name = "coolandsexygirl";
foo.age = 99;
foo.gender = 'male';

console.log(typeof foo);  // object
console.log(foo);  // { name: 'coolandsexygirl', age: 99, gender: 'male' }

 

2. 객체 리터럴 방식 사용하기

// 객체 리터럴 : 간단한 표기법으로 객체를 생성하는 방법이라는 뜻
let foo = { 
    name : 'coolandssexygirl',
    age : 99,
    gender : 'male'
}

console.log(typeof foo);  // object
console.log(foo);  // { name: 'coolandsexygirl', age: 99, gender: 'male' }

 

3. 사용자 생성자 함수를 사용하기

function Foo() {
    this.name = 'coolandsexygirl';
    this.age = 99;
    this.gender = 'male';
}

var fooInstance = new Foo();

console.log(fooInstance); // Foo { name: 'coolandsexygirl', age: 99, gender: 'male' }

함수가 호출가능한 요소로 사용될 수도,

다른 객체를 생성하는 요소로 사용될 수도 있다.

어떤 역할로 사용될 지는 주변 실행환경, 즉 연산자에 따라 달라진다.

new 키워드와 함께 사용되면 메모리에 인스턴스(생성자 함수에서 반환된 객체)를 생성하는 역할로 사용된다.

new 없이 ()연산자 를 사용해 호출하면 일반 함수처럼 사용된다.

때문에,

 

암묵적인 약속(관습적)으로 프로그래밍계에서는 일반 함수는 함수명의 첫 글자를 소문자로 시작하고 생성자는 첫 글자를 대문자로 작성하도록 권장하고 있으며,이를 통해 생성자 함수인지 일반 함수인지를 구별하고 있다.

 

자바에서 쓰던 class 키워드 → 자바스크립트에선 function

 

생성자는 new 연산자에 의해 호출되어 객체의 초기화를 담당,데이터의 값을 설정(변수 설정) 하고 메소드를 호출해서 객체를 사용할 수 있도록 준비

 

출처:

https://webclub.tistory.com/641

[Web Club:티스토리]

 


퐁규 gpt 와의 대화 시간 )

전지전능할 전 , 핑퐁 퐁 , 큐티 규 . 전 퐁 규

 

history 에 대해 배우다 자바스크립트가 history를 통해 쿠키를 가지고 오는건지, 자바스크립트는 쿠키를 어떻게 사용하는지 궁금했음

나 : 쿠키는 자바스크립트에서 수집되는 거야?

퐁규의 답변 :

쿠키는 일반적으로 웹 브라우저에서 관리되는 작은 텍스트 파일입니다. 자바스크립트 자체는 쿠키를 수집하지 않습니다. 그러나 자바스크립트를 사용하여 웹 페이지에 쿠키를 설정하거나 읽을 수는 있습니다.

웹 페이지에서 자바스크립트를 사용하여 쿠키를 설정하는 방법은 document.cookie 속성을 사용하는 것입니다. 이를 통해 쿠키를 설정하고 읽을 수 있습니다. 하지만 이를 위해서는 사용자의 브라우저 설정이 쿠키를 허용해야 합니다. 또한, 자바스크립트를 사용하여 쿠키를 설정하는 경우 보안 및 개인정보 보호를 위해 사용자에게 동의를 요청하는 것이 좋습니다.

따라서 자바스크립트를 사용하여 쿠키를 읽거나 설정하는 것은 웹 애플리케이션에서 사용자의 편의성을 높이고 사용자 경험을 개선하는 데 도움이 될 수 있지만, 이를 남용하지 않고 적절한 보안 및 개인정보 보호를 고려해야 합니다.

 

나 : 자바스크립트의 브라우저 객체 history를 통해 쿠키를 가지고 올 수 있어?

퐁규의 답변 :

JavaScript의 history 객체는 브라우저의 탐색 히스토리를 관리하는 데 사용됩니다. 이 객체를 통해 이전에 방문한 페이지의 URL 등을 액세스할 수 있지만, 쿠키를 직접적으로 읽거나 조작하는 데 사용되지는 않습니다.

쿠키를 읽거나 조작하는 데 사용되는 주요 객체는 document 객체입니다. 자바스크립트에서 쿠키를 읽거나 설정하려면 document.cookie 속성을 사용합니다. 이 속성을 통해 현재 페이지의 쿠키를 읽고 설정할 수 있습니다.

예를 들어, 다음과 같은 방식으로 document.cookie를 사용하여 쿠키를 읽을 수 있습니다:

console.log(document.cookie);

그러나 이를 통해 다른 도메인의 쿠키를 읽거나 조작하는 것은 보안상의 이유로 허용되지 않습니다. 웹 브라우저는 동일 출처 정책(Same Origin Policy)을 적용하여 다른 출처의 쿠키에 접근을 제한합니다. 따라서 다른 도메인의 쿠키를 가져오려면 해당 도메인의 페이지에서 자바스크립트를 실행해야 합니다.

요약하면, history 객체를 사용하여 쿠키를 읽거나 조작하는 것은 보통의 사용 방법이 아니며, 쿠키를 다룰 때는 주로 document.cookie 속성을 사용합니다.

 

나 : 액세스가 뭐야?

퐁규 :

"액세스"는 정보나 자원에 대한 접근이나 이용을 의미합니다. 컴퓨터 과학 분야에서는 데이터나 기능을 사용할 수 있는 권한을 갖는 것을 액세스한다고 합니다.

웹 개발에서 "액세스"란 웹 페이지나 웹 애플리케이션을 통해 정보나 기능에 접근하는 것을 의미합니다. 이는 일반적으로 사용자가 웹 사이트에 방문하여 페이지를 탐색하고 기능을 사용하는 것을 말합니다.

예를 들어, 웹 브라우저를 사용하여 웹 사이트에 액세스할 때, 사용자는 웹 서버에서 제공하는 페이지를 볼 수 있고, 폼을 제출하여 데이터를 전송하거나, 링크를 클릭하여 다른 페이지로 이동할 수 있습니다. 또한, 웹 개발자는 서버 측 코드나 클라이언트 측 스크립트를 사용하여 사용자의 요청을 처리하고 적절한 응답을 생성함으로써 사용자에게 정보나 서비스를 제공할 수 있습니다.

따라서 "액세스"는 웹에서 사용자가 웹 사이트나 애플리케이션을 통해 정보를 얻거나 기능을 사용하는 것을 의미합니다.

 

나 : 쿠키는 웹 브라우저에서 어떻게 관리되는거야?

퐁규 :

쿠키는 일반적으로 웹 브라우저에서 관리됩니다. 웹 브라우저는 쿠키를 클라이언트 컴퓨터에 저장하고, 웹 서버에 요청할 때마다 해당 쿠키를 함께 보냄으로써 웹 사이트와 상호작용할 수 있습니다. 쿠키는 웹 브라우저의 내부 메모리나 파일 시스템에 저장됩니다.

쿠키는 일반적으로 키-값 쌍으로 구성되어 있습니다. 예를 들어, 사용자의 로그인 정보, 사용자의 환경 설정, 사용자가 방문한 웹 페이지의 선호도 등을 저장할 수 있습니다.

쿠키는 다음과 같은 방식으로 관리됩니다:

  1. 쿠키 생성: 웹 서버가 클라이언트에게 쿠키를 생성하고 전송합니다. 이를 위해 서버는 HTTP 응답 헤더에 Set-Cookie 헤더를 포함하여 클라이언트에게 쿠키를 전송합니다.
  2. 쿠키 저장: 웹 브라우저는 받은 쿠키를 사용자의 컴퓨터에 저장합니다. 보통은 텍스트 파일 형태로 저장됩니다. 브라우저는 이후에 같은 웹 사이트를 방문할 때 해당 쿠키를 웹 서버로 전송합니다.
  3. 쿠키 전송: 웹 브라우저는 사용자가 웹 사이트를 요청할 때마다 해당 웹 사이트로 저장된 쿠키를 함께 전송합니다. 이를 통해 웹 서버는 사용자의 이전 상태나 활동에 대한 정보를 유지하고 활용할 수 있습니다.
  4. 쿠키 만료: 쿠키에는 만료 날짜 및 시간이 설정될 수 있으며, 이를 통해 쿠키의 수명을 제어할 수 있습니다. 만료된 쿠키는 더 이상 사용되지 않으며, 웹 브라우저에서 자동으로 삭제됩니다.

쿠키는 보안 및 개인정보 보호를 위해 사용자의 동의를 받고 설정해야 하며, 보통 민감한 정보를 저장하는 데 사용되지 않습니다. 또한, 사용자는 브라우저 설정에서 쿠키를 수락하거나 거부할 수 있습니다.

 

나 : 쿠키와 뒤로가기, 앞으로가기 버튼과 어떤 관계가 있어?

퐁규 :

쿠키와 뒤로가기(뒤로 버튼) 및 앞으로가기(앞으로 버튼) 버튼 사이에는 명백한 관계가 있습니다. 이들은 모두 웹 브라우저의 탐색 기능에 관련된 요소입니다.

  1. 뒤로가기(뒤로 버튼): 사용자가 이전에 방문한 웹 페이지로 이동하는 데 사용됩니다. 브라우저는 사용자가 웹 페이지를 방문할 때마다 해당 페이지의 URL을 탐색 히스토리에 기록합니다. 이를 통해 사용자가 이전 페이지로 쉽게 돌아갈 수 있습니다. 브라우저는 이전 페이지로 돌아갈 때 이전 페이지에서 설정된 쿠키를 보존합니다. 따라서 쿠키는 뒤로가기 버튼을 사용하여 이전 페이지로 이동할 때 유용하게 활용될 수 있습니다.
  2. 앞으로가기(앞으로 버튼): 이전에 방문한 페이지로부터 앞으로 이동하는 데 사용됩니다. 브라우저의 탐색 히스토리에 기록된 페이지 중에서 이전 페이지와 현재 페이지 사이에 있는 페이지들로 이동할 수 있습니다. 브라우저는 사용자가 앞으로 가기 버튼을 클릭하여 이전 페이지로 이동할 때 해당 페이지에서 설정된 쿠키를 유지합니다.

따라서 쿠키는 웹 브라우저의 탐색 히스토리와 함께 사용되어 이전 페이지와 다음 페이지 사이의 사용자 상태를 유지하는 데 도움이 됩니다. 사용자가 웹 페이지 간에 이동할 때 쿠키는 사용자의 상태 정보를 유지하고 사용자 경험을 개선하는 데 중요한 역할을 합니다.

 

나 : 그니까 탐색 히스토리라는 공간에 웹 브라우저는 쿠키를 보존하고, 자바스크립트의 history 객체는 브라우저의 탐색 히스토리를 관리만 하는거구나?

퐁규 :

정확히 맞습니다! 웹 브라우저의 탐색 히스토리에는 사용자가 방문한 각 페이지의 URL과 관련된 정보가 포함됩니다. 이 탐색 히스토리는 브라우저가 이전 페이지로 이동하거나 앞으로 페이지로 이동할 때 사용됩니다.

쿠키는 웹 브라우저가 사용자의 상태를 유지하는 데 사용되는 작은 데이터 조각입니다. 이러한 쿠키는 사용자가 웹 사이트를 탐색하고 상호작용할 때 생성되며, 브라우저의 탐색 히스토리에 따라 관리됩니다. 따라서 쿠키는 사용자의 브라우저 세션 동안 유지되는 정보를 저장하고, 사용자가 페이지를 이동할 때 브라우저와 함께 이동합니다.

JavaScript의 history 객체는 브라우저의 탐색 히스토리를 관리하는 데 사용됩니다. 이 객체를 사용하면 JavaScript 코드에서 뒤로가기, 앞으로가기 및 페이지 이동과 관련된 다양한 작업을 수행할 수 있습니다. 하지만 이 객체는 쿠키를 직접적으로 관리하지는 않습니다. 대신, 쿠키는 브라우저가 사용자의 상태를 유지하는 데 사용되고, history 객체는 브라우저의 탐색 히스토리를 관리하는 데 사용됩니다.

 

나 : 쿠키가 사용자가 페이지를 이동할 때 브라우저와 함께 이동한다고 했는데 그럼 쿠키는 한 브라우저에만 있는게 아니라 사용자를 따라다니면서 정보를 저장하는거구나? 그래서 구글, 다음 등 사이트마다 사용자 정보를 각자 저장하는거고?

퐁규 :

네, 맞습니다. 쿠키는 일반적으로 사용자의 브라우저에 저장되며, 특정 도메인(웹 사이트)과 연결된다는 점에서 도메인별로 저장됩니다. 사용자가 특정 웹 사이트를 방문하고 서버에서 쿠키를 생성하면, 해당 쿠키는 사용자의 브라우저에 저장되고 그 도메인에 연결됩니다. 그 후에 사용자가 동일한 웹 사이트를 다시 방문할 때 브라우저는 해당 도메인에 연결된 쿠키를 함께 서버로 전송합니다.

이렇게 함으로써 해당 웹 사이트는 사용자의 브라우저에 저장된 쿠키를 통해 사용자를 식별하고 사용자의 상태를 유지할 수 있습니다. 이러한 사용자 식별 정보를 통해 사용자 맞춤형 경험을 제공하거나 로그인 상태를 유지하는 등의 다양한 기능을 구현할 수 있습니다.

예를 들어, 사용자가 구글에 로그인하여 검색 기록을 저장하는 경우, 구글은 사용자의 로그인 상태를 식별하기 위해 쿠키를 사용합니다. 이 쿠키는 사용자가 다른 페이지를 이동하거나 브라우저를 닫고 다시 열어도 유지됩니다. 마찬가지로 다음과 같은 다른 웹 사이트도 동일한 방식으로 쿠키를 사용하여 사용자를 식별하고 사용자 정보를 저장합니다.

 

나 : 자바스크립트의 객체 저장 방식과 비슷하네

퐁규 :

맞아요! 자바스크립트의 객체 저장 방식과 쿠키의 저장 방식은 몇 가지 유사한 측면이 있습니다.

  1. Key-Value 쌍: 자바스크립트 객체는 key-value 쌍으로 구성되어 있습니다. 마찬가지로 쿠키도 이름과 값의 형태로 저장됩니다.
  2. 도메인별 저장: 자바스크립트 객체는 변수에 저장되고 해당 변수의 범위에 따라 접근할 수 있습니다. 비슷하게, 쿠키는 특정 도메인(웹 사이트)과 관련이 있으며 해당 도메인에서만 접근할 수 있습니다.
  3. 브라우저와 함께 이동: 자바스크립트 객체가 웹 페이지에서 사용되는 동안에는 브라우저와 함께 존재합니다. 비슷하게, 쿠키도 사용자의 브라우저와 함께 이동하여 사용자가 웹 사이트를 이동하고 페이지를 새로고침할 때 유지됩니다.
  4. 사용자 식별: 자바스크립트 객체는 사용자의 상태를 유지하고 사용자를 식별하는 데 사용될 수 있습니다. 마찬가지로 쿠키도 사용자를 식별하고 사용자의 상태를 유지하는 데 사용됩니다.

따라서 자바스크립트의 객체 저장 방식과 쿠키의 저장 방식은 비슷한 개념을 공유하고 있으며, 이들은 모두 상태를 유지하고 데이터를 저장하는 데 사용됩니다.

또한, JavaScript의 객체는 브라우저의 메모리에만 저장되지만, 쿠키는 브라우저의 파일 시스템이나 메모리에 저장되므로 사용자가 다시 방문할 때 유지될 수 있습니다.

 

나 : 다른 프로그래밍 언어들도 다 Key-Value쌍을 이뤄 저장돼?

퐁규 :

대부분의 프로그래밍 언어에서 데이터를 저장하는 방식 중에는 Key-Value 쌍을 사용하는 것이 일반적입니다. 이러한 방식은 데이터를 쉽게 관리하고 접근할 수 있도록 해주는 간단하고 효율적인 방법입니다. 몇 가지 예시를 살펴보겠습니다:

  1. 자바(Java): 자바에서는 Map 인터페이스를 사용하여 Key-Value 쌍을 저장합니다. HashMap, TreeMap, LinkedHashMap 등의 구현체를 통해 데이터를 저장하고 관리할 수 있습니다.
  2. 파이썬(Python): 파이썬에서는 딕셔너리(Dictionary)라는 자료구조를 사용하여 Key-Value 쌍을 저장합니다. 이를 통해 데이터를 쉽게 검색하고 관리할 수 있습니다.
  3. C#: C#에서는 Dictionary 클래스를 사용하여 Key-Value 쌍을 저장합니다. 이 클래스는 해시 테이블을 기반으로 하여 데이터를 효율적으로 관리할 수 있도록 해줍니다.
  4. Ruby: 루비(Ruby)에서는 해시(Hash)라는 자료구조를 사용하여 Key-Value 쌍을 저장합니다. 이는 파이썬의 딕셔너리와 유사한 개념입니다.
  5. PHP: PHP에서는 연관 배열(Associative Array)이라고도 알려진 배열을 사용하여 Key-Value 쌍을 저장합니다. 이를 통해 데이터를 쉽게 다룰 수 있습니다.

이러한 언어들은 Key-Value 쌍을 저장하는 방법을 통해 데이터를 구조화하고 관리하는 데 매우 유용합니다. 이 방식은 데이터베이스, 캐시, 구성 파일 등 다양한 용도로 사용됩니다.

 

나 : 그냥 그게 컴퓨터가 값을 저장하는 방식이구나

퐁규 :

네, 맞습니다! Key-Value 쌍은 컴퓨터가 데이터를 저장하고 관리하는 데 일반적으로 사용되는 방식 중 하나입니다. 이 방식은 데이터를 쉽게 찾고 접근할 수 있도록 해주는 효율적인 구조를 제공합니다.

컴퓨터에서 데이터를 저장하는 방법은 다양한데, 이 중에는 배열, 연결 리스트, 해시 테이블 등이 있습니다. Key-Value 쌍은 해시 테이블과 비슷한 개념을 가지고 있으며, 특정 키를 사용하여 해당 키에 연결된 값을 검색하거나 저장합니다.

이러한 Key-Value 쌍은 다양한 프로그래밍 언어와 데이터 구조에서 사용되며, 데이터베이스, 캐시, 구성 파일 등 다양한 용도로 활용됩니다. 데이터를 효율적으로 구조화하고 관리하는 데 있어서 매우 유용한 방식 중 하나입니다.

→ 모든 방식이 다 Key-Value쌍을 이뤄 저장되지는 않지만 프로그래밍언어 대부분이 그렇고, 여러 방법도 있다.

        // 객체
        // 유무형의 모든 사물
        // 내장객체, 사용자 정의 객체
        // 브라우져 객체(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>

작성 : 2024. 4. 19.

 

포지셔닝에 대해

• position속성 — 다른 박스 내부에 있는 박스의 배치를 정밀하게 제어할 수 있습니다. 일반 흐름에서는 정적(static) 포지셔닝이 기본값이지만, 브라우저 뷰포트에 고정하는 등 다른 값을 사용하여 요소를 다르게 배치할 수 있습니다.

출저) 

 

CSS 레이아웃 입문서 - Web 개발 학습하기 | MDN

이 문서에서는 이전 모듈에서 이미 다뤘던 CSS 레이아웃 기능, 예를 들어 다양한 display 속성값의 차이 등을 복습하고, 이번 과정에서 다룰 몇 가지 CSS 개념을 소개합니다.

developer.mozilla.org

 

<!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>

        /* position 속성 : 요소가 움직이기 위한 기준점
        1. static : 인라인, 블럭 
        - 정적 포지셔닝, 기본값으로 부여된 속성
        2. relative : 다른 요소를 기준점
        - 상대 포지셔님으로 현재 자신의 위치, 상대적으로 이동, 부모요소 중 하나를 기준점으로 삼는다.
        3. absolute : 브라우저가 기본점, 한 위치를 고정
        - 절대 포지셔님
        4. fixed : 브라우저 뷰포트를 기준
        - 고정 포지셔닝

        top, left, right. bottom 속성은 요소를 이동 */

        *{
            margin: 0; 
            padding: 0;
        }

        p{
            width: 300px;
            border: 1px solid #ccc;
            padding: 10px;
        }

        #pos1{
            position: absolute;
            left: 50px;
            top: 50px;
        }

        #pos2{
            position: absolute;
            right: 100px;
            top: 50px;
        }

        #pos3{
            position: absolute;
            left: 100px;
            bottom: 100px;
        }

    </style>
</head>
<body>
    <p id="pos1">Ex et adipisicing voluptate aliqua cupidatat nulla. Laboris est sint sit aliqua enim. Aute Lorem eu sint aute sunt proident. Do culpa consectetur elit duis laboris reprehenderit incididunt nulla. Irure exercitation tempor aliqua laboris cupidatat anim in non officia aliquip excepteur fugiat labore.</p>
    <p id="pos2">Ex et adipisicing voluptate aliqua cupidatat nulla. Laboris est sint sit aliqua enim. Aute Lorem eu sint aute sunt proident. Do culpa consectetur elit duis laboris reprehenderit incididunt nulla. Irure exercitation tempor aliqua laboris cupidatat anim in non officia aliquip excepteur fugiat labore.</p>
    <p id="pos3">Ex et adipisicing voluptate aliqua cupidatat nulla. Laboris est sint sit aliqua enim. Aute Lorem eu sint aute sunt proident. Do culpa consectetur elit duis laboris reprehenderit incididunt nulla. Irure exercitation tempor aliqua laboris cupidatat anim in non officia aliquip excepteur fugiat labore.</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>
    <style>
        p{
            width: 500px;
            height: 200px;
            background-color: rgb(245, 245, 196);
            border: 1px solid #ccc;
            line-height: 2;
        }

        #static{
            position: static;
        }

        #relative-1{
            position: relative;
        }

        #relative-2{
            position: relative;
            left: 100px;
            top:-50px;
        }

        #fixed{
            width: 100px;
            height: 100px;
            background-color: cornflowerblue;
            position: fixed;
            right: 30px;
            top: 30px;
        }


    </style>
</head>
<body>
    <p id="static">Ex et adipisicing voluptate aliqua cupidatat nulla. Laboris est sint sit aliqua enim. Aute Lorem eu sint aute sunt proident. Do culpa consectetur elit duis laboris reprehenderit incididunt nulla. Irure exercitation tempor aliqua laboris cupidatat anim in non officia aliquip excepteur fugiat labore.</p>
    <p id="relative-1">Ex et adipisicing voluptate aliqua cupidatat nulla. Laboris est sint sit aliqua enim. Aute Lorem eu sint aute sunt proident. Do culpa consectetur elit duis laboris reprehenderit incididunt nulla. Irure exercitation tempor aliqua laboris cupidatat anim in non officia aliquip excepteur fugiat labore.</p>
    <p id="relative-2">Ex et adipisicing voluptate aliqua cupidatat nulla. Laboris est sint sit aliqua enim. Aute Lorem eu sint aute sunt proident. Do culpa consectetur elit duis laboris reprehenderit incididunt nulla. Irure exercitation tempor aliqua laboris cupidatat anim in non officia aliquip excepteur fugiat labore.</p>
    <p id="fixed"></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>
    <link  rel="stylesheet" href="css/position-2.css">
</head>
<body>
    <div id="contents">
        <h1>CSS3</h1>
    </div>
</body>
</html>
*{
    box-sizing: border-box;
    margin: 0;
    padding: 0;
}

#contents{
    background-image: url("../images/bg.jpg");
    background-size: cover;
    width: 800px;
    height: 500px;
    margin: 0 auto;
    position: relative; /*부모요소가 자식의 기준점이 되려면 부모는 반드시 포지션 relative해야 함.*/
    top: 20px;
}

h1{
    color: white;
    font-size: 120px;
    position: absolute; /*자식은 부모를 기준으로 이동하기 위해서 포지션 absolute 해야한다.*/
    /*relative를 해도 된다!*/
    text-shadow: 3px 3px 0 #000;
    right: 100px;
    bottom: 100px;
}

 

 

 

  • 포지셔닝 연습문제
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link  rel="stylesheet" href="css/positionTest01.css">
</head>
<body>
    <div id="contents1">
        <div id="content1"></div>
        <div id="content2"></div>
        <div id="content3"></div>
        <div id="content4"></div>
        <div id="content5"></div>
    </div>
</body>
</html>
*{
    box-sizing: border-box;
    margin: 0;
    padding: 0;
}

#contents1{
    background-color: dimgrey;
    background-size: cover;
    width: 600px;
    height: 600px;
    margin: 0 auto;
    position: relative; /*부모요소가 자식의 기준점이 되려면 부모는 반드시 포지션 relative해야 함.*/
    top: 20px;
}     

#content1{
    background-color:aliceblue;
    width: 100px;
    height: 100px;
    position: absolute;
    right: 50px;
    bottom: 50px;
}

#content2{
    background-color:aliceblue;
    width: 100px;
    height: 100px;
    position: absolute;
    right: 50px;
    top: 50px;
}

#content3{
    background-color:aliceblue;
    width: 100px;
    height: 100px;
    position: absolute;
    left: 50px;
    top: 50px;
}

#content4{
    background-color:aliceblue;
    width: 100px;
    height: 100px;
    position: absolute;
    left: 50px;
    bottom: 50px;
}

#content5{
    background-color:aliceblue;
    width: 100px;
    height: 100px;
    position: absolute;
    left: 250px;
    bottom: 260px;
}

원하는 모양으로 출력이 되었다! (완.)

 

 

동적 효과

      /* transform 속성값 */

         밀기 
         
         #movex:hover{
            transform: translateX(50px);
         }

         #movey:hover{
            transform: translateY(50px);
         }

         #movexy:hover{
            transform: translate(50px, 50px);
         }
         
         
         크기변화
         
          #movex:hover{
            transform: scaleX(2);
         }

         #movey:hover{
            transform: scaleY(2);
         }

         #movexy:hover{
            transform: scale(0.7);
         }
         
         
         돌리기
         
         #movex:hover{
            transform: rotate(40deg);
         }

         #movey:hover{
            transform: rotate(-40deg);
         }

 

 

예제코드 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>
        <style>
            .box {
                margin: 20px auto;
                width: 100px;
                height: 100px;
                background-color: #07f;
                border: 1px solid #222;
                transition-property: width, height;
                transition-duration: 3s, 1s;
            }

            .box:hover {
                width: 200px;
                height: 120px;
            }
        </style>
    </head>
    <body>
        <div class="box"></div>
    </body>
</html>

 

 

예제코드 2) 돌리고 색깔 바꾸고

<!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>
        .box {
            margin: 50px auto;
            width: 100px;
            height: 100px;
            background-color: #07f;
            border: 1px solid #222;
            transition: 2s;
        }

        .box:hover {
            width: 200px;
            height: 200px;
            background-color: thistle;
            transform: rotate(270deg)
        }
        
    </style>
</head>
<body>
    <div class="box"></div>
</body>

 

 

예제코드 3) 마우스를 올리면 배경색과 글자색이 바뀜

그 안에서 선택적으로 태그를 가지고 오는 방법 알아보기 (last-child 를 쓰는 법)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>움직임 표현하기</title>
    <style>
        *{
            box-sizing: border-box;
            color: white;
        }

        .top-menu{
            width: 606px;
            height: 35px;
            margin: 50px auto;
            padding: 0;
            list-style: none;
            background-color: dimgrey;
        }

        .top-menu li{
            float: left;
            border-right: 1px solid rgba(255, 255, 255, 0.539);
        }

        .top-menu li a:link{
            color: springgreen;
            text-decoration: none;
            text-align: center;
            display: block;
            width: 100px;
            height: 35px;
            line-height: 35px;
        }

        .top-menu li a:visited{
            color: rgb(128, 195, 162);
        }
           
        .top-menu li:not(:last-child) a:hover{
            background-color: rgb(247, 149, 131);
            color: white;
        }

        .top-menu li:last-child a:hover{
            background-color: tomato;
            color: white;
        }


    </style>
</head>
<body>
    <ul class="top-menu">
        <li><a href="#">메뉴1</a></li>
        <li><a href="#">메뉴2</a></li>
        <li><a href="#">메뉴3</a></li>
        <li><a href="#">메뉴4</a></li>
        <li><a href="#">메뉴5</a></li>
        <li><a href="#">메뉴6</a></li>
    </ul>
</body>
</html>

 

 

배운것을 종합해 만들어 보자

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>CSS3 애니메이션</title>
  <link rel="stylesheet" href="css/product.css">
</head>
<body>
   <div id="container">
    <h1>신상품 목록</h1>
      <ul class="prod-list">
      <li>
        <img src="images/prod1.jpg">
        <div class="caption">
          <h2>상품 1</h2>
          <p>상품 1 설명 텍스트</p>
          <p>가격 : 12,345원</p>
        </div>
      </li>
      <li>
        <img src="images/prod2.jpg">
        <div class="caption">
          <h2>상품 2</h2>
          <p>상품 2 설명 텍스트</p>
          <p>가격 : 12,345원</p>
        </div>
      </li>
      <li>
        <img src="images/prod3.jpg">
        <div class="caption">
          <h2>상품 3</h2>
          <p>상품 3 설명 텍스트</p>
          <p>가격 : 12,345원</p>
        </div>
      </li>
    </ul>
   </div>
</body>
</html>
#container{
    width: 1000px; /* 전체 크기 조정 */
    margin: 20px auto; /* 배경 여백 얼마나 띄울지 */
}

h1{
    text-align: center; /* 가운데 정렬 */
}

.prod-list{
    list-style: none; /* li 태그에서 자동으로 생기는 동그라미가 없어짐 */
    padding: 0;
}

.prod-list li{ /* 이미지와 내용 부분 */
    float: left; /* 가로 정렬 */
    padding: 0;
    margin: 10px; /* 10px 여백 지정 */
    overflow: hidden; /* 이미지 가로 세로 길이보다 넘치는 부분을 감추기 위해 작성 */
    position: relative; /* 부모요소가 자식의 기준점이 되려면 부모는 반드시 포지션 relative해야 함. */
} 

.prod-list img{
    margin: 0;
    padding: 0;
    float: left; /* 자식이 float 할 때 높이가 무너지는 일이 발생, 때문에 부모도 float을 줌 */
    z-index: 5; /* 나중에 이미지가 많아졌을 때 겹치는 것을 방지, 제일 큰 인덱스 번호가 앞으로 나오게 됨 */
}

.prod-list .caption{ /* 내용 */
    position: absolute; /* 자식은 부모를 기준으로 이동하기 위해서 포지션 absolute 해야한다. */
    top: 200px;
    width: 300px;
    height: 200px;
    padding-top: 20px;
    background: rgba(0, 0, 0, 0.6);  
    opacity: 0; /* 투명도 */
    transition: all 0.6s ease-in; /* ease-in 만들어질 때 속도와 사라질 떄 속도 같게 */ 
    z-index: 10;
}

.prod-list li:hover .caption{
    opacity: 1; /* 마우스를 올렸을 때의 투명도 */
    transform: translateY(-200px);
}

.prod-list .caption h2, .prod-list .caption p{
    color: white;
    text-align: center;
}

 

실행화면)

 

✔️ 자식이 float 할 때 높이가 무너지는 일이 발생함, 해결 방법 3가지

1. 오버플로우

2. 하이트 속성(높이값조절)

3. 부모도 float

4. 아니면 부모도 overflow: hidden

 

 

+ 추가적으로 내가 공부한 것들

cursor 속성

 

개요

cursor 속성을 이용하면 해당 태그 위에 위치하는 마우스 커서의 모양을 바꿀 수 있습니다.

  • auto: 자동
  • default: 기본값 (화살표)
  • pointer: 손가락 모양 (클릭 가능한 버튼)
  • wait: 로딩

 

출저)

 

CSS cursor 속성 - ofcourse

개요 cursor 속성을 이용하면 해당 태그 위에 위치하는 마우스 커서의 모양을 바꿀 수 있습니다. auto: 자동 default: 기본값 (화살표) pointer: 손가락 모양 (클릭 가능한 버튼) wait: 로딩 등 다양한 종류

ofcourse.kr

 

 

transition

마우스를 올렸을 경우 부드러운 효과를 주고 싶을 경우에는 transition 속성을 이해 하면 됩니다.

	ul>li>a{
		transition: 0.4s ease;
		-moz-transition: 0.4s ease;			/* 파이어폭스*/
		-o-transition: 0.4s ease;			/* 오페라 */
		-ms-transition: 0.4s ease;			/* 익스플로어 */
		-webkit-transition: 0.4s ease;}		/*모든 브라우저 */

 

작성 : 2024. 4. 18.

 

선택자들

 

  • 하위선택자
 div p,h1 {
            color: blue;
        }

       div h1 {
            color: blueviolet;
        }

       div p {
            color: rgb(200, 78, 169);
        }

 

  • 자식선택자
	div > p,h1 {
                color: rgb(53, 152, 79);
            }

 

  • 인접선택자
            /* 첫번째 동생찾기 */
            h1 + p { 
                color: chartreuse;
            }

            /* 동생들 찾기 */
            h1 ~ p {
                color: cornflowerblue;
            }

 

  • 속성선택자
      		a[href] {
                color: rgb(241, 72, 72);
            }

            a[target="_blank"] {
                color: rgb(229, 142, 202);
            }

            [class ~= "button"] {
                color: rgb(103, 150, 207);
            }
            
            /* '속성의 이름이 eng로 시작하는' 이라는 의미 */
            a[title ^= "eng"] {
                color: cadetblue;
            }

            /* '속성의 이름이 ese로 끝나는' 이라는 의미 */
            a[title $= "ese"] {
                color: red;
            }

            /* '속성의 이름에 e가 들어가는' 이라는 의미 */
            a[title *= "e"] {
                color: darksalmon;
            }

 

  • 가상선택자
			/* 가상클래스와 가상요소 */
            /* 이것을 사용하지 않으면 해결하기 쉽지않은 것들이 있어 잘 알아둬야 함. */
            a:link{
                text-decoration: none;
            }
            /* 가상선택자 hover */
            a:hover{
                text-decoration: underline;
            }

            a:active{
                color: aqua;
            }

            a:visited{
                color: darkgray;
            }

            p:hover{
                color: rgb(61, 165, 130);
            }

            ul li input:checked + label{
                color: gold;
            }

 

  • 구조선택자에 대해서
            /* 구조선택자 */
            /* 특정위치에 있는 요소(태그)를 찾는 방법 */
            /* 특정위치에 자식요소 선택자를 찾는 방법 */
            .contents :nth-child(3) {
                color: cadetblue;
            }

            .contents p:nth-of-type(3) {
                color: rgb(26, 215, 26);
            }

            ul li{
                list-style-type: none;
                float: left;
            }

            /* 예를 들어 짝수만 선택해서 디자인해야한다 했을 때 구조를 이용해 선택할 수 있는 방법 */
            ul li:nth-child(2n) {
                background-color: blue;
            }

            ul li:nth-child(2n+1) {
                background-color: rgb(160, 160, 248);
            }

 

 

  • 구조선택자

코드 :

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>가상 요소</title>
        <style>
            .container {
                width: 960px;
                margin: 0 auto;
            }
            ul li {
                margin: 15px;
            }

            li.new2::after {
                content: "NEW!!";
                font-size: x-small;
                padding: 2px 4px;
                margin: 0 10px;
                border-radius: 2px;
                background: #f00;
                color: #fff;
            }

            /* li.new에 이런 내용이 있으면 after를 적용해라 */
            li.new::before {
                content: "NEW!!";
                font-size: x-small;
                padding: 2px 4px;
                margin: 0 10px;
                border-radius: 2px;
                background: #f00;
                color: #fff;
            }

        </style>
    </head>

    <body>
        <div class="container">
            <h1>제품 목록</h1>
            <ul>
                <li class="new">제품 A</li>
                <li class="new2">제품 B</li>
                <li class="new2">제품 C</li>
                <li class="new">제품 D</li>
            </ul>
        </div>
    </body>
</html>

 

 

폰트 속성에 대하여

CSS는 단위를 붙여주지 않으면 실행이 안됨!

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>font 속성</title>
        <link rel="preconnect" href="https://fonts.googleapis.com">
        <link
            rel="preconnect"
            href="https://fonts.gstatic.com"
            crossorigin="crossorigin">
        <link
            href="https://fonts.googleapis.com/css2?family=Kirang+Haerang&display=swap"
            rel="stylesheet">
        <style>

            body {
                /* 절대크기 : px, pt */
                /* 상대크기 : %, em */
                font-size: 24px;
            }

            h1 {
                /* 색 지정 방식 4가지
                1. 직접 색을 넣어주기 
                2. 16진수 표기법
                3. rgb()함수 사용법
                4. rgma() rgv에 투명도 추가   */
                font-family: Arial, Helvetica, sans-serif;
                /* color: rgb(186, 99, 206); */
                /* color:#86E57F */
                color:rgb(94, 163, 107,0.4); 
                /* 레드, 그린, 블루, 투명도 */
            }

            p {
                font-weight: bold;
                font-style: italic;

            }

            .kirang-haerang-regular {
                font-family: "Kirang Haerang", system-ui;
                font-weight: 400;
                font-style: normal;
            }

            h2 {
                font-family: "Kirang Haerang", system-ui;
                font-weight: 400;
                font-style: normal;
            }
        </style>
    </head>
    <body>
        <h1>폰트를 넣고, 다루는 법</h1>
        <p>이걸 웹폰트라고 합니다</p>
        <h2>어디에서나 동일한 글씨체로 볼 수 있어요</h2>
        <h2 class="kirang-haerang-regular">클래스명을 글꼴명으로 바꾸기</h2>
    </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>
        .link1 {
            text-decoration: none;
        }
        .link2 {
            text-decoration:overline;
        }
        .link3 {
            text-decoration:line-through;
        }
        .link4 {
            text-decoration:underline;
        }

    </style>
</head>
<body>
    <a href="http://WWW.naver.com" class="link1">밑줄선을 없애준다</a><br>
    <a href="http://WWW.naver.com" class="link2">글씨위에 선을 긋는다</a><br>
    <a href="http://WWW.naver.com" class="link3">글씨에 선을 관통한다</a><br>
    <a href="http://WWW.naver.com" class="link4">밑줄선을 긋는다</a><br>
</body>
</html>

 

 

  • 목록의 모양 바꾸기
        ul {
            /* 목록의 모양을 없애는 태그 */
            list-style-type:none;
        }

        ol {
            /* 목록의 모양을 지정하는 태그 */
            list-style-type:lower-roman;
        }

 

 

  • 테이블을 꾸미는 방법
table,td {
            border: 1px solid blue;/* border: 굵기, 선종류, 선의 색깔; */
            width: 250px;
            height: 80px;
            border-collapse: collapse;
            caption-side: bottom;
        }

 

디자인 연습에 들어가기 앞서,

디자인 할 때 큰 클을 먼저 잡아두고, 디자인에 들어가야 함.

내용 → 코드분석 → 크기 → 정렬 등 배치가 끝나는 것이 첫 번째!

 

 

  • 디자인 연습문제

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>맛좋은사과팔아요</title>
    <style>
        #container{
            width: 650px;
            margin: 0 auto;
            padding: 5px;
        }

        #check{
            width: 640px;
            border: 1px solid #ccc;
        }

        h1{
            color: white;
            background-color: rgba(0, 0, 0, 0.678);
            font-size: 1em;  /* 1em == 100% */
            margin: 0;
            padding: 10px;
        }

        h2{
            color: rgb(244, 51, 51);
            font-size: 1.5em;
            text-align: center;
        }

        p{
            text-align: center;
            font-size: 1.2em;
            line-height: 2em;
            font-weight: bold;
        }

        .accent{
            color: rgb(84, 84, 239);
        }

        .smalltext{
            font-size: 0.7em;
            color: white;
            background-color: darkgray;
            padding: 7px;
        }

    </style>
</head>
<body>
    <div id="container">
        <img src="images/top.jpg" alt="가정용 꿀사과 - 흠집이 있고 약간은 못생겼지만 맛과 영양은 그대로입니다. 질좋은 사과를 저렴하게 즐겨보세요">      
        <div id="check">
           <h1>확인하세요</h1>
           <h2>주문 및 배송</h2>
           <p><span class="accent">오후 2시 이전</span> 주문건은 당일 발송합니다<br>
           2시 이후 주문건은 다음날 발송합니다(주말 제외)</p>
           <hr>
           <h2>교환 및 환불</h2>
           <p>불만족시 <span class="accent">100% 환불</span>해 드립니다<br>
           고객센터로 전화주세요</p>
           <hr>
           <h2>고객센터 </h2>
           <p>0000-0000<br>
           <span class="smalltext">상담시간 : 오전 9시 ~ 오후 6시 (토/일, 공휴일 휴무)</span></p>
        </div>
     </div>
</body>
</html>

 

 

  • 박스모델에 대하여

                                                                                                                                                  높이는 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>
    <style>
        /* div { */
            /* border: 2px dashed #000; */
            /* border-color:aquamarine */
            /* border-top: 2px; */
            /* border-style:solid; */ */
        /* } */

        /* .box1{
            box-sizing: border-box;
            width: 400px;
            height: 100px;
            border-top: 2px solid #b32a2a;
        }

        .box2{
            width: 50%;
            height: 100px;
            border-top: 2px solid #b32a2a;
        } */

        /* .round {
            border-radius: 200px 200px 200px 0;
        } */

        div {
            width: 250px;
            height: 150px;
        }

        .box1{
            background-color: rgb(151, 240, 163);
            margin: 20px 100px;
            padding: 20px;
        }

        .box2{
            background-color: rgb(249, 234, 246);
            margin: 50px;
            padding: 50px;
        }

        .box3{
            box-sizing: border-box;
            background-color: rgb(193, 235, 247);
            margin: 30px;
            padding: 20px 60px;
        }

    </style>
</head>
<body>
    <div class="box1">box1</div>
    <div class="box2">box1</div>
    <div class="box3">box1</div>

    <!-- <image src="images/cat.jpg"></image>
    <br>
    <image src="images/cat.jpg" class="round"></image> -->
    <!-- <div class="box1"></div>
    <div class="box2"></div> -->
</body>
</html>

 

 

 

 

display에 대해 알아봅니다

 

 

  • display 속성과 float

아래 화면은 display 속성에서 인라인과 블록의 차이를 알기 위해 구현해본 것

<!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>
        /* displsy속성
        1. 요소를 화면에 숨기거나 나타냅니다
        2. 요소의 성질을 변경
        - inline
        - inline-block
        - block
         */

        /* 요소(배체속성)
        1. 인라인 요소 : 내용의 길이가 요소의 기본 크기
        - span, img, input ... 
        - width, height, margin(좌우는 가능), padding(좌우는 가능) 등 속성 사용 불가
        2. 블럭 요소 : 무조건 한 행을 크기로 사용한다 
        - p, h1, div ... */

        /* 대표적인 블럭태그 */
        p {
            width: 200px;
            height: 200px;
            background-color: rgb(219, 246, 196);
            display: block;  /* none */
        }

        /* 대표적인 인라인태그 */
        span {
            display: inline-block;  /* 블록으로 처리하면 다 바뀔 수 있음 */
            width: 200px;
            height: 200px;
            margin: 50px 50px;
            background-color: antiquewhite;
        }

    </style>
</head>
<body>
    <p>내용1</p>
    <span>내용2</span>
    <span>내용3</span>
    <p>내용1</p>
</body>
</html>

 

 

  • float 속성

아래는 float 속성을 알기 위한 예제

       /* float 속성이란 
        - 배치하는 속성
        1. 요소를 왼쪽 또는 오른쪽으로 배치
        - left, right 
        2. 인라인하게 만든다
        */

        /* float 속성이 정의한 방향으로 딸려 올라간다. */
        /* 원래 위치를 유지하려고 하면 딸려올라가는 대상에 clear 속성을 사용하자 */
        img{
            float: right;
        }

        p{
            clear: both;
        }
        
        ul li {
            list-style: none;
            float: left;
            border: 1px solid #000;
            padding: 10px;
            margin: 3px;
        }

 

홈페이지 구성을 하다 끝남,,

지금 하는 방법은 옛날 방법이라 추가적으로 공부할 필요가 있을 듯,,

포지셔닝에 대해 알아보기

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

UIUX _국비과정 0422  (0) 2024.05.30
UIUX _국비과정 0419  (0) 2024.05.30
UIUX _국비과정 0417 [HTML + CSS]  (0) 2024.05.29
UIUX _국비과정 0416  (1) 2024.05.29
UIUX _국비과정 0415  (0) 2024.05.29

+ Recent posts