no image
[CSS] CSS 필수 속성(배경 속성, 위치 속성, 애니메이션 속성)
이 글은 코딩 자율학습 HTML+CSS+JS(저자 : 김기수)의 책 내용과 유튜브 영상을 개인적으로 정리하는 글입니다. 배경 속성 background-color 속성 요소의 배경에 색상을 넣을 수 있다. 속성 값으로는 색상값을 사용하면 된다. background-image 속성 요소의 배경에 해당 속성을 사용하면 이미지를 넣을 수 있다. 속성 값은 삽입할 이미지의 경로를 url() 함수로 지정하면 된다. 요소의 배경 크기가 반드시 지정되어야 한다. 이미지의 크기가 요소의 배경크기와 맞아야 한다. -요소의 배경이 이미지 크기보다 작으면 잘린다. -요소의 배경이 이미지 크기보다 크면 이미지 패턴이 반복된다. backgrount-repeat 속성 요소의 배경 크기가 삽입하려는 이미지보다 크면 이미지를 자동으로..
2024.01.07
no image
[CSS] CSS 필수 속성(박스 모델)
이 글은 코딩 자율학습 HTML+CSS+JS(저자 : 김기수)의 책 내용과 유튜브 영상을 개인적으로 정리하는 글입니다. 박스 모델을 구성하는 속성 HTML 문서에서 사용된 각각의 요소가 어떤 원리로 웹 브라우저에 배치되어 표시되는지 이해하려면 박스 모델을 알아야 한다. 박스 모델은 모든 HTML 요소가 사각형의 박스로 둘러 쌓여 있다는 개념이다. 박스 형태의 요소들을 하나씩 원하는 곳에 배치해 원하는 모양으로 만들어 나가는 것이 결국 웹 페이지를 만드는 본질이다. 박스 모델은 아래와 같은 4가지 요소로 구성된다. 박스 모델은 크롬 웹브라우저 개발자도구(F12, ctrl+shift+i)에서 살펴볼 수 있다. margin 영역 margin은 박스 모델에서 가장 외부에 있는 영역으로, 요소의 외부 여백을 담당..
2024.01.06
no image
[CSS] CSS 필수 속성(CSS의 특징, 텍스트 속성)
이 글은 코딩 자율학습 HTML+CSS+JS(저자 : 김기수)의 책 내용과 유튜브 영상을 개인적으로 정리하는 글입니다. CSS의 특징 기본 스타일 시트 hn 태그는 단순히 태그만 사용했는데도 웹 브라우저에는 텍스트가 다양한 크기와 굵기로 표시됐다. HTML 태그는 태그 자체에 꾸밈을 담당하는 역할이나 기능이 없다. 그렇지만 웹 브라우저 자체에 기본 스타일 시트가 내장되어 있기 때문에 위와 같은 모양으로 표현될 수 있는 것이다. 기본 스타일 시트 기본 스타일 시트란 글꼴이나 크기, 색상, 굵기, 문단 설정과 같은 스타일이 미리 정의된 파일 또는 문서 양식을 말한다. 기본 스타일 시트에 정의된 스타일 속성보다 사용자가 정의한 스타일 속성이 우선 적용된다. 적용 우선순위와 개별성 specificity 위와 같..
2024.01.05
no image
[CSS] CSS 선택자
이 글은 코딩 자율학습 HTML+CSS+JS(저자 : 김기수)의 책 내용과 유튜브 영상을 개인적으로 정리하는 글입니다. 기본 선택자 사용 전체 선택자 전체 선택자는 HTML에서 사용할 수 있는 모든 요소를 한 번에 선택자로 지정하는 방법으로, * 기호를 사용해 표시한다. 전체 선택자 전체 선택자는 모든 요소를 한 번에 선택할 수 있다. 태그 선택자 태그 선택자는 HTML 태그명으로 선택자를 지정하는 방법이다. 태그 선택자는 선택자에 지정된 태그명과 일치하는 모든 요소를 한 번에 선택한다. 안녕 하이 안녕 안녕 아이디 선택자 아이디 선택자는 HTML 태그에서 사용할 수 있는 id 속성 값을 이용해 선택자를 지정하는 방법이다. 이때 속성값 앞에는 # 기호를 붙여 구분한다. 안녕 id 속성값은 고유해야 한다...
2024.01.04
no image
[CSS] CSS 기초 문법
이 글은 코딩 자율학습 HTML+CSS+JS(저자 : 김기수)의 책 내용과 유튜브 영상을 개인적으로 정리하는 글입니다. CSS : Cascading Style Sheets 문법 형식 CSS 문법은 크게 선택자와 선언부로 구분한다. 선택자 : CSS 스타일을 적용할 HTML 태그(요소)를 선택하는 영역 선언부 : 선택자에서 선택한 태그에 적용할 스타일을 작성하는 영역, 중괄호 안에 작성 선언부에 작성하는 스타일은 반드시 속성과 값을 한 쌍으로 작성 값의 뒤에 세미콜론을 넣으면 여러 스타일을 연속해서 작성 가능 안녕 줄 바꿈과 들여 쓰기 CSS 코드를 작성할 때, 줄 바꿈과 들여 쓰기를 꼭 할 필요는 없다. 그러나 줄 바꿈과 들여쓰기를 적절하게 사용하면 코드의 가독성을 크게 향상할 수 있다. 스타일 시트 스..
2024.01.03
no image
[Git] Git 명령어 정리
본 게시글은 모두의 git,github(저자 : 강민철)의 내용을 개인적으로 정리하는 글입니다. 기본적인 명령어 기본 경로에 만들기 git init 원하는 경로에 만들기 cd 원하는 경로 (폴더가 이미 생성되어 있어야 함) git init 현재 경로 확인 pwd 작업 디렉터리 상태확인 git status 스테이지에 올리기 git add add 전과 후 변경 사항을 한꺼번에 추가하려면 git add . 커밋하기 git commit -m "커밋 메시지" git commit -message "커밋 메시지" 커밋 목록 출력 git log add와 commit 동시에 하기 git commit -am "커밋 메시지" git commit -a -m "커밋 메시지" git commit -all -message "커밋 ..
2023.12.29
no image
[GitHub] 소스트리로 clone, push, fetch, pull, pull request 하기
본 게시글은 모두의 git,github(저자 : 강민철)의 내용을 개인적으로 정리하는 글입니다. 깃허브는 아래의 두 가지 쓰임새가 있다. 개발자의 SNS 개발자 간 협업을 가능케 하는 원격 저장소 호스팅 서비스 Git은 우리의 컴퓨터 속에만 존재하는 저장소이다. 이는 로컬에 있는 저장소, 즉 로컬 저장소라고 부른다. 반면 원격 저장소는 우리들의 컴퓨터 속에만 있는 저장소가 아닌, 인터넷 세상 어딘가에 있는 다른 컴퓨터 속의 저장소를 의미한다. 깃허브의 원격 저장소는 깃허브가 관리하는 컴퓨터 속의 저장소를 의미한다. 원격 저장소를 통해 백업과 협업에 이점이 있다. 원격 저장소와의 네 가지 상호작용 원격 저장소와의 상호 작용은 크게 네 가지이다. clone : 원격 저장소 복제 push : 원격 저장소 밀어..
2023.12.28
no image
[Git] 소스트리(Sourcetree)로 브랜치(Branch) 다루기
본 게시글은 모두의 git,github(저자 : 강민철)의 내용을 개인적으로 정리하는 글입니다. 브랜치란? 브랜치는 마치 줄기에서 뻗어 나오는 나뭇가지와 같이 버전을 여러 흐름으로 나누어 관리하는 방법이다. 브랜치는 버전의 분기이다. 작업을 분기하고 싶을 때 브랜치를 나누면 된다. 버전을 나누어 관리하는 것은 아래의 3단계로 버전을 관리하는 것을 의미한다. 브랜치를 나눈다. 각자 브랜치에서 작업한다. (필요할 경우) 나눈 브랜치를 합친다. 브랜치 나누고, 합치기 깃이 제공하는 가장 기본적인, 최초의 브랜치를 master 브랜치라고 한다. 가령 로컬 저장소를 만들고, 커밋 세 개를 만들었다고 가정하자 이 커밋 모두는 master 브랜치에 속한다. master 브랜치에 만들어진 세 커밋을 master 1번 ..
2023.12.27

이 글은 코딩 자율학습 HTML+CSS+JS(저자 : 김기수)의 책 내용과 유튜브 영상을 개인적으로 정리하는 글입니다.


배경 속성

background-color 속성

요소의 배경에 색상을 넣을 수 있다.

속성 값으로는 색상값을 사용하면 된다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>background-color</title>
  <style>
    div{
      width:100px;
      height:100px;
      background-color:red;
    }
  </style>
</head>
<body>
  <div></div>
</body>
</html>

 

background-image 속성

요소의 배경에 해당 속성을 사용하면 이미지를 넣을 수 있다.

속성 값은 삽입할 이미지의 경로를 url() 함수로 지정하면 된다.

  • 요소의 배경 크기가 반드시 지정되어야 한다.
  • 이미지의 크기가 요소의 배경크기와 맞아야 한다.
    -요소의 배경이 이미지 크기보다 작으면 잘린다.
    -요소의 배경이 이미지 크기보다 크면 이미지 패턴이 반복된다.
<!DOCTYPE html>
<html lang="ko">
<head>
  <title>background-image</title>
  <style>
    div{
      width:160px;
      height: 120px;
      background-image: url('images/coffee.jpg');
    }
  </style>
</head>
<body>
  <div></div>
</body>
</html>

 

backgrount-repeat 속성

요소의 배경 크기가 삽입하려는 이미지보다 크면 이미지를 자동으로 반복해서 채운다.

이때 이미지 반복 설정을 바꾸려면 해당 속성을 사용하면 된다.

속성값 설명
no-repeat 이미지를 반복하지 않는다.
repeat-x 이미지를 가로 방향으로 반복한다.
repeat-y 이미지를 세로 방향으로 반복한다.
repeat 이미지를 가로와 세로 방향으로 반복한다.
round 이미지를 반복하되 이미지가 요소에 딱 맞도록 크기를 자동 조절한다.
space 이미지가 잘리지 않도록 반복한다.

 

background-size 속성

요소의 배경 크기가 이미지보다 크면 background-repeat 속성으로 해결할 수 있지만, 요소의 배경 크기가 이미지보다 작을 때 이미지가 잘려 보이는 문제는 해결할 수 없다.

그 대신 이 문제는 background-size 속성으로 이미지 크기를 지정해서 처리할 수 있다.

cover와 contain은 비슷해 보이지만, 서로 다르게 작동하는 속성값이다.

위쪽이 cover, 아래가 contain이다.

cover는 이미지가 잘리지만, contain은 비율을 유지하면서 이미지가 배경 요소에 꽉 차도록 확대하지만, 배경의 가로와 세로 중 한 부분이 가득 차면 그 상태에서 멈춘다. 그리고 못 채운 부분은 이미지를 반복해서 채운다.

 

또는 아래처럼 너비와 높이를 직접 지정해도 된다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>background-size</title>
  <style>
    div{
      width:80px; /* 원본 이미지보다 1/2 작게 설정 */
      height:60px; /* 원본 이미지보다 1/2 작게 설정 */
      background-image:url('images/coffee.jpg');
      background-size:80px 60px; /* 너비와 높이를 80px, 60px로 지정 */
    }
  </style>
</head>
<body>
  <div></div>
</body>
</html>

이렇게 하면 이미지가 잘려보이지 않고 배경에 딱 맞게 표시된다.

 

background-position 속성

삽입하려는 이미지의 위치를 결정할 수 있다.

해당 속성값은 1개만 사용해도 되고 2개를 사용해도 된다.

값을 1개만 사용하면 지정한 값은 x축 값이 되고, y축 값은 기본으로 center가 된다.

2개를 사용하면 각각 x축과 y축 값으로 지정된다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>background-position</title>
  <style>
    div{
      width:320px; /* 원본 이미지보다 2배 크게 설정 */
      height:240px;/* 원본 이미지보다 2배 크게 설정 */
      border:1px solid black; /* 요소의 넓이가 잘 보이게 테두리 설정 */
      background-image:url('images/coffee.jpg');
      background-repeat:no-repeat;      
      background-position:100%;
    }
  </style>
</head>
<body>
  <div></div>
</body>
</html>

위 코드를 설명하면 요소의 배경 크기는 삽입하려는 이미지보다 2배 크다.

이 상태에서 이미지를 반복하지 않고 x축 값만 100%로 지정했다.

이렇게 하면 자동으로 y축 값은 center가 된다.

이렇게 하면 자동으로 y축 값은 center가 된다.

참고로 100%는 비율에서 가장 큰 값이기 때문에 x축에 사용하면 가장 오른쪽, y축에 사용하면 가장 아래쪽을 의미한다.

background-position 속성은 background-size 속성값을 cover로 지정해서 같이 사용하면 효과가 좋다.
background-size의 cover와 background-position 속성 값을 center로 지정하면 이미지가 정중앙에 있는 것처럼 보인다.

 

background-attachment 속성

요소에 삽입된 이미지를 스크롤할 때, 이미지 작동 방식을 결정한다.

 

 

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>background-attachment-fixed</title>
  <style>
    body{
      height:1000px;
    }
    .parent{
      width:320px; /* 원본 이미지보다 2배 크게 설정 */
      height:240px;/* 원본 이미지보다 2배 크게 설정 */
      border:1px solid black; /* 요소의 넓이가 잘 보이게 테두리 설정 */
      overflow:scroll;
    }
    .children{
      height:2000px;
      background-image:url('images/coffee.jpg');
      background-attachment:fixed;
    }
  </style>
</head>
<body>
  <div class="parent">
    <div class="children"></div>
  </div>
</body>
</html>

 

 

위치 속성으로 HTML 요소 배치하기

CSS에서 제공하는 속성 중에는 HTML 요소를 기본 흐름에서 벗어나서 원하는 곳에 배치할 수 있는 속성이 있다.

이 속성들의 요소의 위치에 관여한다고 해서 위치 속성이라고 한다.

 

position 속성

HTML 요소를 기본 흐름에서 벗어나 좌푯값에 따라 배치할 때 사용한다.

 

static

position 속성 값을 static으로 지정하면 아무런 변화가 없다.

좌표 속성을 사용할 수 없으며 위치 속성을 사용하지 않았을 때와 같다.

기본 스타일 시트에 적용된 position 값이 static이다.

 

relative

position 속성값을 relative로 지정하면 요소를 좌표 속성에 따라 배치할 수 있다.

좌표 속성에 따라 요소를 배치하는 원리를 이해하려면 좌표계를 알아야 한다.

좌표계는 요소가 웹 브라우저에 표시될 때 x축, y축, z축에 따라 요소가 배치되는 개념이다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>relative</title>
  <style>
    .box{
      width:100px;
      height:100px;
    }
    .red-box{
      background-color:red;
    }
    .green-box{
      background-color:green;
      position:relative;
      left:100px;
      /* top 속성 추가 */
      /* top:100px; */
    }
    .blue-box{
      background-color:blue;
    }
  </style>
</head>
<body>
  <div class="box red-box"></div>
  <div class="box green-box"></div>
  <div class="box blue-box"></div>
</body>
</html>

 

absolute

position 속성값을 absolute로 지정하면 relative와 마찬가지로 요소가 기본 흐름에서 벗어나 좌표 속성에 따라 배치된다.

다만 relative일 때는 기준점이 요소의 왼쪽 위 모서리지만, absolute일 때는 웹 브라우저의 왼쪽 위 모서리이다.

 

position 속성값을 relative에서 absolute로 바꾸면 전혀 다르게 동작한다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>absolute</title>
  <style>
    body{
      margin:0;
    }
    .box{
      width:100px;
      height:100px;
    }
    .red-box{
      background-color:red;
    }
    .green-box{
      background-color:green;
      position:absolute;
      left:100px;
      /* top 속성 추가 */
      /* top:100px; */
    }
    .blue-box{
      background-color:blue;
    }
  </style>
</head>
<body>
  <div class="box red-box"></div>
  <div class="box green-box"></div>
  <div class="box blue-box"></div>
</body>
</html>

absolute 값일 때는 요소를 움직이면 요소가 원래 있던 공간은 빈 공간으로 인식된다.

그래서 파란색 요소가 초록색 요소가 원래 있던 위치로 올라온다.

초록색 요소만 보면 이동한 위치가 relative 일 때와 다르지 않다. absolute는 기준점이 웹 브라우저의 왼쪽 위라고 했는데, 빨간색 요소 옆으로 가지 않고 relative 때처럼 원래 위치에서 오른쪽으로 이동한 이유는 position 속성값이 absolute일 때 top이나 bottom 속성을 지정하지 않으면 left나 right 속성은 원래 위치에서 x축 방향으로만 움직이기 때문이다.

 

position 속성값이 relative와 비교해보면 확실히 차이를 알 수 있다.

.green-box{
      background-color:green;
      position:relative;
      left:100px;
      top:100px;
    }

 

fixed

position 속성값을 fixed로 지정하면 해당 요소는 지정된 위치에 고정된다.

실행하면 absolute와 똑같이 작동하는 것처럼 보이지만, 스크롤했을 때 차이가 난다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>fixed</title>
  <style>
    body{
      margin:0;
      height:4000px;
    }
    .box{
      width:100px;
      height:100px;
    }
    .red-box{
      background-color:red;
    }
    .green-box{
      background-color:green;
      position:fixed;
      left:100px;
      top:100px;
    }
    .blue-box{
      background-color:blue;
    }
  </style>
</head>
<body>
  <div class="box red-box"></div>
  <div class="box green-box"></div>
  <div class="box blue-box"></div>
</body>
</html>

 

sticky

스크롤 하는 중에 일정 지점이 되면 요소가 fixed 값처럼 작동한다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>sticky</title>
  <style>
    body{
      margin:0;
      height:4000px;
    }
    .box{
      width:100px;
      height:100px;
    }
    .red-box{
      background-color:red;
    }
    .green-box{
      background-color:green;
      position:sticky;
      top:0;
    }
    .blue-box{
      background-color:blue;
    }
  </style>
</head>
<body>
  <div class="box red-box"></div>
  <div class="box green-box"></div>
  <div class="box blue-box"></div>
</body>
</html>

웹 브라우저를 스크롤해 보면 화면에서 사라지는 빨간색과 파란색 요소와 다르게 초록색 요소는 top 속성값이 0인 위치에 고정되어 있다.

 

float 속성

요소를 화면에 배치하는 또 다른 방법으로는 float 속성이 있다.

float 속성은 대상 요소를 공중에 띄워 다음에 오는 요소를 주변에 자연스럽게 배치하기 위한 용도로 사용한다.

 

이미지 요소와 텍스트 요소 배치하기

이미지 요소와 텍스트 요소가 함께 사용될 때 float 속성의 특징을 적용하면 아래와 같은 레이아웃을 만들 수 있다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>float</title>
  <style>
    img{
      float:left;
      margin-right:1rem;
    }
  </style>
</head>
<body>
  <img src="images/coffee.jpg" alt="커피">
  <p>Lorem, ipsum dolor sit amet consectetur adipisicing elit. Corrupti ut dolor ratione blanditiis iste, harum fugit, soluta eum obcaecati, expedita perspiciatis quam culpa? Doloribus repellendus labore sed inventore iusto eveniet. Lorem, ipsum dolor sit amet consectetur adipisicing elit. Maiores at natus aliquid numquam vitae nisi, voluptates laudantium saepe error sapiente nobis adipisci et accusamus molestiae commodi consequuntur earum, ut dicta? Lorem ipsum dolor sit amet consectetur, adipisicing elit. Id molestiae perspiciatis non temporibus voluptates alias ducimus libero esse recusandae placeat, natus quo mollitia sint enim? Ex numquam non officia ipsam?</p>
</body>
</html>

 

블록 성격 요소를 인라인 성격 요소처럼 배치

float 속성의 작동 원리를 이용해 블록 성격 요소를 인라인 성격 요소처럼 배치할 수 있다.

<!DOCTYPE html>
<html lang="ko">
<head></head>
  <title>float</title>
  <style>
    div{
      color:white;
    }
    .red-box{
      background-color:red;
      /* float:left; */
    }
    .blue-box{
      background-color:blue;
      /* float:left; */
    }
  </style>
</head>
<body>
  <div class="red-box">red-box</div>
  <div class="blue-box">blue-box</div>
</body>
</html>

 

float 요소를 left로 지정하면 블록 성격을 인라인 성격으로 바꿀 수 있다.

<style>
    div{
      color:white;
    }
    .red-box{
      background-color:red;
      float:left;
    }
    .blue-box{
      background-color:blue;
      float:left;
    }
  </style>

 

clear 속성

clear 속성은 float 속성을 해제할 때 사용하는 속성이다.

float 속성은 여러 문제점이 있다. 이러한 문제점은 float 속성이 대상 요소의 다음 요소에 영향을 주기 때문이다.

따라서 영향을 주지 않도록 float 속성을 해제해야 한다.

 

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>clear</title>
  <style>
    .box{
        width:100px;
        height:100px;        
    }
    .red-box{
      background-color:red;
      float:left;
    }
    .green-box{
      background-color:green;
      float:left;
    }
    .blue-box{
      background-color:blue;
    }
  </style>
</head>
<body>
  <div class="box red-box"></div>
  <div class="box green-box"></div>
  <div class="box blue-box"></div>
</body>
</html>

파란색 요소만 float 속성을 적용하지 않았다.

이 결과는 파란색 요소가 사라진 것이 아니라 빨간색 요소 밑에 있다.

float 속성이 적용된 요소는 자신의 원래 위치를 보장받지 못하기 때문이다.

 

파란색 요소를 정상적으로 보이게 하려면 파란색 요소 바로 전에 있는 초록색 요소에 적용된 float 속성을 해제해야 한다.

아래의 코드처럼 파란색 요소에 clear 속성을 추가한다.

이때 초록색 요소의 float 속성값이 left이니 clear 속성에도 left 값을 적용한다.

.blue-box{
      background-color:blue;
      clear:left;
    }

이제 파란색 요소는 다른 요소의 float 속성에 영향을 받지 않아 정상적으로 표시된다.

 

전환 효과 속성 적용하기

전환

CSS에서 한 요소에 적용된 스타일 속성값을 다른 속성 값으로 변하게 하는 것을 전환이라고 한다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>Transition</title>
  <style>
    .red-box{
      width:100px;
      height:100px;
      background-color:red;
    }
    .red-box:hover{
      background-color:blue;
    }
  </style>
</head>
<body>
  <div class="red-box"></div>
</body>
</html>

 

transition-property 속성

이 속성은 전환 효과를 적용할 대상 속성을 지정한다.

속성값 설명
none 전환 효과 속성을 지정하지 않는다.
all 모든 속성을 전환 효과를 대상으로 지정

 

color 속성에 전환 효과를 주고 싶다면 아래와 같이 작성하면 된다.

 

전환 효과를 여러 속성에 지정하고 싶다면 쉼표로 구분해 작성하면 된다.

 

개별 속성이 아닌 모든 속성에 전환 효과를 넣고 싶으면 all로 지정하면 된다.

 

transition-duration 속성

이 속성은 전환 효과의 지속 시간을 설정하는 데 사용한다.

속성값으로는 초 단위 값을 사용한다.

아래와 같은 코드를 작성하면 전환 효과가 1초 동안 발생한다.

어떤 요소에 전환 효과를 지정하려면 반드시 property  속성과 duration 속성을 함께 사용해야 한다.

 

transition-timing-function 속성

이 속성은 전환 효과의 진행 속도를 지정한다.

속성값으로는 정해진 키워드와 cubic-bezier()함수를 사용할 수 있다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>transition-timing-function</title>
  <style>
    .container{
      padding:10px;
      color:white;
      border:1px solid black;
    }
    .bar{
      width:100px;
      background-color:red;
      transition-property:width;
      transition-duration:1s;
      margin-bottom:10px;
    }
    .container:hover .bar{
      width:200px;
    }
    .bar:nth-child(1){
      transition-timing-function:linear;
    }
    .bar:nth-child(2){
      transition-timing-function:ease;
    }
    .bar:nth-child(3){
      transition-timing-function:ease-in
    }
    .bar:nth-child(4){
      transition-timing-function:ease-out;
    }
    .bar:nth-child(5){
      transition-timing-function:ease-in-out;
    }
  </style>
</head>
<body>
  <div class="container">
    <div class="bar">linear</div>
    <div class="bar">ease</div>
    <div class="bar">ease-in</div>
    <div class="bar">ease-out</div>
    <div class="bar">ease-in-out</div>    
  </div>  
</body>
</html>

 

기본으로 제공되는 속성값의 속도 방식이 마음에 들지 않는다면 cubic-bezier()함수로 직접 정할 수도 있다.

이는 크롬의 개발자 도구나 별도의 외부 사이트에서 계산하는 것이 편하다.

'HTML & CSS > CSS' 카테고리의 다른 글

[CSS] CSS 필수 속성(박스 모델)  (1) 2024.01.06
[CSS] CSS 필수 속성(CSS의 특징, 텍스트 속성)  (2) 2024.01.05
[CSS] CSS 선택자  (1) 2024.01.04
[CSS] CSS 기초 문법  (1) 2024.01.03

이 글은 코딩 자율학습 HTML+CSS+JS(저자 : 김기수)의 책 내용과 유튜브 영상을 개인적으로 정리하는 글입니다.


박스 모델을 구성하는 속성

HTML 문서에서 사용된 각각의 요소가 어떤 원리로 웹 브라우저에 배치되어 표시되는지 이해하려면 박스 모델을 알아야 한다.

박스 모델은 모든 HTML 요소가 사각형의 박스로 둘러 쌓여 있다는 개념이다.

박스 형태의 요소들을 하나씩 원하는 곳에 배치해 원하는 모양으로 만들어 나가는 것이 결국 웹 페이지를 만드는 본질이다.

 

박스 모델은 아래와 같은 4가지 요소로 구성된다.

 

박스 모델은 크롬 웹브라우저 개발자도구(F12, ctrl+shift+i)에서 살펴볼 수 있다.

 

margin 영역

margin은 박스 모델에서 가장 외부에 있는 영역으로, 요소의 외부 여백을 담당한다.

박스 모델은 사각형 모양이라서 각 방향에 해당하는 속성이 독립적으로 존재한다.

margin 영역을 다룰 때 사용할 수 있는 속성으로는 margin-top, margin-right, margin-bottom, margin-left가 있고, 모든 방향을 통합해 margin 속성으로 사용할 수도 있다.

속성 값에는 크기를 넣으면 된다.

 

아래의 예제는 p 태그로 작성된 두 요소의 간격을 20px만큼 벌리기 위해 margin-bottom 속성을 적용한다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>margin</title>
  <style>
    p{
      margin-bottom:20px;
    }
  </style>
</head>
<body>
  <p>lorem1</p>
  <p>lorem2</p>
</body>
</html>

 

이렇게 두 개의 값을 적용하면 위, 아래는 10px, 왼쪽과 오른쪽은 20px로 적용된다.

 

margin 겹침 현상

margin 겹침 현상은 인접한 margin 값이 둘 중 더 큰 값으로 통일되는 것을 말한다.

두 요소 사이의 간격은 20px과 30px을 합한 50px가 될 것 같지만, 실제로는 30px가 적용된다.

이러한 현상이 바로 margin 겹침 현상이다.

이는 같은 레벨(형제 관계)에 있는 요소들의 margin 영역이 중첩되면 더 큰 영역이 중첩되면 더 큰 값을 가진 margin 영역으로 병합디어 출력되는 현상이다.

 

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>margin collpase</title>
  <style>
    .first{
      margin-bottom:20px;
    }
    .second{
      margin-top:30px;
    }
  </style>
</head>
<body>
  <p class="first">lorem1</p>
  <p class="second">lorem2</p>
</body>
</html>

 

border 영역

border 영역은 margin 보다 안쪽에 있으며, 요소의 테두리(경계선)를 담당한다.

border 영역도 border 속성과 border-방향 속성 모두 똑같이 border-width, border-style, color 속성 값을 사용한다.

 

border-width 속성

테두리 굵기를 지정한다.

속성값으로는 단위를 포함한 크기를 사용한다.

 

border-style 속성

테두리 모양을 지정한다.

웹 브라우저가 크롬일 때

 

border 속성은 아래와 같이 지정할 수 있다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>border</title>
  <style>
    h1{
      border:1px solid #f00;
    }
    h2{
      border-bottom:2px dotted black;
    }
  </style>
</head>
<body>
  <h1>h1</h1>
  <h2>h2</h2>
</body>
</html>

 

padding 영역

margin, border 영역보다 안쪽에 있으며 요소의 내부 여백을 담당한다.

padding 영역에서 사용할 수 있는 속성은 margin 영역에서 사용하는 속성과 형식이 매우 비슷하다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>padding</title>
  <style>
    p{
      border:1px solid black;
      padding:10px;
    }
  </style>
</head>
<body>
  <p>padding</p>
</body>
</html>

 

content 영역

content 영역은 시작 태그와 종료 태그 사이에 사용된 콘텐츠가 속하는 영역이다.

그래서 다른 박스 모델의 구성 요소와는 다르게 content 영역은 content 영역 자체를 다루는 속성은 없다.

다만, content 영역에 영향을 주는 width 속성과 height 속성이 있다.

 

width와 height 속성

width 속성은 content 영역의 너비를, height 속성은 content 영역의 높이를 지정하는 데 사용한다.

속성 값으로는 단위를 포함한 크기를 넣는다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>width&height</title>
  <style>
    div{
      width:100px;
      height:100px;
      border:1px solid black;
    }
  </style>
</head>
<body>
  <div></div>
</body>
</html>

 

box-sizing 속성

width와 height 속성은 content 영역에 직접 영향을 주는 속성이라서 때로는 의도치 않게 작동한다고 느껴질 때가 있다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>box sizing</title>
  <style>
    div{
      width:100px;
      height:100px;
      padding:10px;
      border:1px solid black;
      margin:10px;
    }
  </style>
</head>
<body>
  <div></div>
</body>
</html>

width와 height 속성에 100px을 적용했는데도 웹 브라우저에 표시된 요소의 너비와 높이는 122px이다.

그 이유는 웹 브라우저가 요소를 화면에 렌더링할 때 border, padding, content 영역의 너비와 높이를 종합적으로 계산하기 때문이다.

 

이를 해결하기 위한 가장 간단한 방법은 width 속성값을 border, padding 영역 크기를 제외한 78px로 설정하는 것이다.

그러면 요소의 너비와 높이는 100px(1 + 10 + 78 + 10 + 1)이 된다.

 

이러한 방법은 계산을 해야 하는 불편함이 있기 때문에 box-sizing 속성을 사용한다.

속성 값으로는 content-box와 border-box가 있다.

속성값 설명
content-box width, height 속성의 적용 범위를 content 영역으로 제한
border-box width, height 속성의 적용 범위를 border 영역으로 제한
<!DOCTYPE html>
<html lang="ko">
  <head>
    <title>box sizing</title>
    <style>
      div {
        width: 100px;
        height: 100px;
        padding: 10px;
        border: 1px solid black;
        margin: 10px;
        box-sizing: border-box; /* width, height 속성의 적용 기준을 바꿈 */
      }
    </style>
  </head>
  <body>
    <div></div>
  </body>
</html>

box-sizing 속성은 width, height 속성의 적용 기준을 지정한다.

이 속성은 기본으로 content-box 값이 적용된 상태여서 width, height 속성으로 지정되는 영역을 content 영역으로 제한한다.

따라서 값을 border-box로 정의하면 width, height 속성의 지정 영역을 border 영역으로 바꿀 수 있다.

box-sizing 속성을 border-box 값으로 지정하면 width, height 속성에 지정한 크기에 요소를 맞추기 위해 content 영역의 너비와 높이가 자동으로 조절된다.

 

박스 모델의 성격과 display 속성

HTML의 모든 태그는 박스 모델을 가지고 있다.

그런데 이를 자세히 들여다보면 박스 모델도 블록, 인라인, 인라인 블록이라는 서로 다른 성격이 존재한다.

 

  • 블록 성격
    hn, p, div 태그를 사용했을 때 요소의 너비가 콘텐츠 유무와 상관없이 항상 가로 한 줄을 다 차지하는 것을 말한다.
    그래서 hn, p, div 태그를 여러 번 사용하면 무조건 줄 바꿈이 된다.
  • 인라인 성격
    a, span, strong 태그를 사용했을 때 요소의 너비를 콘텐츠 크기만큼만 차지하는 성격을 말한다.
    그래서 a, span, strong 태그를 여러 번 사용할 때 웹 브라우저의 수평 공간이 남아 있으면 한 줄로 배치된다.
  • 인라인 블록 성격
    인라인 블록 성격은 인라인 성격처럼 요소의 너비가 콘텐츠의 크기만큼만 차지하지만, 그 외의 성격은 브록 성격을 가지는 복합적인 성격을 말한다. 그래서 img 태그를 사용할 때 웹 브라우저의 수평 공간이 남아 있으면 한 줄로 배치된다.
  • 블록 vs 인라인 vs 인라인 블록
    박스 모델의 3가지 성격은 박스 모델의 구성 요소와 관련한 속성을 적용할 때 조금씩 차이가 있다.
    블록 성격이나 인라인 블록 성격은 width, height, margin, padding 속성이 전부 적용되지만, 인라인 성격은 width, height 속성은 적용되지 않고 padding과 margin 속성은 각각 왼쪽과 오른쪽 방향만 적용된다.
  • display 속성
    박스 모델의 성격은 display 속성을 사용하면 견경할 수 있다.
    속성 값으로는 block, inline, inline-block을 사용한다.
    예를 들어, 블록 성격인 태그를 인라인 성격으로 바꾸고 싶다면 display 속성값을 inline으로 지정하면 된다.

이 글은 코딩 자율학습 HTML+CSS+JS(저자 : 김기수)의 책 내용과 유튜브 영상을 개인적으로 정리하는 글입니다.


CSS의 특징

기본 스타일 시트

hn 태그는 단순히 태그만 사용했는데도 웹 브라우저에는 텍스트가 다양한 크기와 굵기로 표시됐다.

HTML 태그는 태그 자체에 꾸밈을 담당하는 역할이나 기능이 없다.

그렇지만 웹 브라우저 자체에 기본 스타일 시트가 내장되어 있기 때문에  위와 같은 모양으로 표현될 수 있는 것이다.

기본 스타일 시트
기본 스타일 시트란 글꼴이나 크기, 색상, 굵기, 문단 설정과 같은 스타일이 미리 정의된 파일 또는 문서 양식을 말한다.
기본 스타일 시트에 정의된 스타일 속성보다 사용자가 정의한 스타일 속성이 우선 적용된다.

 

적용 우선순위와 개별성

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>적용 우선 순위와 개별성</title>
  <style>
    p{color:red;}
    p{color:blue;}
    p{color:orange;}
  </style>
</head>
<body>
  <p>specificity</p>
</body>
</html>

위와 같이 p 태그에 여러 스타일을 사용하고 있다면 개별성 규칙 점수가 모두 같기 때문에 가장 나중에 적용된 오렌지 색상이 적용된다.

같은 태그의 선택자가 여럿일 때도 한 속성만 적용되는 이유는 CSS가 단계적으로 적용되는 스타일을 뜻하는 언어이기 때문이다.

여기서 말하는 단계적 적용은 같은 태그에 여러 스타일이 적용되더라도 단계적으로 적용되어 결국 마지막에 영향을 주는 하나의 스타일만 적용된다는 뜻이다.

이때 어떤 스타일이 마지막에 영향을 주는지 CSS 개별성 규칙에 따라 결정된다.

개별성 규칙 점수
사용된 선택자 종류를 파악해 점수를 계산하는 방식인데, 아래 그림처럼 선택자를 분류해서 개수를 세고 점수를 곱해 합을 구하면 된다.
추가적으로 !important라는 특별한 문법이 있다. 이 문법의 점수는 10,000점이다.
CSS의 선택자를 지정할 때 일일이 개별성 규칙 점수를 계산하는 건 현실적으로 매우 어렵다.
그래서 실무에서는 선택자를 최대한 자세하게 적을수록 점수가 더 높다고 생각하고 선택자를 지정한다.
<div id="main">
	<div class="sub">
    	<p>lorem</p>
    </div>
</div>​

위와 같은 HTML 태그 구조가 있다고 가정하면,
p 태그를 선택할 때 단순하게 p{}라고 지정하는 것 보다는 .sub p{}라고 지정하는 것이 점수가 더 커서 우선순위가 높다.
그리고 .sub p{}보다 #main .sub p{}가 훨씬 더 우선순위가 높다.
따라서 하나의 태그를 선택할 때는 부모 선택자부터 하위 선택자나 자식 선택자 조합으로 자세하게 적으면 우선순위가 높아지게 된다.

 

상속

또 다른 CSS 주요 특징으로 상속이 있다.

상속은 부모 요소에 적용된 스타일을 자식 요소가 그대로 물려받아 적용되는 현상을 말한다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>상속(inherit)</title>
  <style>
    div{
      color:red;
    }
  </style>  
</head>
<body>
  <div>
    <p>inherit</p>
  </div>
</body>
</html>

텍스트에 빨간색이 적용되는 것을 볼 수 있다.

텍스트를 직접 감싸는 p태그에 적용한 스타일이 아닌데도 텍스트에 스타일이 적용되는 이유는 상속되기 때문이다.

p 태그에는 color 속성이 없지만, p 태그의 부모인 div 태그는 color 속성이 있다.

이럴 때 자식인 p 태그는 부모인 div 태그의 스타일을 그대로 물려받는다.

이처럼 css 속성은 상속된다.

다만, 모든 속성이 전부 상속되지는 않는다.

 

단위

CSS 속성에는 다양한 단위의 값을 사용할 수 있는데, 단위는 절대 단위와 상대 단위로 나뉜다.

  • 절대 단위 : 어떤 환경이라도 동일한 크기로 보이는 단위
  • 상대 단위 : 부모 요소 또는 웹 브라우저의 창 크기에 따라 상대적으로 결정되는 단위

 

절대 단위

절대 단위는 px(pixel) 한 가지로, 모니터의 화면을 구성하는 사각형 1개의 크기를 의미한다.

CSS에서 사용할 수 있는 크기 단위 중 가장 기본이다.

웹 브라우저에서 다른 단위로 값을 지정하더라도 결국 px 단위로 환산되어 계산된다.

 

상대 단위

단위 설명
% 해당 속성의 상위 요소 속성값에 상대적인 크기를 가짐
em 부모 요소의 텍스트 크기에 상대적인 크기를 가짐
rem html 태그의 텍스트 크기에 상대적인 크기를 가짐
vw 뷰포트의 너비를 기준으로 상대적인 크기를 가짐
vh 뷰포트의 높이를 기준으로 상대적인 크기를 가짐

 

%

% 단위는 부모 요소의 속성값에 따라 상대적인 크기를 가진다.

그래서 어떤 속성을 사용했는지에 따라 기준이 다르게 잡힌다.

만약 다음과 같이 자식 요소의 font-size 속성값을 80%라고 지정했다면 자식 요소는 부모 요소 font-size 속성값의 80%에 해당하는 크기로 설정된다.

 

em

em 단위는 부모 요소의 텍스트 크기(font-size)를 기준으로 상대적인 크기를 가진다.

% 단위는 사용되는 속성에 따라 기준이 달라지지만, em 단위는 오로지 텍스트 크기를 기준으로 삼는다.

만약 값을 2em으로 지정했다면 자식 요소의 크기는 부모 요소의 font-size 속성값의 2배가 된다.

 

rem

rem 단위는 html 태그의 텍스트 크기에 대한 상대적인 값으로, 1 rem은 html 태그의 텍스트 크기의 1배이다.

현대적인 웹 브라우저는 모두 html 태그의 텍스트 크기가 16px이라서 1 rem은 16px과 같다.

 

vw

vw 단위는 뷰포트 너비를 기준으로 상대적인 크기를 가진다.

뷰포트는 간단히 말해 코드가 보이는 대상이라고 생각하면 된다.

따라서 웹이나 모바일에서는 웹 브라우저 창의 너비가 뷰포트 너비가 된다.

1vw는 뷰포트 너비의 1/100 크기를 의미한다.

 

vh

vh 단위는 뷰포트 높이를 기준으로 상대적인 크기를 말하며, 1vh는 뷰포트 높이의 1/100 크기를 의미한다.

 

색상 표기법

키워드 표기법

키워드 표기법은 색상의 영문명을 속성값으로 사용하는 방법이다.

css에서 사용할 수 있는 색상 키워드의 종류는 150여 개 이상이다.

 

RGB 색상 표기법

RFB 색상 표기법은 빨간색, 초록색, 파란색을 이용해 특정 색을 표현하는 방법이다.

여기에 추가로 색의 투명도를 의미하는 알파값을 사용할 수도 있다.

rgb나 rgba 형식은 RGB 값을 256개 숫자(0~255)로 표기한다.

알파 값은 0.1처럼 0부터 1 사이의 소수점으로 표기한다.

낮은 값일수록 투명화 정도가 더 높아진다.

이때 앞의 정수 부분 0은 생략할 수 있어서 .1로 표기해도 된다.

 

HEX 표기법

HEX 표기법은 red, green, blue에 해당하는 값을 각각 16진수로 변환해 00~ff로 나타내는 표기법이다.

16진수 표기법이라고도 하며, 실무에서 가장 많이 사용하는 색상 표기법이다.

HEX 표기법은 앞에 #을 붙이는 것이 특징이다.

00이 가장 낮은 값이고 ff가 가장 높은 값이어서 #ff0000은 빨간색, #00ff00은 초록색, #0000ff는 파란색을 의미한다.

그리고 R, G, B에 해당하는 16진수가 같다면 줄여서 표기할 수도 있다.

예를 들어 #ff0000은 #f00으로 표기할 수 있고, #335533은 #353으로 표기할 수 있다.

 

텍스트 속성으로 텍스트 꾸미기

font-family 속성

font-family 속성을 사용하면 글꼴을 지정할 수 있다.

속성값으로는 글꼴명을 적으면 되는데 쉼표로 구분하고 1개 이상의 글꼴을 나열해 지정한다.

이때, 한글로 된 글꼴이나 공백이 있는 글꼴명은 큰따옴표로 항상 감싸야한다.

바탕체 글꼴과 타임스 뉴 로먼 글꼴을 적용하고 싶다면 위와 같이 작성하면 된다.

이처럼 여러 글꼴을 쉼표로 구분해 나열하면 맨 앞에 작성한 글꼴부터 적용 가능 여부를 판단한다.

이러한 특징 때문에 font-family 속성으로 명시한 글꼴을 불러오지 못할 경우를 대비해  불러오려고 한 글꼴과 가장 유사한 형태의 글꼴 유형을 마지막에 항상 지정해야 한다.

가장 마지막에 오는 폰트를 글꼴 유형이라고 하며, 글꼴 유형은 글꼴의 개념이 아니라 글꼴의 형태를 의미한다.

따라서 다른 글꼴처럼 못 불러온다는 개념이 없다.

글꼴 유형의 종류는 아래와 같다.

 

font-size 속성

font-size 속성은 텍스트 크기를 변경하고 싶을 때 사용하는 속성이다.

속성값으로는 단위를 포함한 크기를 넣는다.

웹 브라우저의 기본 스타일 시트에 따로 텍스트 크기가 지정된 경우(hn 태그)가 아니면 일반적인 텍스트 크기는 16px이다.

 

font-weight 속성

font-weight 속성은 텍스트의 굵기를 지정하는 데 사용한다.

굵기를 나타내는 속성 값에는 숫자 표기법과 키워드 표기법을 사용할 수 있다.

 

숫자 표기법

숫자 표기법은 숫자 100 단위로 텍스트 굵기를 표기하는 방법으로, 100부터 900까지의 값을 사용한다.

100이 가장 얇고 900이 가장 굵게 표시된다.

하지만 해당 글꼴이 얼마까지 굵기를 지원하는지 확인해야 하고, 해당 글꼴이 지원하는 굵기를 초과한 값을 지정하면 해당 글꼴에서 가장 굵기가 적용된다.

 

키워드 표기법

텍스트 굵기를 키워드로 표시하는 방법인데, 여기서는 lighter, normal, bold, bolder를 의미한다.

normal은 숫자 표기법에서 400과 같은 굵기고, bold는 700과 같은 굵기이다.

lighter와 bolder는 상대적인 값으로, lighter는 부모 요소의 굵기보다 얇게 지정되고, bolder는 부모 요소의 굵기보다 굵게 지정된다.

실무에서는 normal이나 bold를 주로 사용한다.

 

font-style 속성

font-style 속성은 글꼴의 스타일을 지정할 때 사용한다.

italic은 글꼴에서 지원하는 이탤릭체를 적용한 값이고, oblique은 단순히 글자를 기울여서 보여주는 것이다.

 

font-variant 속성

font-variant 속성은 영문 텍스트를 크기가 작은 대문자로 변경할 때 사용한다.

 

<!DOCTYPE html>
<html lang="ko">
  <head>
    <title>font-variant</title>
    <style>
      .variant {
        font-variant: small-caps;
      }
    </style>
  </head>
  <body>
    <p>Lorem ipsum dolor sit.</p>
    <p class="variant">Lorem ipsum dolor sit.</p>
  </body>
</html>

 

color 속성

color 속성은 텍스트의 색상을 지정할 때 사용한다.

속성값에는 색상을 표현하는 값을 적으면 된다.

 

text-align 속성

text-align 속성은 텍스트를 정렬할 때 사용한다.

 

텍스트를 오른쪽으로 정렬하려면 아래와 같이 작성한다.

 

속성 값 중에서 justify는 양쪽 정렬을 의미하는데, 아래의 내용을 살펴보면 이해가 될 것이다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>텍스트 정렬(text-align)</title>
<style>
  p{
    text-align:justify;
  }
</style>
</head>
<body>
  <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Autem, error! Id dolore officiis commodi est ad enim earum magnam possimus assumenda velit qui dignissimos eos nihil mollitia distinctio.</p>
</body>
</html>

정렬 기준이 양쪽이다 보니 웹 브라우저 크기에 맞춰 텍스트와 텍스트 사이의 간격을 임의로 늘려서 표시한다.

 

text-decoration 속성

텍스트를 꾸며 주기 위해 사용한다.

여기서 꾸민다는 것은 텍스트에 선을 긋는 것을 말한다.

 

a 태그를 이용하여 링크를 걸면 기본으로 텍스트 아래에 선이 그어지는 이유가 이 속성의 값이 underline이 되어 있기 때문이다.

따라서 밑줄을 제거하려면 해당 속성의 값을 none으로 바꿔주면 된다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>text-decoration</title>
  <style>
    a{
      text-decoration:none;
    }
  </style>
</head>
<body>
  <a href="#">링크</a>
</body>
</html>

 

letter-spacing 속성

자간을 조절할 때 사용한다.

자간은 글자 사이의 간격을 말하며, 속성값으로 normal 또는 크기를 넣을 수 있다.

normal을 사용하면 웹 브라우저에서 정한 기본값을 적용한다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>letter-spacing</title>
  <style>
    p{
      letter-spacing:15px;
    }
  </style>
</head>
<body>
  <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Odit, porro adipisci?</p>
</body>
</html>

 

line-height 속성

텍스트 한 줄의 높이를 지정할 때 사용하는 속성이다.

속성 값은 아래와 같이 정의할 수 있다.

 

웹 브라우저에 표시되는 텍스트는 아래와 같이 구성된다.

 

우리가 알고 있는 font-size 속성은 말 그대로 글자 자체의 크기를 지정한다.

그러나 모든 텍스트는 웹 브라우저에 표시될 때 위쪽과 아래쪽으로 일정 크기의 여유 공간을 가지고 있다.

이러한 여유 공간을 전부 포함한 글줄 사이의 간격을 행간이라고 하며 line-height 속성으로 제어할 수 있다.

<!DOCTYPE html>
<html lang="en">
<head>
  <title>line-height</title>
  <style>
    p{
      line-height:10px; /* 텍스트 크기보다 작게 지정 */
    }
  </style>
</head>
<body>
  <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam corrupti sunt inventore distinctio earum quod ea labore nisi accusamus commodi repellat nihil ullam ad in hic, laboriosam incidunt minima eius.</p>
</body>
</html>

 

[CSS] CSS 선택자

ReBugs
|2024. 1. 4. 15:17

이 글은 코딩 자율학습 HTML+CSS+JS(저자 : 김기수)의 책 내용과 유튜브 영상을 개인적으로 정리하는 글입니다.


기본 선택자 사용

전체 선택자

전체 선택자는 HTML에서 사용할 수 있는 모든 요소를 한 번에 선택자로 지정하는 방법으로, * 기호를 사용해 표시한다.

<style>
    *{
        color:red;
    }
</style>
<h1>전체 선택자</h1>
<p>전체 선택자는 모든 요소를 한 번에 선택할 수 있다.</p>

 

태그 선택자

태그 선택자는 HTML 태그명으로 선택자를 지정하는 방법이다.

태그 선택자는 선택자에 지정된 태그명과 일치하는 모든 요소를 한 번에 선택한다.

<style>
    p{
        color:red; /*텍스트 색상을 빨강으로 변경*/
    }
</style>
<h1>안녕</h1>
<p>하이 안녕 안녕</p>

 

아이디 선택자

아이디 선택자는 HTML 태그에서 사용할 수 있는 id 속성 값을 이용해 선택자를 지정하는 방법이다.

이때 속성값 앞에는 # 기호를 붙여 구분한다.

<style>
    #title{
        color:red; /*텍스트 색상을 빨강으로 변경*/
    }
</style>
<h1 id="title">안녕</h1>

id 속성값은 고유해야 한다.
HTML에서 id 속성값은 하나의 HTML 문서 안에서 고유한 값이어야 한다.

 

클래스 선택자

클래스 선택자는 HTML 태그에서 사용할 수 있는 class 속성값을 이용해 선택자를 지정하는 방법이다.

이때 속성값 앞에 . 기호를 붙인다.

클래스 선택자는 실무에서 가장 많이 사용하는 선택자 지정 방법이다.

class 속성은 id 속성과 다르게 속성 값을 중복해서 사용할 수 있어서 하나의 클래스 스타일을 잘 정의하면 여러 곳에서 사용할 수 있다.

<style>
    .red{
      color:red;
    }
    .blue{
      color:blue;
    }
  </style>
  <h1 class="red">클래스 선택자</h1>
<p class="blue">class 속성값으로 선택자를 지정합니다.</p>
<p class="blue">class 속성은 id 속성과는 다르게 속성값을 중복해서 사용할 수 있습니다.</p>

 

기본 속성 선택자

속성 선택자는 HTML 태그에서 사용할 수 있는 속성과 값을 사용해 선택자를 지정하는 방법이다.

/*형식*/
[속성]{/* CSS 코드*/}
[속성=값]{/* CSS 코드*/}

 

방식 1

 

<style>
    a[href]{
      color:red;
      display:block; /* a 태그를 block-level 요소로 지정 */
    }
  </style>
<a href="#">기본 a 태그</a>
<a href="#" target="_blank">새 창으로 열리는 a 태그</a>

방식 2

<style>
    a[target="_blank"]{
      color:red;
      display:block; /* a 태그를 block-level 요소로 지정 */
    }
</style>
<a href="#dd">기본 a 태그</a>
<a href="#" target="_blank">새 창으로 열리는 a 태그</a>

속성 선택자는 다른 선택자와 함께 사용 가능
속성 선택자는 아이디, 태그, 클래스 선택자와 함께 사용할 수도 있고, 단독으로 사용할 수도 있다.


 

 

조합 선택자

조합 선택자는 기본 선택자와 함께 사용했을 때 선택자의 의미를 더 풍부하게 해 주는 선택자 방법이다.

 

그룹 선택자

그룹 선택자는 여러 선택자를 하나로 그룹 지을 때 사용한다.

선택자와 선택자는 콤마로 구분한다.

<style>
    p, #title, .red {
      color:red;
    }   
 </style>
<p class="red">red</p>
<p class="blue red">blue red</p>
<p id="title">아아아</p>

 

자식 선택자

자식 선택자는 부모 요소의 하위에 있는 자식 요소에 스타일을 적용할 때 사용한다.

2개 이상의 선택자가 사용되며, 선택자와 선택자는 > 기호로 구분한다.

자식 선택자를 사용해 아래의 코드처럼 작성하면 class 속성값이 box인 요소와 자식 관계인 p 태그로 작성된 요소만 선택자로 지정한다.

<style>
    .box > p{
        color:red;
    }
</style>
<div class="box">
    <p>lorem 1</p>
    <div>
        <p>lorem 2</p>
    </div>
    <p>lorem 3</p>
</div>

 

하위 선택자

하위 선택자는 선택자의 범위를 특정 부모 요소의 하위 요소로 한정하는 방법이다.

2개 이상의 선택자를 사용하고, 선택자와 선택자는 공백으로 구분한다.

<style>
    div p{
      color:red;
    }
  </style>
<div>
    <p>lorem 1</p>
    <ul>
        <li>
            <p>lorem 2</p>        
        </li>
        <li>
            <p>lorem 3</p>
        </li>
    </ul>
</div>
<p>lorem 4</p>

 

인접 형제 선택자

인접 형제 선택자는 앞에서 지정한 선택자 요소 바로 다음에 있는 형제 관계 요소를 선택자로 지정한다.

2개 이상의 선택자를 사용하고, 선택자와 선택자는 + 기호로 구분한다.

<style>
    h1 + h2{
      color:red
    }
</style>
<h1>lorem1</h1>
<h2>lorem2</h2>
<h2>lorem3</h2>

인접 형제 선택자 사용 시 주의점
인접 형제 선택자는 이전 요소 다음에 등장하는 형제 요소를 선택한다.
따라서 이전 요소보다 먼저 등장한 요소는 선택 대상이 아니다.

 

일반 형제 선택자

일반 형제 선택자는 이전 선택자 뒤에 오는 형제 관계 요소를 모두 선택자로 지정한다.

2개 이상의 선택자를 사용하며, 선택자와 선택자는 ~ 기호로 구분한다.

<style>
    h1 ~ h2{
      color:red
    }
</style>
<h1>lorem1</h1>
<h2>lorem2</h2>
<h2>lorem3</h2>

 

일반 형제 선택자도 인접 형제 선택자와 마찬가지로 이전 요소 다음에 등장하는 형제 관계의 요소를 대상으로 지정한다.
이전 요소보다 먼저 등장하는 형제 관계의 요소는 선택자 지정 대상이 아니다.

 

가상 요소 선택자

가상 요소 선택자는 HTML 문서에 명시적으로 작성된 구성 요소는 아니지만, 마치 존재하는 것처럼 취급해 선택하는 선택자 지정 방법을 말한다.

앞에 :: 기호를 붙여서 사용하며, 기준 선택자와 함께 사용한다.

만약 기준 선택자를 생략하면 전체 선택자가 들어간 것으로 적용된다.

가상 요소 선택자는 대략 14개 정도 있다.

이 글에서 다룰 가상 요소 선택자는 2개이다.

종류 설명
::before 콘텐츠 앞의 공간을 선택
::after 콘텐츠 뒤의 공간을 선택

::before 선택자는 기준 선택자 요소 앞의 공간을 선택하고, ::after 선택자는 기준 선택자 요소 뒤의 공간을 선택한다.

content 속성은 ::before 선택자와 ::after 선택자에서만 사용하는 속성으로, 새로운 콘텐츠를 만들거나 추가할 때 사용

<style>
    p::before{
      content:"<before>";
      color: red;
    }
    p::after{
      content:"<after>";
    }
</style>
<p>Lorem, ipsum dolor.</p>

 

가상 클래스 선택자

가상 클래스 선택자

링크 가상 선택자는 a 태그에서 발생할 수 있는 링크 상태를 이용해 선택하는 방법이다.

링크 가상 클래스 선택자는 a 태그에서 발생할 수 있는 링크 상태를 이용해 선택하는 방법이다.

종류 설명
:link 한 번도 방문하지 않은 링크일 때 선택
:visited 한 번이라도 방문한 적이 있는 링크일 때 선택
<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>링크 가상 클래스</title>
    <style>
      a:link {
        color:orange;
      }
      a:visited {
        color:green;
      }
    </style>
  </head>
  <body>
    <a href="https://www.naver.com">네이버</a>
    <a href="https://www.google.com">구글</a>
  </body>
</html>

 

동적 가상 클래스 선택자

동적 가상 클래스 선택자는 사용자의 어떤 행동에 따라 동적으로 변하는 상태를 이용해 선택자를 지정하는 방법이다.

종류 설명
:hover 요소에 마우스를 올리면 해당 태그가 선택자로 지정
:active 요소를 마우스로 클릭하고 있는 동안 해당 태그가 선택자로 지정
<!DOCTYPE html>
<html lang="ko">
<head>
  <title>:hover</title>
  <style>
    p:hover{
      color:red;
    }
  </style>
</head>
<body>
  <p>hover</p>
</body>
</html>

마우스를 위에 올리면 색이 변함

<style>
    button:active{ /*요소를 클릭하고 있을 때 적용*/
      color:red;
    }
</style>

마우스를 클릭하고 있는 동안 색이 변함

 

입력 요소 가상 클래스 선택자

입력 요소의 특정 상태를 이용해 선택자로 지정하는 방법이다.

종류 설명
:focus 입력 요소에 커서가 활성화되면 선택자로 지정
:checked 체크박스가 표시되어 있으면 선택자로 지정
:disabled 상호작용 요소가 비활성화되면(disabled 속성이 사용되면) 선택자로 지정
:enabled 상호작용 요소가 활성화되면(disabled 속성이 사용되지  않은 상태면) 선택자로 지정
입력 요소 : input, textarea
체크박스 : input 태그의 type이 checkbox인 요소
상호작용 요소 : 입력 요소와 체크박스를 포함하는 모든 상호작용이 가능한 요소

 

:focus

입력 요소에 커서가 활성화되면 스타일을 적용

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>:focus</title>
  <style>
    input:focus{
      color:red;
    }
  </style>
</head>
<body>
  <input type="text">
</body>
</html>

입력이 활성화되면 색이 변함

 

:checked

체크박스가 표시되어 있으면 스타일 적용

<!DOCTYPE html>
<html lang="en">
<head>
  <title>:checked</title>
  <style>
    input:checked + label{
      color:red;
    }
  </style>
</head>
<body>
  <input type="checkbox" id="userid">
  <label for="userid">아이디</label>
</body>
</html>

 

:disabled

상호작용 요소가 비활성화되어 있으면 스타일 적용

<!DOCTYPE html>
<html lang="ko">
  <head>
    <title>:disabled</title>
    <style>
      input:disabled,
      button:disabled {
        background-color: #ccc;
      }
    </style>
  </head>
  <body>
    <input type="text" disabled />
    <button disabled>버튼</button>
  </body>
</html>

 

:enbled

상호작용 요소가 활성화되어 있으면 스타일을 적용

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>::enabled</title>
    <style>
      input:enabled,
      button:enabled {
        background-color:#ccc;
      }
    </style>
  </head>
  <body>
    <input type="text">
    <button>버튼</button>
  </body>
</html>

 

구조적 가상 클래스 선택자

구조적 가상 클래스 선택자는 HTML 태그의 사용 위치, 다른 태그와의 관계에 따라 요소를 선택하는 방법

 

:first-child와 :last-child

:first-child 선택자는 부모인 E 요소의 첫 번째 자식 요소를 선택하고, :last-child 선택자는 마지막 자식 요소를 선택

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>:first-child, :last-child</title>
  <style>
    li:first-child{
      color:red;
    }
    li:last-child{
      color:red;
    }
  </style>
</head>
<body>
  <ul>
    <li>lorem 1</li>
    <li>lorem 2</li>
    <li>lorem 3</li>
    <li>lorem 4</li>
  </ul>
</body>
</html>

 

:nth-child(n)과 :nth-last-child(n)

:nth-child(n) 선택자는 E 요소가 부모의 모든 자식 요소 중 n 번째 자식 요소가 맞으면 선택

nth-last-child(n) 선택자도 부모 요소의 자식 요소 중 끝에서부터 찾는 점만 빼면 위와 동일하다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>nth-child(n)</title>
  <style>
    p:nth-child(1){
      color:red;
    }
  </style>
</head>
<body>
  <p>lorem 0</p>
  <div>
    <p>lorem 1</p>
    <p>lorem 2</p>
  </div>
  <div>
    <p>lorem 3</p>
    <p>lorem 4</p>
  </div>
</body>
</html>

 

:first-of-type과 :last-of-type

:first-of-type

:first-of-type 선택자는 부모의 자식 중에서 첫 번째로 등장하는 E 요소를 선택

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>:first-of-type</title>
  <style>
    p:first-of-type{
      color:red;
    }
  </style>
</head>
<body>
  <span>span0</span>
  <p>lorem 0</p>
  <div>
    <span>span1</span>
    <p>lorem 1</p>
    <p>lorem 2</p>
  </div>
  <span>span2</span>
  <span>span3</span>
  <p>lorem 3</p>
  <p>lorem 4</p>
</body>
</html>

 

:last-of-type

:last-of-type 선택자는 부모의 자식 중에서 마지막에 나오는 E 요소를 선택

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>:last-of-type</title>
  <style>
    p:last-of-type{
      color:red;
    }
  </style>
</head>
<body>
  <span>span0</span>
  <p>lorem 0</p>
  <div>
    <p>lorem 1</p>
    <p>lorem 2</p>
    <span>span1</span>
  </div>
  <span>span2</span>
  <p>lorem 3</p>
  <p>lorem 4</p>
  <span>span3</span>
</body>
</html>

 

다양한 선택자 조합

선택자는 서로 조합해서 사용할 수 있다.

아래와 같은 선택자 조합은 실무에서도 흔하게 사용하며 문법적으로도 허용된다.

 

일반적이지는 않지만 아래와 같은 형태도 가능하다.

 

또는 가상 클래스와 하위 선택자, 자식 선택자를 조합한 형태도 가능하다.

이 글은 코딩 자율학습 HTML+CSS+JS(저자 : 김기수)의 책 내용과 유튜브 영상을 개인적으로 정리하는 글입니다.


CSS : Cascading Style Sheets

 

문법 형식

CSS 문법은 크게 선택자와 선언부로 구분한다.

  • 선택자 : CSS 스타일을 적용할 HTML 태그(요소)를 선택하는 영역
  • 선언부 : 선택자에서 선택한 태그에 적용할 스타일을 작성하는 영역, 중괄호 안에 작성
    선언부에 작성하는 스타일은 반드시 속성과 값을 한 쌍으로 작성
    값의 뒤에 세미콜론을 넣으면 여러 스타일을 연속해서 작성 가능
<style>
    h1{
        font-size:24px; /*텍스트 크기를 24픽셀로 변경*/
        color:red; /*텍스트 색상을 빨강으로 변경*/
    }
</style>
<h1>안녕</h1>

줄 바꿈과 들여 쓰기
CSS 코드를 작성할 때, 줄 바꿈과 들여 쓰기를 꼭 할 필요는 없다.
그러나 줄 바꿈과 들여쓰기를 적절하게 사용하면 코드의 가독성을 크게 향상할 수 있다.

 

스타일 시트

스타일 시트를 작성하는 방법에는 아래와 같은 방법이 있다.

  • 내부 스타일 시트 : HTML 내부에 CSS 코드 작성
  • 외부 스타일 시트 : CSS 파일에 CSS 코드 작성
  • 인라인 스타일 : HTML 태그에 직접 스타일 작성

 

내부 스타일 시트

내부 스타일 시트는 HTML 파일 내부에 CSS 코드를 작성하는 방법이다.

HTML에서 제공하는 태그 중에 style 태그가 있는데, styl 태그의 콘텐츠로 CSS 코드를 작성하면 된다.

<style>
    /*CSS 코드 작성*/
</style>

style 태그를 사용하는 위치는 정해진 기준이 없지만, 보통 head 태그 안에 사용한다.

 

외부 스타일 시트

외부 스타일 시트는 CSS 코드를 작성하는 별도 파일을 만들어 HTML 문서와 CSS를 연결하는 방법이다.

이때, 별도의 파일 확장자는 css여야 한다.

HTML 문서에 연결할 때는 link 태그를 사용한다.

 

test.css

h1{
    color:red;
}

 

index.html

<body>
    <link rel="stylesheet" href="./test.css">
    <h1>안녕</h1>
</body>
./ : 현재 폴더(같은 폴더)
../ : 상위 폴더

 

인라인 스타일 사용

인라인 스타일은 HTML 태그에서 사용할 수 있는 style 속성에 CSS 코드를 작성하는 방법이다.

태그에 직접 CSS 코드를 작성하는 방식이라서 CSS의 기본 문법 형식에서 선택자 부분이 필요가 없다.

<body>
    <h1 style="color:red; font-size:24px">안녕</h1>
</body>

 

위 3가지 방법 중 어떤 방법이 좋은지는 상황에 따라 다를 수 있어서 정답은 없다.
다만, 실무에서는 외부 스타일 시트 방법을 사용한다.
유지보수가 편하고 성능적으로도 가장 좋기 때문이다.

 

본 게시글은 모두의 git,github(저자 : 강민철)의 내용을 개인적으로 정리하는 글입니다.


기본적인 명령어

기본 경로에 만들기

  • git init

 

원하는 경로에 만들기

  • cd 원하는 경로 (폴더가 이미 생성되어 있어야 함)
  • git init

 

현재 경로 확인

  • pwd

 

작업 디렉터리 상태확인

  • git status

 

스테이지에 올리기

  • git add

 

add 전과 후

 

변경 사항을 한꺼번에 추가하려면

  • git add .

 

커밋하기

  • git commit -m "커밋 메시지"
  • git commit -message "커밋 메시지"

 

커밋 목록 출력

  • git log

 

add와 commit 동시에 하기

  • git commit -am "커밋 메시지"
  • git commit -a -m "커밋 메시지"
  • git commit -all -message "커밋 메시지"
위 명령어는 tracked 파일에만 사용 가능하다.

 

디테일한 커밋 메시지 작성

  • git commit

위 캡쳐는git commit 명령어로 인해 Vim 창이 뜬 것

a 또는 i를 입력하면 입력 모드로 전환되며, 하단에 INSERT가 뜬다.

이제 제목 - 본문으로 구성된 커밋 메시지를 작성할 수 있다.

커밋 메시지를 모두 작성하였으면 ESC키를 누르고, ESC를 누르면 아래의 INSERT가 사라졌을 것이다.

:w 를 입력하고 엔터를 누르고 :q를 다시 누르거나

:wq를 누르면 저장과 입력창 닫기가 모두 된다.

 

커밋 조회하기

가장 단순한 커밋 조회 명령어는 아래와 같다.

  • git log --oneline

 

자세한 커밋 과정을 보여주는 명령어는 아래와 같다.

  • git log --patch
  • git log -p

 

커밋을 그래프 형태로 출력

  • git log --graph

브랜치가 여러 개로 나뉘어지고 합쳐지는 환경이면 위 명령어는 유용하다

 

모든 브랜치의 커밋 목록 조회

git log는 기본적으로 현재 브랜치를 기준으로 커밋 목록을 조회한다.

하지만 아래의 명령어는 모든 브랜치의 커밋 목록을 조회한다.

따라서 어디로 체크아웃 했는지와 상관없이 동일한 결과를 나타낸다.

 

태그 추가하기

  • git tag 태그

 

특정 커밋에 태그 추가

  • git tag 태그 커밋해시

짧은 커밋해시를 입력해도 상관없다.

 

태그 조회

  • git tag --list
  • git tag -l

 

태그 삭제

  • git tag --delete 태그
  • git tag -d 태그

 

정리

 

버전 관리 명령어

최근 커밋과 작업 디렉터리 비교

커밋한 이후로 작업 디렉터리에서 무엇을 수정했는지 확인하기 위해 아래의 명령어 사용

  • git diff

 

최근 커밋과 스테이지 비교

스테이지에 추가된 항목과 최근 커밋의 차이를 비교하기 위해 아래의 명령어 사용

  • git diff --staged

 

커밋간 차이 확인

  • git diff 커밋해시 커밋해시

주의해야할 점은 왼쪽 커밋을 기준으로 오른쪽 커밋에서 달라진 점을 출력한다는 것이다.

 

HEAD를 기준으로 커밋 비교

HEAD는 현재 브랜치의 최신 커밋을 가리킨다.

따라서 HEAD^ 또는 HEAD~1은 현재 브랜치의 최신 커밋에서 하나 이전 커밋을 가리킨다.

HEAD^^ 또는 HEAD~2는 최신 커밋에서 두 개 이전 커밋을 가리킨다.

따라서 HEAD 뒤에 붙는 ^의 개수 또는 HEAD~ 뒤에 붙는 숫자는 HEAD에서 몇 번째 이전을 나타내는지를 말한다.

  • git diff HEAD^
  • git diff HEAD~N

 

브랜치끼리 비교

  • git diff 브랜치명 브랜치명

왼쪽 브랜치를 기준으로 오른쪽 브랜치에서 달라진 점을 출력한다.

 

reset

커밋해시에는 돌아갈 커밋 해시를 입력한다.

커밋해시 대신에 HEAD^나 HEAD~N을 넣어도 된다.

soft reset

  • git reset --soft 커밋해시

mixed reset

  • git reset --mixed 커밋해시

hard reset

  • git reset --hard 커밋해시

 

revert

revert는 해당 커밋을 취소한 새로운 커밋을 추가하는 방식이다.

즉, 해당 커밋으로 되돌아간 상태를 새롭게 커밋하는 것이다.

커밋해시 대신에 HEAD^나 HEAD~N을 넣어도 된다.

  • git revert 커밋해시

revert 명령어는 Vim 창이 나타난다.

 

stash

스태시 명령은 기본적으로 tracked 상태의 파일에 대해서만 사용할 수 있다.

  • git stash
  • git stash -m "메시지"
  • git stash -message "메시지"

 

stash list

스태시한 리스트를 조회하는 명령어는 아래와 같다.

  • git stash list

최근에 stash한 작업일 수록 {}안에 들어가는 숫자가 작다.

메시지를 입력하지 않은 스태시

WIP는 Work In Porgress의 준말이고, 어느 브랜치에서 스태시 되었는지, 스태시가 만들어진 커밋해시, 스태시가 만들어졌던 커밋 메시지가 출력된다.

 

stash 적용

아래의 명령어는 임시 저장한 stash를 다시 불러오는 것이다.

스태시번호를 입력하지 않을경우 가장 최근에 스태시(stash@{0})한 것이 불러와진다.

  • git stash apply stash@{N}

 

stash 삭제

  • git stash drop stash@{N}

스태시 전체삭제
git stash clear

 

작업중인 브랜치 확인

  • git branch

 

브랜치 만들기

  • git branch 브랜치명

 

브랜치 체크아웃

  • git checkout 브랜치명

 

브랜치를 만듦과 동시에 체크아웃

  • git checkout -b 브랜치명

 

브랜치 병합

  • git merge 브랜치명

 

충돌 해결

병합 과정에서 충돌이 발생할 수 있다.

그러면 해당 파일에서 직접 수정해야한다.

즉, 어떤 브랜치의 내용으로 내용을 병합할지 선택해야 한다.

나는 master 브랜치의 내용 선택(현재 HEAD가 master 최신 커밋이므로)하겠다.

 

이후 스테이지에 추가하고, 커밋하면 성공적으로 병합이된다.

 

브랜치 삭제

  • git branch --delete 브랜치명
  • git branch -d 브랜치명

 

브랜치 재배치

먼저 재배치하려는 브랜치로 체크아웃 한 뒤 아래의 명령어를 입력해야한다.

  • git rebase 브랜치명

이렇게 되면 master 의 최신 커밋 부분에 foo 브랜치가 재배치 된 것이다.

 

정리

 

GitHub(원격 저장소)와 상호작용

clone

  • git clone repository주소

특정 경로로 클론받기
git clone repository주소 클론받을경로

 

로컬 저장소에 원격 저장소 추가

  • git remote add 원격저장소이름  repository주소

이렇게 하면 해당 원격 저장소와 상호작용할 수 있다.

 

추가된 원격 저장소 목록

  • git remote

 

원격 저장소 이름 바꾸기

  • git remote rename 기존이름 바꿀이름

 

원격 저장소 삭제

  • git remote remove 원격저장소이름

 

push

로컬 저장소에서 작업을 하고, 커밋을 한뒤 아래의 명령어를 입력한다.

  1. git branch -M main
  2. git push -u origin main

위 명령어는 현재 체크아웃 된 브랜치(master) 이름을 main으로 변경하고, 원격 저장소 origin으로 로컬 저장소 main 브랜치의 변경사항을 푸시하는 명령이다.

브랜치 이름을 변경하였다면 아래의 명령어만으로 푸시하면 된다.

  • git push -u origin main

 

fetch

  • git fetch
  • git fetch 원격저장소이름

 

원격 저장소로 체크아웃

  • git checkout 원격저장소명/브랜치명
  • git checkout FETCH_HEAD

git checkout FETCH_HEAD 명령어는 최근에 패치한 브랜치의 최신 커밋으로 체크아웃 한다.

 

pull

pull은 fetch와 merge를 동시에 하는 것이다.

  • git pull
  • git pull 원격저장소명

 

pull request

  1. 기여하려는 저장소를 본인 계정으로 포크
  2. 포크한 저장소 클론
  3. 브랜치 생성 후 생성한 브랜치에서 작업하기
  4. 작업한 브랜치 푸시
  5. 풀 리퀘스트

 

이미 원격 저장소를 포크한 이후에 커밋이 뒤쳐져 있다면

1, 2, 3, 4 번 작업까지 완료하였다면 깃허브로 돌아가서

 

정리

본 게시글은 모두의 git,github(저자 : 강민철)의 내용을 개인적으로 정리하는 글입니다.


깃허브는 아래의 두 가지 쓰임새가 있다.

  • 개발자의 SNS
  • 개발자 간 협업을 가능케 하는 원격 저장소 호스팅 서비스

Git은 우리의 컴퓨터 속에만 존재하는 저장소이다.

이는 로컬에 있는 저장소, 즉 로컬 저장소라고 부른다.

반면 원격 저장소는 우리들의 컴퓨터 속에만 있는 저장소가 아닌, 인터넷 세상 어딘가에 있는 다른 컴퓨터 속의 저장소를 의미한다.

깃허브의 원격 저장소는 깃허브가 관리하는 컴퓨터 속의 저장소를 의미한다.

원격 저장소를 통해 백업과 협업에 이점이 있다.

 

원격 저장소와의 네 가지 상호작용

원격 저장소와의 상호 작용은 크게 네 가지이다.

  • clone : 원격 저장소 복제
  • push : 원격 저장소 밀어넣기
  • fetch : 원격 저장소를 merge 않고 가져오기
  • pull : 원격 저장소를 가져오고 merge

 

소스트리와 깃허브 연동하기

먼저 소스트리와 깃허브가 SSH 통신할 수 있도록 연동해야 한다.

SSH(Secure Shell)는 안전하게 정보를 주고받을 수 있는 통신 방법이다.

SSH 통신하려면 먼저 key 두 개를 생성해야 한다.

  • public key : 공개 키는 자신과 깃허브 둘 다 서로 가지고 있는 공개된 키를 말한다.
  • private key : 개인 키는 자신만 가지고 있어야 하는 개인적인 키를 말한다.

 

SSH 키는 ssh-keygen이라는 간단한 명령으로 생성할 수 있다.

git bash를 연다.

ssh-keygen을 입력하면 개인 키(id_rsa)를 저장할 경로를 선택하라는 문구가 나온다.

이미 SSH 키가 등록되어 있다면 아래의 명령어로 삭제하면 된다.
rm -rf .ssh
id_rsa와 id_ed의 차이
아래의 사진과 같이 나는 id_ed파일이다.
그래서 GPT에게 물어보았다.

 

이후 패스워드를 입력해 준다. (두 번)

 

그러면 SSH 키가 생성되었다.

개인키는 id_rsa라는 파일이고, 공개 키는 id_ras.pub 파일이다.

소스트리에서 도구 - 옵션을 누른다.

 

SSH 클라이언트 설정에서 클라이언트 키를 OpenSSH로 바꾼다.

 

이후 SSH 키 추가를 해준다.

SSH키 경로는 위에 git bash에 적혀있다.

이 과정에서 cmd 창이 뜰 수 있는데 그때는 gitbash에서 설정한 암호를 입력하면 된다.

 

이후 깃허브 홈페이지에 들어가서 settings - access탭의 ssh and gpg keys를 선택한다.

 

new ssh key를 선택하고

 

이후 SSH 이름을 적고 key 항목에

공개 키 파일을 열어서 거기에 적혀있는 것을 죄다 복사해서 붙여 넣는다.

 

 

이러면 깃허브에게 공개키를 알려준 것이다.

 

다시 소스트리로 돌아가서 Remote 버튼을 눌러서 계정을 추가한다.

 

아래와 같은 화면이 나오면 아래로 스크롤해서

 

녹색 버튼을 누른다.

 

인증 성공이라는 표시가 뜨면 성공적으로 연동된 것이다.

 

이후 새로고침을 눌러서 원격 저장소를 선택하면 된다.

여기까지 순조롭게 완료되었다면 소스트리와 깃허브가 연동된 것이다.

 

clone

깃허브상에 존재하는 원격 저장소를 우리의 컴퓨터, 즉 로컬로 복사하여 가져와야 한다.

 

가져오고 싶은 깃허브 원격 저장소 주소를 복사한다.

 

이후 소스트리에 클론을 한다.

 

물론 자신의 원격 저장소를 클론 할 수도 있다.


브랜치 이름에 주목하자

깃에서 관리하는 기본 브랜치는 master 브랜치인데, main 브랜치는 master 브랜치와 같다.

깃허브에서는 기본 브랜치를 main 브랜치라고 부른다.

origin/HEAD 는 원격 저장소의 HEAD, origin/main 는 원격 저장소의 기본 브랜치를 말한다.

main은 원격 저장소를 로컬 저장소로 가져옴으로써 로컬 저장소의 기본 브랜치를 뜻하고,
orign/main은 원격 저장소의 기본 브랜치를 뜻하고,
orign/HEAD은 원격 저장소의 HEAD(작업 위치)를 뜻한다.

 

origin은 원격 저장소에 붙은 이름일 뿐이므로 언제든 수정할 수 있다.

 

push

push는 원격 저장소에 로컬 저장소의 변경 사항을 밀어 넣는 것을 의미한다.

작업 디렉터리에서 작업을 한 뒤 커밋을 하고

원격 저장소와 로컬 저장소를 동일하게 만들려면 변경 사항을 원격 저장소에 푸시해야 한다.

 

이렇게 푸시를 하고 나면 커밋이 추가되고 깃허브에도 커밋 수가 늘게 된다.

 

fetch

원격 저장소를 여러 개발자가 협업하여 개발하고 있는 상황이라면 다른 개발자가 언제든 새로운 변경 사항을 추가할 수 있기 때문에 해당 저장소는 시시각각 변할 수 있다.

다른 개발자가 푸시한 내용을 로컬로 가져오고 싶을 때 패치를 사용할 수 있다.

즉, 원격 저장소의 변경 사항을 로컬로 가져오고 싶을 때 패치를 사용한다.

 

소스트리에서 패치를 클릭

 

확인버튼 클릭

패치가 완료되면 깃허브에서 작성한 최근 커밋을 볼 수 있다.

로컬의 main 브랜치는 이전의 커밋을 가리키고, origin/main 브랜치는 최신 커밋을 가리킨다.

즉, 패치해도 원격 저장소의 내용이 로컬 저장소에 병합되지 않는다.

 

pull

fatch가 단순히 가져오는 것이라면 pull은 fatch와 merge가 같이 일어나는 것이다.

 

소스트리에서 Pull을 클릭한다.

 

이렇게 하면 원격 저장소의 변경 사항이 즉시 로컬로 병합된다.

 

pull request

자신이 소유하지 않은 원격 저장소에 특정한 방법으로 푸시를 할 수 있지만 일반적으로는 불가능하다.

원격 저장소에 누구나 푸시할 수 있다면 여러 문제가 발생할 수 있다.

 

 

푸시 권한이 없는 원격 저장소에 코드를 푸시하려면 풀 리퀘스트를 통해 할 수 있다.

원격 저장소가 내 변경사항을 풀(pull) 하도록 요청(request)하는 것이다.

풀 리퀘스트는 아래와 같은 단계로 이뤄진다.

  1. 기여하려는 저장소를 본인 계정으로 포크 하기
  2. 포크 한 저장소를 클론 하기
  3. 브랜치 생성 후 생성한 브랜치에서 작업하기
  4. 작업한 브랜치 푸시하기
  5. 풀 리퀘스트 보내기

 

풀 리퀘스트의 첫 번째 단계는 기여하려는 저장소를 본인 계정으로 포크 하는 것이다.

포크(fork)는 원격 저장소를 본인의 계정으로 복제하는 것이다.

 

포크를 하면 본인의 계정으로 해당 저장소가 복제된다.

소유하지 않은 원격 저장소에는 푸시할 수 없지만, 본인 계정으로 포크 한 원격 저장소에는 푸시할 수 있다.

 

이후 포크한 저장소를 클론 한다.

추가적으로 클론 뒤에 브랜치를 생성하고 해당 브랜치에서 작업을 해야 한다.

작업을 완료했다면 커밋을 하고, 브랜치를 푸시한다.

 

마지막으로 풀 리퀘스트를 보내야 한다.

깃허브로 돌아와서 포크 한 저장소로 들어가면 Compare & full request가 생성되었다.

이후 커밋 메시지와 풀 리퀘스트로 보낼 작업 내용을 확인할 수 있다.

확인했다면 Create pull request를 클릭하면 요청이 완료된다.

 

Collaborator로 추가하여 푸시 권한 주기
원격 저장소 소유자가 다른 사람을 Collaborator로 추가한 경우에는 소유하지 않은 계정의 원격 저장소에 풀리퀘스트 없이 푸시할 수 있다.

Collaborator 추가할 계정을 입력하면 요청이 된다. 요청을 받은 계정이 이를 승인하면 해당 계정은 풀리퀘스트 없이 푸시할 수 있다.

본 게시글은 모두의 git,github(저자 : 강민철)의 내용을 개인적으로 정리하는 글입니다.


브랜치란?

브랜치는 마치 줄기에서 뻗어 나오는 나뭇가지와 같이 버전을 여러 흐름으로 나누어 관리하는 방법이다.

 

브랜치는 버전의 분기이다.

작업을 분기하고 싶을 때 브랜치를 나누면 된다.

버전을 나누어 관리하는 것은 아래의 3단계로 버전을 관리하는 것을 의미한다.

  1. 브랜치를 나눈다.
  2. 각자 브랜치에서 작업한다.
  3. (필요할 경우) 나눈 브랜치를 합친다.

 

브랜치 나누고, 합치기

깃이 제공하는 가장 기본적인, 최초의 브랜치를 master 브랜치라고 한다.

가령 로컬 저장소를 만들고, 커밋 세 개를 만들었다고 가정하자

이 커밋 모두는 master 브랜치에 속한다.

master 브랜치에 만들어진 세 커밋을 master 1번 커밋, master 2번 커밋, master 3번 커밋이라고 한다면

마스터 브랜치는 아래와 같다.

 

master의 최신 커밋에서 foo라는 브랜치를 만들고, foo 브랜치에 커밋을 두 개 추가하면 아래의 왼쪽과 같다.

이후 master의 최신 커밋에서 새로운 커밋을 추가하면 아래의 오른쪽과 같다.

여기서 주목해야 할 점은 master 브랜치 입장에서는 커밋이 세 개 밖에 없다는 점이다.
반면, foo 브랜치 입장에서는 커밋이 5개이다.
foo는 master 브랜치의 세 번째 커밋에서 뻗어 나온 브랜치이기 때문에 master 브랜치의 커밋 세 개를 모두 포함하고 있기 때문이다.

 

여기서 master의 4번 커밋에서 bar라는 브랜치를 나누고, bar에 두 개의 커밋을 추가하면 아래의 그림과 같다.

 

HEAD와 체크 아웃

HEAD는 현재 작업 중인 브랜치의 최신 커밋을 가리키는 일종의 표시이다.

보통은 현재 작업 중인 브랜치의 최신 커밋을 가리키지만, 브랜치를 나누고 합치는 과정에서 HEAD의 위치를 자유자재로 바꿀 수 있다.

 

체크아웃은 특정 브랜치에서 작업할 수 있도록 작업 환경을 바꾸는 것을 의미한다.

특정 브랜치로 체크아웃하게 되면 HEAD의 위치가 해당 브랜치의 최신 커밋을 가리키고, 작업 디렉터리는 체크아웃한 브랜치의 모습으로 바뀌게 된다.

 

브랜치 나누고, 합치기 소스트리 실습

브랜치 나누기

위 그림과 같이 브랜치를 나눠보자

현재 master 브랜치 3번째 커밋 상태이다.

 

여기서 상단의 브랜치 버튼을 누른다.

 

브랜치 이름을 입력하고, 새 브랜치 체크아웃을 체크한다.

foo 브랜치로 체크아웃한다는 뜻은 작업 환경을 foo 브랜치로 바꾼다는 의미이다.

마지막으로 브랜치생성 버튼을 누른다.

 

아래처럼 foo가 진하게 표시되어 있다면 현재 작업 환경이 foo 브랜치임을 나타낸다.

 

이후 foo 브랜치에서 커밋 두 개를 추가한다.

 

현재 상황은 아래와 같다.

 

위에서 언급했듯이 이 상황에서 foo 브랜치가 아니라 master 브랜치로 체크아웃하면 HEAD는 master 3번 커밋을 가리키게 되고, 작업 디렉터리의 파일들도 master 3번 커밋으로 되돌아가게 된다.

 

master의 최신 커밋인 4번 커밋에서 bar 브랜치를 추가하고, 커밋 세 개를 추가하자.

 

여기까지 완료했다면 현재 상황은 아래와 같다.

 

브랜치 병합

브랜치를 하나로 통합하는 것을 병합, 영어로 merge라고 한다.

 

빨리 감기 병합(fast-forward merge)

위에서 작업했던 브랜치를 예로 들면, master 브랜치와 foo 브랜치를 병합하면 아래와 같은 모양이 된다.

master 브랜치 입장에서는 자신의 브랜치가 마치 빨리 감기 하듯이 foo 브랜치와 동일하게 업데이트되었다.

이처럼 master 브랜치가 빨리 감기 하듯 foo와 동일해질 수 있었던 이유는, foo 브랜치가 master 브랜치에서부터 뻗어 나온 시점부터 병합되는 순간까지 master 브랜치에 어떤 변화도 없었기 때문이다.

그렇기 때문에 foo 브랜치를 master 브랜치로 병합할 때 master 브랜치는 그저 foo 브랜치에 새롭게 쌓인 커밋을 반영만 하면 된다.

이처럼 변화가 없었던 브랜치가 마치 빨리 감기 하듯 업데이트되는 병합 기법을 빨리 감기 병합(fast-forward merge)라고 한다.

 

빨리 감기 병합 소스트리 실습

먼저 master 브랜치로 체크아웃한다.

 

이후 foo 브랜치 위에 마우스를 두고 마우스 오른쪽 버튼을 클릭한다.

여기서 현재 브랜치로 foo 병합 버튼을 누르면 병합이 된다.

확인을 눌러준다.

이제 master 브랜치는 foo 브랜치와 같아졌다.

 

브랜치를 병합하고 나서 더 이상 브랜치에 남은 작업이 없다면 해당 브랜치를 삭제하는 것이 좋다.

foo 브랜치를 삭제해 보자.

브랜치를 삭제하려면 삭제하려는 브랜치가 아닌 다른 브랜치에 체크아웃되어 있어야 한다.

 

foo 브랜치 위에 마우스를 두고 마우스 우클릭을 한다.

 

확인 버튼을 누른다.

 

foo 브랜치가 삭제된 결과는 아래와 같다.

 

 

빨리 감기 병합이 아닌 병합

빨리 감기 병합이 아닌 병합은 bar 브랜치에는 없는 커밋이 master 브랜치에 있고, master 브랜치에는 없는 커밋이 bar 브랜치에 있는 상태에서 두 브랜치를 병합하는 것을 뜻한다.

즉, bar 브랜치가 master 브랜치에서부터 뻗어 나온 시점부터 병합되는 순간까지 master 브랜치에 어떤 변화가 있을 때 병합하는 것을 뜻한다.

이런 상황에서는 새로운 커밋이 생성된다.

 

master 브랜치와 bar 브랜치의 4번 커밋과 병합하면 아래와 같다.

 

이후 master 브랜치와 bar 브랜치의 6번 커밋과 병합하면 아래와 같다.

 

 

빨리 감기 병합이 아닌 병합 소스트리 실습

master 브랜치와 bar 브랜치의 4번 커밋과 병합해 보자.

 

상단의 병합에서도 브랜치를 병합할 수 있다.

 

master 브랜치에 병합할 브랜치의 커밋을 클릭한 뒤 확인을 누르면 해당 커밋이 병합된다.

위 그림처럼 bar 브랜치의 4번 커밋을 master 브랜치로 병합하려면 4번 커밋을 클릭한 뒤 확인을 클릭하면 된다.

 

결과는 아래와 같다.

 

 

이번에는 master 브랜치와 bar 브랜치의 6번 브랜치와 병합해 보자

상단의 병합 버튼을 누른 후, bar 브랜치의 6번 커밋을 선택하고 확인을 누른다.

 

결과는 아래와 같다.

 

 

충돌과 해결

충돌

충돌이란 병합하려는 두 브랜치가 서로 같은 내용을 다르게 수정한 상황을 의미한다.

충돌은 여럿이 협업하여 개발할 때 빈번히 발생하므로 언제 발생하고, 어떻게 해결할 수 있는지 꼭 알아야 한다.

 

예를 들어, master 브랜치에서 foo 브랜치가 뻗어 나왔다고 하자.

master 브랜치는 a.txt 파일의 첫 번째 줄을 B로 수정한 다음 커밋했고, foo 브랜치는 a.txt 파일의 첫 번째 줄을 C로 수정한 다음 커밋했다.

이런 상황에서 foo 브랜치를 master 브랜치에 병합한다면 a.txt 에서  충돌이 발생했다고 한다.

충돌이 발생하면 최종적으로 어떤 브랜치의 내용을 반영할지 우리가 직접 선택해야 한다.

위 상황을 소스트리로 나타내면 아래와 같다.

 

이제 병합하면 아래와 같이 오류가 뜬다.

 

a.txt에 변화가 생겼다.

충돌이 발생하면 커밋하지 않은 변경사항이 생기고, 스테이지에 올라가지 않은 파일과 스테이지에 올라간 파일 항목에는 충돌이 발생한 파일이 추가된다.

a.txt를 열어보면 아래와 같다.

 

해결

충돌이 발생한 파일들의 충돌을 해결한 뒤 다시 커밋해야 브랜치가 올바르게 병합된다.

충돌이 발생한 이유는 병합하려는 두 브랜치가 같은 내용을 서로 다르게 수정했기 때문이다.

따라서 충돌이 발생하면 충돌이 발생한 두 브랜치 중 어떤 브랜치의 내용을 병합 결과에 반영할지 선택하면 된다.

같은 내용을 다르게 수정한 브랜치 중 어떤 브랜치 내용을 최종적으로 반영할지를 직접 선택하는 것을 '충돌을 해결한다'라고 한다.

 

a.txt의 내용은 아래와 같다.

충돌이 발생한 파일에는 <<<<<<<<<<<<<<, >>>>>>>>>>>, ========== 기호가 표기된다.

이 기호는 일종의 영역 표기이다.

=======를 기준으로 윗부분은 HEAD가 가리키는 브랜치, 즉 현재 체크아웃한 브랜치의 내용이 적혀있고

아랫부분은 병합하려는 브랜치, 즉 foo 브랜치의 내용이 적혀있다.

이 두 영역 중 반영할 부분을 직접 선택해 충돌을 해결해야 한다.

나는 master 브랜치의 내용을 반영하겠다.

 

스테이지에 올라가지 않은 파일 항목에 있는 a.txt 파일에서 충돌 해결을 클릭하면 '내 것'을 이용해 해결 항목과 '저장소'것을 사용하여 해결 항목이 있다.

'내것'은 현재 체크 아웃된 브랜치의 내용을 병합에 반영하겠다는 의미이다

'저장소'는 병합하려는 브랜치의 내용을 병합에 반영하겠다는 의미이다.

나는 master 브랜치의 내용을 반영할 것이고, 현재 master에 체크아웃되어있기 때문에 '내 것'을 선택하겠다.

확인 버튼을 누른다.

 

이제 소스트리에는 아래와 같이 표기된다.

 

이제 충돌이 해결되었으니 커밋을 해주어야 한다. 

 

커밋까지 완료하면 아래와 같이 된다.

 

브랜치 재배치하기

브랜치 재배치는 브랜치가 뻗어 나온 기준점을 변경하는 것을 말하고, rebase라고 한다.

 

아래의 상황은 위 그림의 왼쪽과 같다.

 

우리는 위 그림의 오른쪽이 되는 것이 목표이다.

브랜치를 rebase 하려면 재배치하려는 브랜치로 체크아웃해야 한다.

따라서 foo 브랜치로 체크아웃한다.

이후 master 브랜치의 4번 커밋으로 브랜치를 재배치할 예정이므로 master의 네 번째 커밋에서 마우스 오른쪽 버튼을 클릭 후 재배치를 클릭한다.

 

확인을 누른다.

 

foo 브랜치가 master 브랜치의 네 번째 커밋으로 rebase 되었다.

물론 rebase 과정에서 충돌이 충분히 일어날 수 있다.