-
CSS 선택자(Selector)와 속성들프론트엔드/CSS 2021. 10. 10. 19:00728x90
* CSS 구조
div{ background-color: blue; }
CSS 는 선택자(selector)와 중괄호({ }) 안의 속성이름(attribute name) : 속성값(attribute value) 이 콜론(:)으로 연결되어 있다. 여기서는 div 가 선택자이다.
의사 클래스 - CSS: Cascading Style Sheets | MDN
CSS 의사 클래스(가상 클래스)는 선택자에 추가하는 키워드로, 선택한 요소가 특별한 상태여야 만족할 수 있습니다. 예를 들어 :hover를 사용하면 포인터를 올렸을 때에만 글씨 색을 바꾸고 싶을
developer.mozilla.org
* 의사 클래스
<button id="submit">제출</button>
#submit{ all: unset; background-color: skyblue; cursor: pointer; padding: 10px; border-radius: 10px; } #submit:hover{ background-color: tomato; }
선택자에 추가하는 키워드로, 선택한 요소가 특별한 상태일때 동작한다. 여기서는 버튼 위에 마우스를 hover 했을때 배경색이 변경된다.
의사 요소 - CSS: Cascading Style Sheets | MDN
CSS 의사 요소(가상 요소)는 선택자에 추가하는 키워드로, 선택한 요소의 일부분에만 스타일을 입힐 수 있습니다. 예를 들어 ::first-line (en-US)을 사용하면 문단 첫 줄의 글씨체만 바꿀 수 있습니다.
developer.mozilla.org
* 의사 요소
<button id="submit">제출</button>
#submit{ all: unset; background-color: skyblue; cursor: pointer; padding: 10px; border-radius: 10px; } #submit::before{ content: "🔔"; }
의사 요소는 선택자에 추가하는 키워드로, 선택한 요소의 일부분에만 스타일을 적용하고 싶을때 사용한다. 여기서는 submit 버튼의 컨텐츠 앞에 종모양의 아이콘을 추가하였다.
* CSS 선택자로 요소를 선택하는 다양한 방법
스타일을 적용할 요소(element)를 선택한다. 예를 들어 div 요소에 스타일을 적용하고 싶다고 해보자.
<div>사진</div>
div{ background-color: orange; }
첫번째 방법은 태그 이름을 직접 명시한다. 여기서는 div가 선택자(selector)가 된다.
<div class="photo">사진</div> <div class="photo">이름</div>
.photo{ background-color: red; }
두번째 방법은 class 속성을 지정하고 점(.)과 class name 으로 선택한다. 여기서는 .photo 가 선택자(selector)가 된다. class 속성을 지정하는 방법은 일반적으로 여러개의 요소에 공통적인 스타일을 적용해야 하는 경우 사용한다.
<div id="photo">사진</div>
#photo{ background-color: blue; }
세번째 방법은 id 속성을 지정하고 샵(#)과 id 로 선택한다. 여기서는 #photo 가 선택자(selector)가 된다. id는 전체 HTML 문서에서 유일한 값이다. 그러므로 해당 스타일이 적용된 요소는 유일하다.
<div id="photo" name="photo-name">사진</div>
div[name="photo-name"] { background-color: yellow; }
네번째 방법은 태그 이름과 대괄호 안에 속성값을 사용하여 선택한다. 여기서는 div[name="photo-name" 이 선택자(selector)가 된다.
* 스타일을 적용하는 다양한 방법
<!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>My Photo gallery</title> </head> <body> <div id="photo" name="photo-name" style="background-color: purple;">사진</div> </body> </html>
첫번째 방법은 태그 안에 style 속성을 지정하여 스타일을 적용한다. 이러한 방법을 인라인(inline) 방식이라고 한다. 테스트 용도로 사용하며 실제 코드에서는 거의 볼 수 없는 방법이다.
<!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>My Photo gallery</title> <style> div[name="photo-name"] { background-color: green; } </style> </head> <body> <div id="photo" name="photo-name">사진</div> </body> </html>
두번째 방법은 head 요소 안에 style 요소를 삽입하고 style 요소 안에서 스타일을 적용한다.
<!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>My Photo gallery</title> <link rel="stylesheet" href="style.css"> </head> <body> <div id="photo" name="photo-name">사진</div> </body> </html>
div[name="photo-name"] { background-color: yellow; }
세번째 방법은 head 요소에 link 요소를 삽입하고 스타일 파일(style.css)을 연결해준다.
* 자주 사용하는 CSS 속성
CSS 자주 사용되는 속성
CSS의 자주 사용되는 속성 형태로 사용되며 여러 속성을 줄 때는 세미콜론(;)으로 구분한다. 구글크롬의 개발자모드(f12)를 사용하면 쉽다. width , height width(가로길이), height(세로길이)를 의미한다.
velog.io
요소의 너비와 높이를 지정하고 싶은 경우
<div class="photo">사진</div>
.photo{ background-color: yellow; width: 500px; height: 200px; }
너비를 500px로 높이를 200px로 지정하였다.
.photo{ background-color: yellow; width: 50%; height: 200px; }
퍼센트(%)로 지정해도 된다. 50%로 설정하면 브라우저 화면의 절반을 너비로 지정한다. 높이는 경험상 px 값으로 지정하는 것이 좋다.
요소에 여백(공간)을 주고 싶은 경우
.photo{ background-color: yellow; margin: 100px; padding: 30px; }
margin 은 요소 외부와의 여백을 설정한다. padding은 요소 내부의 여백을 설정한다.
.photo{ width: 500px; height: 200px; margin: 0 auto; background-color: red; }
margin 속성에 auto 값을 지정하면 해당 요소가 화면 중앙에 정렬된다.
요소에 여백(공간)이 있더라도 정해진 너비와 높이를 유지하고 싶은 경우
.photo{ background-color: yellow; width: 500px; height: 200px; padding: 100px; box-sizing: border-box; }
padding이 100px로 설정되어 있기 때문에 width가 500px이라도 양쪽 여백에 100px 씩 더해져서 실제로는 700px이 된다. 또한, height도 200px이 아니라 아래 위로 100px 씩 추가되어 400px이 된다. 하지만 box-sizing 속성을 border-box로 설정하면 margin이나 padding으로 여백을 주더라도 전체 너비(width)는 500px로 전체 높이(height)은 200px로 유지된다.
요소 컨텐츠의 글자 색상을 변경하고 싶은 경우
.photo{ background-color: yellow; color: black; }
글자 색상을 검은색으로 지정한다.
.photo{ background-color: yellow; color: #000000; }
글자 색상은 16진수의 색상코드로 지정해도 된다.
.photo{ background-color: yellow; color: rgb(0,255,0); }
글자 색상은 rgb (red, green, blue) 삼원색의 값으로 지정해도 된다.
.photo{ background-color: yellow; color: rgb(0,0,0, 0.3); }
글자 색상의 rgb 뒤에 알파(투명도)를 설정할 수 있다. 값이 작을수록 희미한 색상이 된다.
글자의 폰트를 설정하고 싶은 경우
.photo{ background-color: yellow; font-style: italic; }
font-style 속성은 글자 기울기 등의 스타일을 설정한다.
.photo{ background-color: yellow; font-weight: bold; }
font-weight 속성은 글자의 두께를 설정한다.
.photo{ background-color: yellow; font-size: 30px; }
font-size 속성은 글자의 크기를 설정한다.
.photo{ background-color: yellow; width: 500px; height: 200px; line-height: 200px; }
line-height 속성은 줄 간격을 설정한다. 주로 높이를 지정한 경우 line-height 값을 높이와 동일하게 맞추어 컨텐츠를 세로로 중앙에 배치한다.
.photo{ background-color: yellow; font-family: sans-serif; }
font-family 속성은 글자의 글꼴을 설정한다. 다양한 글꼴이 기본 제공된다.
텍스트의 정렬 방향을 지정하고 싶은 경우
.photo{ background-color: yellow; text-align: left; }
텍스트를 왼쪽으로 정렬한다.
.photo{ background-color: yellow; text-align: center; }
텍스트를 가운데 정렬한다.
.photo{ background-color: yellow; text-align: right; }
텍스트를 오른쪽으로 정렬한다.
요소의 배경을 설정하고 싶은 경우
.photo{ background-color: yellowgreen; }
배경색을 설정한다.
.photo{ background-image: url("img/apple.png") }
배경 이미지를 설정한다. url 내부에는 이미지 경로를 설정하면 된다. 로컬 경로나 URL 주소를 넣으면 된다.
.photo{ background-image: url("img/apple.png"); background-repeat:repeat; }
배경 이미지를 반복할지 여부를 설정한다. repeat 으로 설정하면 같은 이미지가 화면에 반복된다.
요소의 테두리(border)를 설정하고 싶은 경우
.photo{ border-width: 5px; border-style: solid; border-color: red; }
border-width 속성은 테두리 두께를 설정한다. border-style 속성은 테두리의 스타일을 설정한다. border-color 속성은 테두리 색상을 설정한다.
.photo{ border: 1px solid blue; }
실제 업무에서는 주로 한번에 설정하는 경우가 많다.
.photo{ border-bottom: 3px solid blue; }
아래쪽 테두리만 설정할 수도 있다.
.photo{ border: 3px solid red; border-radius: 15px; }
테두리 모서리를 둥글게 설정한다. 여기서는 15px 만큼 둥글게 한다.
.photo{ border: 3px solid red; border-radius:10px 20px 30px 40px; }
테두리의 각 모서리를 서로 다르게 설정할 수도 있다.
.photo{ width: 200px; height: 200px; border: 3px solid red; border-radius: 50%; }
너비와 높이를 동일하게 설정하고 border-radius 속성을 50%로 설정하면 원 모양의 테두리를 만들수 있다.
요소를 숨기거나 보이게 하고 싶은 경우
.photo{ width: 500px; height: 200px; background-color: red; visibility: hidden; }
visibility 속성을 hidden 으로 설정하면 width, height 만큼 공간은 차지하지만 보이지 않게 한다.
.photo{ width: 500px; height: 200px; background-color: red; display: none; }
display 속성을 none 으로 설정하면 width, height을 지정하더라도 해당공간은 사라지고 보이지도 않는다.
.photo{ background-color: red; display: block; }
display 속성을 block 으로 설정하면 가로 영역을 모두 채우고 줄이 바뀐다.
.photo{ background-color: red; width: 500px; height: 200px; display: inline; }
display 속성을 inline 으로 설정하면 컨텐츠 크기만큼 채운다. width, height 을 지정해도 적용되지 않는다.
.photo{ background-color: red; width: 500px; height: 200px; display: inline-block; }
display 속성을 inline-block 으로 설정하면 inline과 block 의 중간형태를 가진다. width, height 을 지정할 수 있다. 하지만 inline-block 속성을 사용할때는 주의해야 한다. 왜냐하면 디폴트 마진이 약 2px 만큼 존재하기 때문에 가로로 정렬할때 레이아웃이 정확하지 않을수 있다. 디폴트 마진을 제거하려면 부모 요소에 font-size 속성을 0 으로 설정하면 된다.
요소를 가로 또는 세로로 나열하고 싶은 경우
<div class="photo">사진 1</div> <div class="photo">사진 2</div> <div class="photo">사진 3</div>
.photo{ background-color: powderblue; width: 200px; height: 200px; margin: 10px; float: left; }
요소를 가로로 나열하려면 float 속성을 설정하면 된다. left 로 설정하면 왼쪽으로 정렬된다. right 로 설정하면 오른쪽으로 정렬된다. none 으로 설정하면 아래와 같이 배치하지 않는다. 즉 세로로 나열된다.
요소의 위치를 설정하고 싶은 경우
<div id="parent"> <div id="child"></div> </div>
#parent{ width: 200px; height: 200px; margin: 200px; background-color: powderblue; position: relative; } #child{ width: 100px; height: 100px; left: 0; top: 0; background-color: sandybrown; position: absolute; }
상위 div 요소는 부모이고, 하위 div 요소는 자식이다. 부모 div 에 position 속성을 relative 로 지정하고, 자식 div 에 position 속성을 absolute 로 지정하고, 자식 div 의 left, top 을 모두 0으로 지정하면 부모의 왼쪽 상단 모서리를 기준으로 자식이 위치한다.
#parent{ width: 200px; height: 200px; margin: 200px; background-color: powderblue; position: relative; } #child{ width: 100px; height: 100px; right: 0; bottom: 0; background-color: sandybrown; position: absolute; }
자식 div 의 right, bottom 을 모두 0 으로 지정하면 부모의 위치를 기준으로 우측 하단 모서리에 자식이 위치한다.
#parent{ width: 200px; height: 200px; margin: 200px; background-color: powderblue; position: static; } #child{ width: 100px; height: 100px; left: 0; top: 0; background-color: sandybrown; position: absolute; }
부모 div 의 position 을 static 으로 지정하고 자식 div 의 left, top 을 모두 0 으로 설정하면 부모 위치에 상관없이 자식은 브라우저의 왼쪽상단 모서리에 위치한다.
<div id="container">사진</div>
#container{ width: 200px; height: 200px; background-color: powderblue; left: 50%; top: 50%; transform: translate(-50%, -50%); position: absolute; }
브라우저 화면의 정중앙에 div 요소를 위치시키고 싶으면 위와 같이 하면 된다.
정중앙에 배치한 모습 left, top 을 50%로 설정하면 거의 정중앙에 위치한다. 하지만 div 의 왼쪽 상단 모서리가 정중앙에 위치하므로 정확히 정중앙은 아니다. div 사각형의 중앙지점을 브라우저의 정중앙에 위치시키려면 transform 이라는 속성으로 기준좌표를 사각형의 중앙지점으로 이동시켜줘야 한다.
<div id="nav">navigation</div> <div id="container">사진</div>
body{ margin: 0; padding: 0; } #nav, #container{ width: 100%; font-weight: bold; color: white; } #nav{ height: 100px; left: 0; top: 0; background-color: skyblue ; font-size: 50px; position: fixed; } #container{ height: 100vh; margin: 100px auto; font-size: 300px; background-color: tomato; }
네비게이션 바의 position 속성은 fixed 로 설정되었기 때문에 container 를 스크롤해도 네비게이션 바가 같이 올라가지 않고 위치가 고정된다.
마우스 커서의 모양을 변경하고 싶은 경우
<div id="container">사진</div>
#container{ width: 200px; height: 200px; color: white; background-color: tomato; cursor: pointer; }
텍스트 데코레이션을 설정하고 싶은 경우
<a href="#">구글 사이트</a>
a{ text-decoration: none; }
주로 a 태그의 밑줄을 제거할때 많이 사용한다.
a{ text-decoration: line-through; }
또는 리스트 아이템 중 작업이 끝난 아이템을 줄로 그을때 사용한다.
자식이 부모의 영역을 벗어나는 경우
<div id="parent"> <div id="child"></div> </div>
#parent{ width: 500px; height: 200px; margin: 100px; background-color: skyblue; overflow: visible; } #child{ width: 200px; height: 500px; background-color: tomato; }
overflow 속성을 visible 로 설정하면 아래와 같이 자식이 부모 영역을 벗어나더라도 그대로 보여준다.
#parent{ width: 500px; height: 200px; margin: 100px; background-color: skyblue; overflow: hidden; } #child{ width: 200px; height: 500px; background-color: tomato; }
overflow 속성을 hidden 으로 설정하면 자식이 부모 영역을 벗어난 경우 벗어난 영역은 보이지 않게 한다.
#parent{ width: 500px; height: 200px; margin: 100px; background-color: skyblue; overflow: scroll; } #child{ width: 200px; height: 500px; background-color: tomato; }
overflow 속성을 scroll 로 설정하면 자식이 부모 영역을 벗어난 경우 스크롤이 생기면서 보이지 않는 영역도 스크롤해서 볼 수 있다.
요소 위에 또다른 요소를 겹치고 싶은 경우
<div id="up">상위</div> <div id="down">하위</div>
#up, #down { width: 200px; height: 200px; } #up{ position: absolute; background-color: skyblue; } #down{ position: absolute; left: 100px; top: 100px; background-color: tomato; }
div 요소끼리 겹칠때 일반적으로 맨 마지막에 생성된 div 태그가 위에 올라간다. 여기서는 하위 div 가 위에 위치하기 때문에 완전히 보인다.
#up, #down { width: 200px; height: 200px; } #up{ position: absolute; background-color: skyblue; z-index: 1; } #down{ position: absolute; left: 100px; top: 100px; background-color: tomato; }
상위 div 에 z-index 속성을 설정하면 상위 div 가 위로 올라간다. 즉, 상위 div 요소가 완전히 보인다.
애니메이션을 적용하고 싶은 경우
<div id="box">상자</div>
#box{ width: 100px; height: 100px; background-color: skyblue; cursor: pointer; transition: all 2s ; } #box:hover{ width: 500px; }
box 요소에 마우스를 hover 하면 2초동안 width 값이 100px 에서 500px 로 증가한다.
728x90'프론트엔드 > CSS' 카테고리의 다른 글
flex 없이 카드 레이아웃 만들기 (반응형 포함) (0) 2021.11.04 칼럼 (Column) 레이아웃 (0) 2021.10.24 Grid 기본이론 (0) 2021.10.19 반응형 웹 (Responsive web) (0) 2021.10.18 Flex (Flexible Box) 기본 이론 (0) 2021.10.16