• Numbers

자바스크립트에서는 숫자를 이용해서 많은 연산이 가능하다.

var num = 1;
console.log(num); // 1

var num2 = num * 2;
console.log(num2); // 2

// %는 나머지를 구해주는 연산자이다.
var remainder1 = 30%4;
console.log(remainder1); // 2

var remainder2 = 100%5;
console.log(remainder2); // 0

// 알다시피 곱셈과 나눗셈이 더하기, 빼기보다 우선시로 실행된다.
var result = 3 + 7*2;
console.log(result); // 17

// 비교 또한 가능하다.
var result = 3 > 7;
console.log(result); // false

var result = 3 >= 1;
console.log(result); // true

var one = 5;
var two = 5;
console.log(one === two); // true

// 코드 길이를 줄일 수 있는 간단한 연산자들
var a = 1;
a += 1; // a = a + 1;
console.log(a); // 2

a += 2; // 4
a -= 1; // 3
a *= 3; // 9
a /= 3; // 3

a++; // 4
a--; // 3
a** // 실행 안됨
a// // 실행 안됨

// 유효하지 않은 연산
var a = 0;
var b = 0;
var c = a/b;
console.log(a/b); // NaN

// NaN인지 판별해주는 함수
console.log(isNaN(c)); // true

// 연산자가 어떤 종류의 값인지 판별해주는 연산자
var a = typeof 10; // 10의 유형이 무엇이느냐 -> number -> a = number
console.log(a); // number

 

  • String, 문자열
var a = typeof 3;
console.log(a); // number

var number = 30;
var something = typeof number; // 30의 유형이 something에 저장되므로 something은 "number"이다.
console.log(number === something); // false
console.log(number == something); // false

큰따옴표, "" 혹은 작은 따옴표, ''로 표현되는 문자들을 String, 문자열이라고 한다. 위에서 3의 유형은 number이고 console.log로 a를 확인했을 때 문자열인 "number"가 출력된다.

 

something에는 30이라는 값이 저장된 number의 유형이 대입되는데, 30의 유형은 number라는 문자열이다. 따라서 console.log로 확인했을 때 30이라는 숫자가 저장된 number와 "number"라는 문자열이 저장된 something의 유형 자체부터 다르므로 false가 뜬다. 값 또한 30과 "number"로 다르기 때문에 ==으로 비교해도 false가 뜬다.

 

 - 문자열 붙이기

var s1 = "something";
var s2 = "else";
var result = s1 + s2;

console.log(result); // "somethingelse"

문자열을 더했을 때는 위의 결과처럼 서로 '붙여진다'.

 

 - 문자열 비교

var s1 = "abc";
var s2 = "abc";

var result = s1 === s2;
console.log(result) // true;

var s3 = "abc "; // 공백 포함
var s4 = "abc"; // 공백 미포함

var result2 = s3 !== s4; // !==는 서로 다른지 물어보는 연산자이다.
console.log(result2); // 서로 다르므로 true

 

 - 문자열 길이

var str1 = "abc";
console.log(str1.length); // 3

var str2 = "   "; // 공백 3칸
console.log(str2.length); // 3

console.log("graph-ql".length); // 8

 

 - 문자열 인덱스

var str = "abcdef";
console.log(str[0]); // "a"

console.log("cde"[2]); // "e"

인덱스는 위치를 나타낸다고 보면 된다. 인덱스는 항상 0부터 시작하므로 abcdef의 0번째는 a가 되고, cde의 2번째는 e가 된다.

 

 - 문자열 메서드

'6'.repeat(3); // 문자열 '6'을 3번 반복해 붙인다. '666'
'hi jun'.includes(' ju'); // ' ju'을 포함하고 있는가? true
'what are you doing?'.startsWith('what '); // 'what '으로 시작하는가? true
'I am doing FiNe'.endsWith('iNe'); // 'iNe'로 끝나는가? true
'Are you sure?'.indexOf(' yo'); // ' yo'가 시작되는 index는? 3
'Are you sure?'.indexOf('z'); // z가 포함되지 않다. indexOf는 이럴 때 -1을 반환한다.
'Are you sure?'.indexOf('are'); // indexOf는 대소문자를 구분한다. 따라서 이때도 -1을 반환한다.
'Yeah I am sure'.slice(2, 5); // 2번째와 5번째(5번째는 미포함)사이의 값들을 반환한다. 'ah '
'I?doubt?that'.split('?'); // ?을 기준으로 분리한다. (3) ['I', 'doubt', 'that']
'Why would you doubt my word?'.split(''); // ''안의 값들을 하나하나씩 분리한다.
// (28) ['W', 'h', 'y', ' ', 'w', 'o', 'u', 'l', 'd', ' ', 'y', 'o', 'u', ' ', 'd', 'o', 'u', 'b', 't', ' ', 'm', 'y', ' ', 'w', 'o', 'r', 'd', '?']
'You hAve BeEn DiSHonest'.toLowerCase(); // 소문자로 반환한다. 'you have been dishonest'
'No wAy!'.toUpperCase(); // 대문자로 반환한다. 'NO WAY!'

 

  • Types, 유형들

자바스크립트에서 다뤄지는 값들의 종류는 총 7가지가 있다.

 

 - String, 문자열

var s1 = 'ju';
var s2 = 'n';
console.log(s1 + s2); // jun

console.log((s1 + s2)[1]); // u

var s3 = s1 + s2;
console.log(s3[2]); // n

따옴표를 이용해 표현하고, 문자열끼리는 더해질 수 있다.(정확히는 붙여지는 것)

 

또한 index를 사용해서 문자열의 각 부분에 접근할 수 있다.

 

 - Number, 숫자

덧셈과 뺄셈, 곱셈과 나눗셈이 가능하며 연산 우선 순위 또한 우리가 아는 바와 같다. Infinity나 -Infinity로 무한대 또한 표현 가능하다.

var i = Infinity;
console.log(typeof i); // number
console.log(i/1); // Infinity

 - Boolean, 논리값

true와 false 두 가지 값이 있다.

 

 - Undefined, 정의되지 않은 값

 

 - Null, 없음

undefined와 null이 '없음'을 나타내는 용도로 쓰인다는 점이 비슷해도, 대입한 적이 없는 변수(undefined)와 의도적으로 '없음'을 나타내는 경우(null)는 구분되어 사용된다.

 

 - Object, 객체

배열이나 함수와 같은 객체. 무언가로 이루어진 집단이라고 표현해도 될지 모르겠다.

const person = []; // 빈 객체 생성
person.name = 'jun'; // 빈 객체 내에 key와 value 생성(name이 key이고, 'jun'이 value다)
console.log(person.name); // 'jun'
console.log(person); // [name: 'jun']
console.log(typeof person); // object

const list = [1, 2, 3];
console.log(typeof list); // object

function foo() {};
console.log(typeof foo); // function

 

 

Javascript는 웹 페이지의 컨텐츠가 바뀌는 등 동적인 움직임을 줄 때 주로 사용된다.

 

  • Variable

어떠한 값을 저장하여 불필요한 중복을 줄여주고 재사용할 수 있다. 이것을 가능케 하는 것이 변수(Variable)이다.

var one = 1;
var something = function hello() {};
var array = [1, 2, 3];
var name = 'Jun';

위와 같이 숫자, 함수, 배열, 문자열 등을 넣을 수 있다. 자바스크립트에서 '='는 오른쪽에 위치한 값을 왼쪽 변수에 대입하겠다는 의미이다. 자바스크립트에서 변수로 선언하기 위해서는 위와 같이 앞에 var(혹은 const)를 붙여주어야 한다.

 

  • Identifiers
var jun; // valid
var _jun; // valid
var $jun; // valid
var 7jun; // invalid
var if; // invalid
var for; // invalid

변수를 선언할 때 우리가 지어주는 이름을 Identifier라고 칭한다. 자바스크립트에서는 Identifier를 정할 때 몇 가지 규칙이 있다.

 

숫자, 알바펫, $, _가 포함될 수 있다. 허나 숫자로 시작해서는 안된다.(var 7jun; // invalid) 그리고 for, if, function과 같이 이름만으로 자바스크립트에서 어떠한 기능을 수행 중인 단어(예약어)는 Identifier로 사용할 수 없다.

 

참고로 위와 같이, 대입 연산자 없이 그저 변수를 선언하기만 하면 변수에는 undefined라는 값이 설정된다.

 

  • Boolean

Boolean, 불린이라고 발음하며 true(참) 혹은 false(거짓) 값만을 가질 수 있는, 참 혹은 거짓으로 논리를 따지는 논리적인 데이터 유형이다. 기호 논리학 분야의 선구자인 영국 수학자, 조지 불의 이름을 따와 만들어졌다.

var t = true;

 

  • null & undefined

null과 undefined 모두 자바스크립트에서 '없음'을 표현할 때 사용된다. 비슷한 의미이지만 다른 용도로 사용된다.

var nothing1 === null;
console.log(nothing1 === null); // true

var nothing2 === undefined;
console.log(nothing2 === undefined); // true;

console.log(nothing1 === nothing2); // false;

위와 같이 null과 undefined가 같냐고 자바스크립트로 물었을 때 false가 뜨는 것을 알 수 있다. 이는 자바스크립트에서 둘을 다르게 인식한다는 것이다. 당연히 다르게 쓸거니까 이름을 다르게 만들지 않았을까.

 

undefined는 말처럼 정의되지 않았다는 뜻으로 우리가 어떠한 값도 지정해주지 않았을 때 사용된다. 값이 대입되지 않은 상태인 것이다.

var k;
console.log(k); // undefined

var k = 'something'이 아닌, 그저 var k;로 끝났기 때문에 우리는 k에게 아무런 값도 지정해주지 않은 셈이다. 따라서 console.log로 k를 확인해보면 정의되지 않았다는 뜻인 undefined가 뜬다.

 

굳이 var k = undefined;를 해주지 않아도 var k;만으로 undefined가 되니 var k = undefined;라고 쓰진 않는다.

var k;
console.log(k); // undefined

var l = undefined;
console.log(l); // undefined

undefined와 비슷하지만 다르게도, null은 '의도적으로! 값이 없음'을 표현할 때 사용된다.

var obj = {
	name: 'jun'
};

// 위 obj를 활용한 작업 실행

// 더 이상 obj를 사용하지 않을 것이기 때문에 obj를 의도적으로 '없음'으로 만듦

obj = null;

인터넷 쇼핑몰에서 자신이 사고 싶은 것들을 장바구니에 담아 구입하고 난 뒤, 장바구니를 클릭했을 때 '없음'이 뜨는 예가 바로 null을 활용한 것이 아닐까?

'프로그래밍 > 바닐라코딩_Prep Guide' 카테고리의 다른 글

Step 2. JavaScript(3) - Truthy and Falsy + Logical Operator  (0) 2021.11.25
Step 2. JavaScript(2)  (0) 2021.11.25
Step 1. Google Clone  (0) 2021.11.14
Step 1. CSS  (0) 2021.11.02
Step 1. HTML  (0) 2021.10.29

배웠으면 적용을 해보는 것이 지식을 몸에 베게하는 가장 좋은 습관인 것 같다. Step 1의 마지막 내용으로 Google Clone이 있는데, Google 홈페이지가 Naver 처럼 복잡하지 않고 간단하다보니 비교적 배운 지식을 써먹기 좋을 것 같다.

 

일단 틀만 잡아보았다.

조금 어거지인 면도 있는 것 같은데 일단 시멘틱 구조를 최대한 적용해보고자 해당 사진처럼 구조를 잡았다. ㅎㅎㅎ

 

  • header - HTML
    <header>
      <div class="icon">
        <a href="#" class="icons gmail">Gmail</a>
        <a href="#" class="icons image">이미지</a>
        <a href="#" class="icons"
          ><img src="application.png" id="application"
        /></a>
        <button class="icons user">Jun</button>
      </div>
    </header>

 

gmail, icon, application, user를 '같이' 오른쪽 상단에 나란히 배치하기 위해 class="icon"의 div 태그에 포함시켰다. application은 flaticon에서 따왔다.

  •  header - CSS
      .icon {
        display: flex;
        justify-content: flex-end;
        margin-top: 10px;
        margin-right: 15px;
      }

      .icons {
        margin: 10px;
      }

      .gmail,
      .image {
        font-size: 13px;
        text-decoration: none;
        color: black;
      }

      .gmail:hover,
      .image:hover {
        text-decoration: underline;
      }

      #application {
        width: 20px;
      }

      .user {
        border: 1px solid white;
        border-radius: 100px;
        background-color: red;
        color: white;
        height: 35px;
        width: 35px;
        margin-top: 5px;
      }

 

 

class="icon"인 div 태그에 flex를 부여하고 justify-content: flex-end;를 통해 오른쪽 상단에 위치하도록 하였다. class="icons"인 div 태그들에게는 margin: 10px;를 줘서 서로 일정 간격 떨어지게 해주었다. gmail과 image는 링크 태그이지만 마우스를 갖다대지 않은 상태에선 밑줄이 안보기이게 text-decoration: none;으로 해주었다. 마우스를 갖다댔을 때는 밑줄이 생기기에 :hover를 이용하여 text-decoration: underline;을 부여해주었다.

 

개인적으로 user 모양(Jun의 글자가 들어간 빨간색 원 모양 icon)을 맞추는 것이 가장 어려웠다. 원의 특성상 지름이 어디서든 같기 때문에 height와 width를 똑같이 35px로 맞추고 border-radius: 100px;로 모서리를 없애 원을 만들었다.

 

  • section - HTML
        <section>
          <article>
            <div class="google-logo">
              <img
                src="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"
              />
            </div>
            <div class="searching-bar">
              <i id="magnifier"><img src="magnifier.png" /></i>
              <input type="search" />
              <i id="keyboard"><img src="keyboard.png" /></i>
              <i id="microphone"><img src="microphone.png" /></i>
            </div>
            <div class="rest">
              <button>Google 검색</button>
              <button>I'm Feeling Lucky</button>
            </div>
            <div class="covid">
              <a href="#" style="text-decoration: none"
                >가까운 코로나19 선별진료소를 확인하세요</a
              >
            </div>
            <div class="language">
              Google 제공 서비스 :
              <a href="#" style="text-decoration: none">English</a>
            </div>
          </article>
        </section>​
     

class="searching-bar"인 div 태그 안에 돋보기, input(search type), 키보드, 마이크를 넣었다.

 

  • section - CSS
      .google-logo {
        margin-top: 240px;
        text-align: center;
      }

      .searching-bar {
        margin-top: 20px;
        text-align: center;
      }

      .searching-bar img {
        width: 20px;
      }

      .searching-bar input {
        border-radius: 45px;
        width: 550px;
        height: 40px;
      }

      #magnifier {
        position: relative;
        top: 5px;
        left: 40px;
      }

      #keyboard,
      #microphone {
        position: relative;
        top: 5px;
        right: 65px;
      }

      #keyboard {
        right: 70px;
      }

      .rest,
      .covid,
      .language {
        margin-top: 25px;
        text-align: center;
        font-size: 13px;
      }

      .rest {
        display: flex;
        justify-content: center;
      }

      .rest button {
        border: none;
        border-radius: 5px;
        height: 40px;
        margin: 5px;
      }

google-logo는 header와 240px 만큼의 상단 마진이 남게 해주어 차이를 주었고 text-align을 통해 중앙에 배치하였다. searching-bar 또한 text-align을 통해 중앙에 배치시켰고, searching-bar img { width: 20px; }를 통해 class="searching-bar"인 div 태그 안의 img 태그들의 크기는 20px로 통일시켰다.(돋보기, 키보드, 마이크의 크기가 20px이 된 셈이다) 그리고 돋보기와 키보드, 마이크에 position: relative;를 부여해 searching-bar 안에 들어오도록 조정했다. 이 때 이 3개의 이미지는 부모 태그인 <div class="searching-bar">를 기준으로 위치가 정해진다.

 

  • footer - HTML
    <footer>
      <div class="country">대한민국</div>
      <div class="realfooters">
        <div class="realfooter">
          <button>Google 정보</button>
          <button>광고</button>
          <button>비즈니스</button>
          <button>검색의 원리</button>
        </div>
        <div class="realfooter2">
          <button>개인정보처리방침</button>
          <button>약관</button>
          <button>설정</button>
        </div>
      </div>
    </footer>

Google 정보, 광고, 비즈니스, 검색의 원리 이 4개와 개인정보처리방침, 약관, 설정은 이 3개는 각각 오른쪽, 왼쪽에 배치되기 때문에 나누어서 div 태그에 담아주었다.(realfooter : 4개, realfooter2 : 3개)

 

  • footer - CSS
      footer {
        background-color: rgb(241, 238, 238);
        width: 100%;
        position: fixed;
        bottom: 0;
        left: 0;
      }

      .country {
        border-bottom: 1px solid rgb(214, 211, 211);
        padding-top: 15px;
        padding-bottom: 15px;
        padding-left: 15px;
      }

      .realfooters {
        padding-top: 15px;
        padding-bottom: 15px;
        padding-left: 10px;
        display: flex;
      }

      .realfooters button {
        border: none;
      }

      .realfooters button:hover {
        text-decoration: underline;
      }

      .realfooter2 {
        position: absolute;
        right: 15px;
      }

footer가 화면에서 맨 밑에 나오도록 position: fixed;를 부여하고 bottom: 0;와 left: 0;을 부여했다. 3개의 항목으로 이루어진 realfooter2는 display: flex;가 부여되어 있기 때문에 realfooter와 나란히 배치되고 position: absolute와 right: 15px 를 통해 오른쪽에 배치된다.

 

완성본!

생각보다 비슷하게 만든 것 같다!

 

하지만 해결하지 못한 문제점도 있다.

보다시피 크기가 줄어들면 searching-bar 안의 이미지들이 엇나가기 시작한다... CSS를 좀 더 이용해보고 언젠가 다시 해보아야겠다.

 

그래도 Google 홈페이지를 Clone하면서 flex, margin, position에 대해 더 자세히 검색하면서 익숙해질 수 있었다.

 

참고 출처 : https://velog.io/@shanells/Google-clone-coding

'프로그래밍 > 바닐라코딩_Prep Guide' 카테고리의 다른 글

Step 2. JavaScript(2)  (0) 2021.11.25
Step 2. JavaScript(1)  (0) 2021.11.24
Step 1. CSS  (0) 2021.11.02
Step 1. HTML  (0) 2021.10.29
준비를 위한 준비  (0) 2021.10.28

 Semantic 구조란?

semantic : 의미의, 의미론의, 의미론적인

시멘틱 구조란, HTML 문서에서 의미 있는 구조에 의미가 맞는 태그를 사용하는 것을 말한다.

HTML5 시멘틱 구조

시멘틱 구조에서는 위와 같이 웹 페이지에서 가장 윗부분에 올만한 내용들, 이를테면 웹사이트 로고나 로그인 폼 등을 배치할 때 header 태그를 사용하고 header 답게 맨 위에 배치하게 된다. 문서에서 메뉴를 나타낼 때는 nav 태그를 사용할 것이고 여기에 목차나 리스트, 링크 등이 배치된다.

 

이렇듯 의미 있는 구조에 맞는 의미 있는 태그들을 사용하여 HTML 문서를 구성하는 것을 시멘틱 구조라 한다.

Naver 메인 화면을 보면 대략적으로 우리는 어디가 header이고 어디가 nav인지 감으로 알 수 있다. 하지만 컴퓨터라는 기계는 인간이 아니기 때문에 대략적으로 파악이 불가능하다. 구성 요소들이 그저 div 태그로 이루어져 있다면 효율적으로 데이터를 추출하기 어렵다는 것이다. 하지만 시멘틱 구조로 이루어져 있다면 각 정보들이 분류되어 데이터 추출이 용이해진다.

 

Tag Description
header 맨 윗부분으로 사이트 로고, 로그인, 언어 선택 등이 위치한다.
nav 문서에서 방향을 지시하는 곳으로 메뉴, 리스트 등이 위치한다.
aside 본문과 관련 없는 배너 광고 등이 위치한다.
section 여러 중심 내용을 감싸는 공간 ex) 네이버 뉴스에서 연예 섹션 혹은 스포츠 섹션 등등
article 직접적인 내용이 들어가는 곳으로 뉴스 기사 본문 내용 등이 위치한다.
footer 가장 밑 부분으로 주소, 연락처, 저작권 등의 내용이 위치한다.

시멘틱 태그는 모두 div 태그와 같은 기능을 수행한다. 하지만 검색 엔진이 웹 페이지를 파악하거나, 기계적인 동작이 더해질 때 시멘틱 구조로 이루어져 있다면 더욱 쉽게 이해하고 용이하게 이루어진다.

 

시멘틱 이전의 HTML 구조

    <div id="wrap">
      <div id="header">
        <h1>HTML</h1>
      </div>
      <div class="section">
        <div id="article">
          <h2>컨텐츠 1의 제목</h2>
          <p>컨텐츠 1의 내용</p>
        </div>
        <div id="article2">
          <h2>컨텐츠 2의 제목</h2>
          <p>컨텐츠 2의 내용</p>
        </div>
      </div>
      <div id="footer">
        <span>저작권, 연락처, 주소</span>
      </div>
    </div>

 

시멘틱 구조의 HTML

    <div id="wrap">
      <header>
        <h1>나는 제목</h1>
      </header>
      <nav>
        <ol>
          <li><a href="#">Menu 1</a></li>
          <li><a href="#">Menu 2</a></li>
          <li><a href="#">Menu 3</a></li>
        </ol>
      </nav>
      <section>
        <article>
          <h2>컨텐츠 1의 제목</h2>
          <p>컨텐츠 1의 내용</p>
        </article>
        <article>
          <h2>컨텐츠 2의 제목</h2>
          <p>컨텐츠 2의 내용</p>
        </article>
      </section>
      <footer><address>경기도 평택시</address></footer>
    </div>

위에서 표현한 것처럼, <div id="header">라고 표현하는 것보다 <header>로 헤더를 장식하는 것이 직관적이고 효율적이며 의미론적이다.

 

시멘틱 구조를 사용하는 것은 검색 엔진이 파악하는 데에 도움을 줄 뿐만 아니라 개발자들이 코드의 구조를 파악할 때 보다 용이하게 파악할 수 있다.

 

 

 

참고 출처 : https://snusang.tistory.com/4

참고 출처 : https://m.blog.naver.com/won_1020/221718728799

 

'프로그래밍 > HTML' 카테고리의 다른 글

Data Attribute  (0) 2022.03.07
Emmet  (0) 2022.03.06

HTML로 앙상한 뼈대를 만들었다면, CSS는 이 뼈대에 살을 붙여 이쁘게 보이도록 하기 위한 Style Sheet 언어이다. HTML 코드에서 head 태그의 style 태그 안에 CSS 내용이 들어간다.

    <div>
      <h1>생활코딩 CSS 연습하기</h1>
    </div>
    <div id="grid">
      <div>
        <ol>
          <li>HTML</li>
          <li>CSS</li>
          <li>JavaScript</li>
        </ol>
      </div>
      <div>
        <a
          href="http://metamong.shop/"
          target="_blank"
          title="나홀로 메모장 Ver2.0"
          style="color: green"
          >나홀로 메모장 Ver2.0</a
        >
        <p>Hello, Metamong!</p>
      </div>
    </div>

※ 링크 태그인 a 태그의 속성값으로 target="_blank"를 부여하면, 새로운 웹페이지에서 링크가 열리게 할 수 있다. 그리고 title="나홀로 메모장 Ver2.0"을 부여하면, 링크에 마우스 커서를 갖다 댔을 시 자그마한 툴팁이 뜨게 된다.

  • CSS가 필요한 이유

SW사관학교 정글 자료를 공부할 당시 만들었던 사이트를 가져와보았다! 만약 '나홀로 메모장 Ver2.0'이라는 링크를 초록색으로 꾸미고 싶을 때, HTML로만 해결하려고 하면 a 태그 안에 style="color: green"이라는 속성 값을 부여하면 된다. 하지만 점점 색상을 부여해야 할 요소가 많아지는 등, 복잡해지면 일일히 속성값을 부여하는 것은 상당히 비효율적이다. 이를 해결하기 위해 CSS가 등장했는데 HTML이 정보 전달, 즉 뼈대 구성에만 전념하게 하고 꾸미는 부분은 CSS가 전담하게 하여 보다 효율적으로 문서를 작성할 수 있게 되었다.

<head>
     <style>
        a {
        color: green;
        }
     </style>
</head>

CSS를 작성할 때는 head 태그 안에 style 태그를 넣고, style 안에서 CSS 코드를 작성하면 된다. 위와 같이 작성 시 a 태그의 모든 폰트 색상은 초록색이 된다.

  • 박스 모델

우리가 만든 어떤 요소가 HTML 문서 안에서 얼마만큼의 크기를 가지고 있는지 직관적으로 알기는 어렵다. 이때 border를 이용해서 해당 요소가 어떤 크기를 가지는지 직관적으로 알 수 있다.

h1,
a {
    border: 5px solid red;
}
<h1>CSS</h1>
Cascading Style Sheets(<a
	href="https://developer.mozilla.org/ko/docs/Web/CSS"
	>CSS</a
>)

이 때, h1 태그의 CSS가 화면 전체를 차지하는 것으로 보아 Block Level Element임을 알 수 있고, 하이퍼링크의 CSS가 자신의 크기만큼 차지하는 것으로 보아 Inline Element임을 알 수 있다.

F12를 통해 검사 도구로 들어가 Styles 항목을 누르면 각 요소의 어떤 부분이 얼마만큼 화면을 차지하는지 확인할 수 있다.

  • 그리드, Grid

Grid는 페이지를 여러 영역으로 나누어줄 때 사용된다.

      div {
        border: 5px solid black;
      }

      #grid {
        border: 5px solid pink;
        display: grid;
        grid-template-columns: 2fr 1fr;
        /* grid-template-columns: 150px 1fr; */
      }
    <div id="grid">
      <div>Navigation</div>
      <div>Article</div>
    </div>

전체화면을 3으로 보았을 때 Navigation이 2를, Article이 1을 차지하는 것을 알 수 있다. 이는 페이지의 크기를 늘리거나 줄여도 비율이 유지된다. 만약 150px 1fr;로 했다면 Navigation은 페이지의 크기가 늘어나든 줄어들든 150px를 유지하는 한편, Article은 나머지 부분을 차지하고 페이지 크기 변화를 따라간다.

 

※ div 태그는 Block Level Element이고 span 태그는 Inline Element이다.

※ caniuse 사이트를 통해 해당 기술이 얼마나 자주 사용되고 어느 플랫폼에서 사용할 수 있는지 확인할 수 있다.

Flex
Grid

Flex와 Grid 모두 대부분의 플랫폼에서 사용가능하며 전세계 90% 이상의 인구가 Flex 혹은 Grid로 이루어진 사이트를 이용할 수 있다.

  • 미디어 쿼리, Media Query
      div {
        border: 10px solid green;
        font-size: 60px;
      }
      /* @media (min-width: 800px) {
        div {
          display: none;
        }
      } */
      @media (max-width: 800px) {
        div {
          display: none;
        }
      }
    <div>Responsive</div>

800px을 넘은 경우
800px까지 display: none;

미디어쿼리를 사용하면 페이지의 크기 변화에 따른 동적인 반응을 이끌어낼 수 있다. 위와 같이 @media (max-width: 800px)로 코딩이 된 경우, 이는 최대 800px까지 해당 코드인 display: none;을 실행한다는 뜻이다. 즉 0 ~ 800px까지는 보이지 않다가, 800px부터는 display: none;이 실행되지 않으므로 Responsive가 보이기 시작한다.

 

반면 @media (min-width: 800px)는 최소 800px부터 해당 코드인 display: none;이 실행된다는 뜻이다. 즉 800px 이상부터는 보이지 않는다. 0 ~ 799px까지는 display: none;이 실행되지 않으므로 Responsive가 보인다.

'프로그래밍 > 생활코딩_WEBn 시리즈' 카테고리의 다른 글

HTML  (0) 2021.10.27

출처 : 바닐라코딩 Prep Guide

위와 같이 HTML은 구조를 결정하는 한편, CSS는 그 날 것의 구조를 꾸미는 것이고, JavaScript는 꾸며진 구조가 동적으로 움직일 수 있게 해준다.

 

  • CSS
<!DOCTYPE html>
<html lang="ko">
  <head>
    <style>
      h1 {
        color: black;
        font-size: 30px;
        font-weight: 1500;
      }

      li,
      p {
        color: blue;
        font-size: 30px;
      }

      #firstList {
        font-size: 20px;
      }
    </style>
  </head>

  <body>
    <h1>바닐라코딩</h1>
    <ul>
      <li id="firstList">HTML</li>
      <li>CSS</li>
      <li>JavaScript</li>
    </ul>
    <p>한 번 끝까지 달려보자!</p>
  </body>
</html>

위 코드에서 head의 style 태그 안에 담긴 것들이 CSS이다. 단순히 h1, li, p와 같은 태그들을 선택할 때는 그대로 입력 후 중괄호 {} 안에 원하는 CSS를 기입하면 된다. id를 선택할 때에는 앞에 #을 붙여주어야 한다. 또한, CSS는 각 코드의 끝에 세미 콜론 ;을 붙여주어야 한다.

 

참고로 id나 class를 정해줄 때 위와 같이 firstList처럼 이름을 정해주는데, 이 때 대부분의 개발자들이 사용하는 규칙이 있다. first list처럼 쓰는 것이 아닌, _을 활용한 first_list앞 단어 이후 붙는 뒤의 단어들의 첫 번째 글자는 대문자로 시작하는 firstList로 이름을 정해준다.

 

  • Selectors, 선택자
<!DOCTYPE html>
<html lang="ko">
  <head>
    <style>
      * {
        font-family: Arial, Helvetica, sans-serif;
      }

      h1 {
        color: black;
        font-size: 30px;
        font-weight: 1500;
      }

      /* li,
      p {
        color: blue;
        font-size: 30px;
      } */

      #firstList {
        font-size: 20px;
      }

      .thick {
        font-weight: bold;
      }

      .alert {
        color: red;
      }

      #box {
        background: blue;
        color: white;
      }

      #nav li {
        background: blue;
        color: black;
      }

      #list > li {
        border: 1px solid black;
        color: blue;
      }

      img[alt="cat"] {
        border: 1px solid black;
      }
    </style>
  </head>

  <body>
    <h1>바닐라코딩</h1>
    <ul>
      <li id="firstList">HTML</li>
      <li>CSS</li>
      <li>JavaScript</li>
    </ul>
    <p>한 번 끝까지 달려보자!</p>

    <hr />

    <p class="thick">나는 두꺼워, I'm thick</p>
    <p class="alert">경고, Warning!</p>
    <p id="box">나는 박스야, I'm box</p>

    <h1>Heading</h1>
    <h2>SubHeading</h2>

    <ul id="nav">
      <li>child</li>
    </ul>

    <hr />

    <ul id="list">
      <li>child</li>
      <li>
        <ul>
          <li>grand child</li>
        </ul>
      </li>
    </ul>

    <hr />

    <img
      src="https://i.guim.co.uk/img/media/26392d05302e02f7bf4eb143bb84c8097d09144b/446_167_3683_2210/master/3683.jpg?width=465&quality=45&auto=format&fit=max&dpr=2&s=68615bab04be2077a471009ffc236509"
      alt="cat"
    />
  </body>
</html>

h1, p, li와 같은 태그들은 그대로 적어주면 지정할 수 있다.

 

thick과 같은 class의 경우는 앞에 .을 붙여주어야 한다. class의 경우, id와 달리 하나 이상의 요소에 class를 부여할 수 있다. 또한 class명을 thick_alert 혹은 thickAlert가 아닌 thick alert로 지었을 경우, style에 작성한 thick과 alert의 영향을 동시에 받는다.

 

id는 앞에 #을 붙여주면 되고, 하나의 id명에는 하나의 HTML 요소만 적용하는 것이 원칙이다.

 

li, p처럼 쉼표를 이용해 2개 이상을 동시에 지정할 수 있다.(Compound)

 

#nav li, #list > li 처럼 한 요소의 하위 요소를 선택할 수도 있다.

 

*을 이용하면 HTML body의 모든 요소를 선택하게 된다.

 

img[alt="cat"]으로 지정하면, img 태그 중 alt 속성의 값이 cat인 HTML 요소를 선택하게 되는 것이다.

 

※ 반드시 기억해야 하는 CSS 선택자 30개 : https://programmers.co.kr/learn/courses/30/lessons/12948

 

  • CSS Layout

   1. Block and Inline Block Elements

Block 요소들은 줄바꿈이 실행되어 새로운 줄에서 시작한다. 대표적으로 p와 div 태그가 있다. Block은 Block이나 Inline을 자식으로 품을 수 있다.

 

반면 Inline 요소들은 줄바꿈이 실행되지 않아, 새로운 줄에서 시작하지 않는다. 텍스트 흐름과 동일하게 동작한다. 하나에 이러 또 다른 하나가 줄줄이 이어 붙여진다는 것이다. Inline은 Inline을 자식으로 품을 수 있지만, Block은 자식으로 품을 수 없다. Inline의 대표적인 태그로는 span이 있다.

 

   2. Flex

<!DOCTYPE html>
<html lang="ko">
  <head>
    <title>HTML & CSS</title>
    <style>
      .main {
        display: flex;
      }

      code {
        background: #000000;
        color: #ffffff;
        display: block;
        padding: 25px;
        text-align: center;
      }

      header,
      section,
      aside,
      footer {
        margin: 10px;
      }

      footer {
        margin-bottom: 0px;
      }
    </style>
  </head>
  <body>
    <header>
      <code>&#60;HEADER&#62;</code>
    </header>

    <div class="main">
      <section>
        <code>&#60;SECTION&#62;</code>
      </section>

      <aside>
        <code>&#60;ASIDE&#62;</code>
      </aside>
    </div>

    <footer>
      <code>&#60;FOOTER&#62;</code>
    </footer>
  </body>
</html>

class가 main인 요소의 display를 flex로 두면 다음과 같이 2개 이상의 요소를 나란히 배치할 수 있다.

 

   3. Using Inline Block

 

위와 같이 2개 이상의 요소를 나란히 배치할 수 있는 방법이 1가지 더 있다.

section,
aside {
    display: inline-block;
}

Flex를 사용했을 때와 유사하나, Section과 Aside간의 간격이 조금 벌어져 있다.

Flex와 Inline Block은 외형은 비슷하게 나오나 코딩은 조금 다르게 해야 한다. Flex의 경우 class가 main인 요소를 선택해 display: flex;를 부여하면 자식 요소들이 나란히 배치된다.

 

이와 다르게 Inline Block은 나란히 배치하고 싶은 요소들, 이를테면 위처럼 section, aside를 하나하나 지정해주어야 한다.

 

  • Using Position Property

   - Static : 기본 위치로, Position Property를 따로 지정하지 않았을 때 Static이 기본 상태이다. 좌표 Property인 top, bottom, left, right를 사용할 수 없고 사용할 때에는 무시된다. 

 

   - Relative : position: relative;를 부여한다고 해서 딱히 어느 위치로 이동하진 않는다. 하지만 좌표 Property를 부여해 원래의 위치에서 이동시킬 수 있다.

.relative-element {
     background: #ffffff;
     border: 2px dashed red;
     height: 100px;
     padding: 0;
}

.relative-element code {
     background: blue;
     color: #ffffff;
     display: block;
     height: 74px;
     left: 20px;
     padding-top: 26px;
     position: relative;
     text-align: center;
     top: 20px;
}

빨간색 점선 박스로부터 위에서 20px, 왼쪽에서 20px 벗어난 파란색 박스를 볼 수 있다. relative-element는 Position Property를 부여하지 않았기 때문에 이동할 수 없는 Static 상태일 것이고, relative-element라는 부모 안의 자식 요소인 code, 즉 <div class="relative-element">는 relative라는 Position Property를 부여받아 top이나 left라는 좌표 Property에 의해 이동할 수 있다.

 

relative의 경우 기본 위치는 static이고 부모를 기준으로 두고 이동하게 된다.

 

   - Absolute : 가장 가까운 부모 요소 중 position: relative;가 적용된 요소를 찾아, 그 요소를 기준으로 위치가 정해지게 된다. 만약 부모 요소 중 position: relative;를 가진 요소가 없다면, 전체 페이지를 기준으로 위치를 잡게 된다.

section {
  background: #000000;
  height: 145px;
  position: relative;
}

.absolute-element,
.absolute-element code {
  height: 96px;
  position: absolute;
  width: 160px;
}

.absolute-element {
  border: 2px dashed red;
  right: 0;
  top: 0;
}

.absolute-element code {
  background: blue;
  color: #ffffff;
  display: block;
  right: 20px;
  top: 20px;
}

position: relative;가 부여된 section을 기준으로, class가 absolute-element인 div 요소(빨간색 점선)는 rigth: 0, top: 0;으로 위와 오른쪽 공백 없이 맨 오른쪽에 위치하게 되었다.

 

class가 absolute-element인 div의 자식인 code(파란색 박스)는 section을 기준으로 오른쪽으로부터 20px, 위로부터 20px 공간을 두고 위치하게 된다.

 

 

 

도움이 될만한 자료, CSS Layout 학습 : https://ko.learnlayout.com/toc.html

 

Prep Guide를 학습하다보면 이처럼 참고 자료가 많이 나온다. 이해하기 쉽고 유익한 자료이나, 하나를 깊게 파고들다보면 앞으로 나아가기 힘들고 흥미 또한 떨어질 수 있기 때문에, 나중에 개인 프로젝트를 진행하다 벽을 마주쳤을 때 필요한 내용들을 되짚어 봐야겠다.

'프로그래밍 > 바닐라코딩_Prep Guide' 카테고리의 다른 글

Step 2. JavaScript(1)  (0) 2021.11.24
Step 1. Google Clone  (0) 2021.11.14
Step 1. HTML  (0) 2021.10.29
준비를 위한 준비  (0) 2021.10.28
또다른 입구  (0) 2021.10.27

+ Recent posts