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

이 글은 코딩 자율학습 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가지 방법 중 어떤 방법이 좋은지는 상황에 따라 다를 수 있어서 정답은 없다.
다만, 실무에서는 외부 스타일 시트 방법을 사용한다.
유지보수가 편하고 성능적으로도 가장 좋기 때문이다.