네가지 선언방식이 있다.
<style></style>의 내용(Contents)으로 스타일을 작성
<style>
div{
color: red;
margin: 20px;
}
</style>
요소의 style속성에 직접 스타일을 선택자 없이 작성하는 방식
<div style="color:red; margin:20px;"></div>
<link/>로 외부 css문서를 가져와서 연결한다.
<link rel="stylesheet" href="./css/main.css">
/*html 파일 주변에서 css폴더를 찾아 그안의 main.css*/
css의 @import 규칙으로 css문서 안에서 또다른 css문서를 가져와 연결하는 방식
<link rel="stylesheet" href="./css/main.css">
/* main.css */
@import url("./box.css");
div{
color: blue;
margin: 20px;
}
/* box.css */
.box {
background-color: red;
padding: 20px;
}
다음의 기본선택자 4 개는 적용 순서가 다르다
모든 요소를 선택한다
* {
color: blue;
}
태그이름이 abc인 요소선택
li {
color: blue;
}
HTML class 속성의 값이 abc인 요소 선택
.sky {
color: blue;
}
HTML id속성의 값이 abc인 요소 선택
#sky {
color: blue;
}
선택자 abc와 xyz를 동시에 만족하는 요소 선택
span.sky {
color: blue;
}
선택자 abc의 자식요소 xyz선택
ul > .sky {
color: blue;
}
<div>
<ul>
<li class="sky">하늘</li> /*pick!*/
<li>구름</li>
</ul>
</div>
띄어쓰기가 하위 선택자의 기호이다. 선택자 abc의 하위요소 xyz 선택.
div .sky {
color: blue;
}
<div>
<ul>
<li class="sky">하늘</li> /*pick!*/
<li>구름</li>
</ul>
<span class="sky">하늘</span> /*pick!*/
</div>
<span class="sky">하늘</span> /*div에 소속되지 않았으므로 선택되지 않음*/
선택자 abc의 다음 형제요소 xyz하나를 선택
.sky + li{
color: white;
}
<div>
<ul>
<li>태양</li>
<li class="sky">하늘</li>
<li>구름</li> /*pick!*/
<li>별</li>
</ul>
<span class="sky">하늘</span>
</div>
<span class="sky">하늘</span>
선택자 abc의 다음 형제 요소 xyz 모두를 선택
.sky ~ li{
color: white;
}
<div>
<ul>
<li>태양</li>
<li class="sky">하늘</li>
<li>구름</li> /*pick!*/
<li>별</li>/*pick!*/
</ul>
<span class="sky">하늘</span>
</div>
<span class="sky">하늘</span>
선택자 abc요소에 마우스 커서가 올라가 있는 동안 선택
.box {
width: 100px;
height: 100px;
background-color: gold;
transition: 1s; /*전환효과 자연스럽게 1s 동안 변화함*/
}
.box:hover {
width: 300px;
background-color: silver;
}
선택자 abc요소에 마우스를 클릭을 유지하고 있는 동안 선택
<a href="https://www.naver.com">naver</a>
a:active {
color: limegreen;
}
선택자 abc요소가 포커스 되면 선택
<input type="text"/>
input:focus {
background-color: lavender;
}
선택자 abc가 형제요소중 첫째선택
.up li:first-child {
background-color: yellow;
}
<div class="up">
<ul>
<li>태양</li>/*pick!*/
<li>하늘</li>
<li>구름</li>
<li>별</li>
</ul>
</div>
선택자 abc가 형제요소중 막내선택
.up li:last-child {
background-color: yellow;
}
<div class="up">
<ul>
<li>태양</li>
<li>하늘</li>
<li>구름</li>
<li>별</li>/*pick!*/
</ul>
</div>
선택자 abc가 형제요소중 n째라면 선택
.up li:nth-child(2){
background-color: blue;
}
<div class="up">
<ul>
<li>태양</li>
<li>하늘</li>/*pick!*/
<li>구름</li>
<li>별</li>
</ul>
</div>
.up *:nth-child(2n){
background-color: blue;
}
<div class="up">
<ul>
<li>태양</li>
<li>하늘</li>/*pick!*/
<li>구름</li>
<li>별</li>/*pick!*/
<div>땅</div>
<p>바다</p>/*pick!*/
<h1>풀</h1>
</ul>
</div>
선택자 xyz가 아닌 abc요소 선택
.fruits *:not(span) {
color: yellow;
}
<div class="fruits">
<span>귤</span>
<span>오렌지</span>
<div>바나나</div>/*pick*/
<p>망고</p>/*pick*/
</div>
선택자 abc 요소의 내부 앞에 내용(글자요소. 인라인)을 삽입
.box::before {
content: "앞!";
}
선택자 abc 요소의 내부 뒤에 내용(글자요소. 인라인)을 삽입
.box::after {
content: "뒤!";
}
display 속성을 사용한다
.box::before {
content: "";
display: block;
width: 30px;
height: 30px;
background-color: coral;
}
.box::after {
content: "";
display: block;
width: 30px;
height: 30px;
background-color: coral;
}
[disabled] {
color:red;
}
<input type="text" value="abcd" disabled/>
[data-fruit-name] {
color: red;
}
<span data-fruit-name="apple">사과</span>
[type="password"] {
color: red;
}
<input type="password"/>
해당하는 요소의 하위요소까지 영향을 미친다.
.animal{
color: red;
}
<div class="ecosystem">생태계
<div class = animal>동물 ✔️
<div class="tiger">호랑이</div>✔️
<div class="lion">사자</div>✔️
<div class="elephant">코끼리</div>✔️
</div>
<div class="plant">식물</div>
</div>
모두 글자/문자 관련 속성들이지만 모든 글자/문자 속성은 아니다.
inherit 이라는 값을 통해서 실제로 상속이 되지 않는 속성을 강제로 상속 될 수 있게 한다.
.parent {
width: 300px;
height: 200px;
background-color: orange;
}
.child {
width: 100px;
height: inherit;
background-color: inherit;
}
우선순위란, 같은 요소가 여러 선언의 대상이 된 경우, 어떤 선언의 css속성을 우선 적용할지 결정하는 방법이다.
Quiz : 브라우저에 뜰 때 무슨색으로 뜰까?
div {
color: red !important;/*!important - ∞점*/
}
#color_yellow { /*id선택자 100점*/
color: yellow;
}
.color_green { /*class선택자 10점*/
color: green;
}
div { /*태그 선택자 1점*/
color: blue;
}
* { /*전체 선택자 0점*/
color: darkblue;
}
body { /*상속은 점수를 별도로 계산하지 않음*/
color: violet;
}
<div
id="color_yellow"
class="color_green"
style="color: orange;"><!--인라인 선언 1000점-->
Hello world!
</div>
답: 빨간색
.list li.item { /*21점 : 10(class) + 1(tag) + 10*/
color: red;
}
.list li:hover{ /*21점 : 10(class) + 1(tag) + 10(가상class)*/
color: red;
}
.box::before{ /*11점 : 10(class) + 1(가상요소)*/
content:"good"; color: red;
}
#submit span{ /*101점 : 100(id) + 1(tag)*/
color: red;
}
header .menu li:nth-child(2){ /*22점 : 1(tag) + 10(class) + 1(tag) + 10(가상 class)*/
color: red;
}
h1{ /*1점 : 1(tag)*/
color: red;
}
:not(.box){ /*10점 : 10(class), not은 가상 클래스 선택자 이기는 하지만 점수계산 제외*/
color: red;
}
.hello {
color: red;
}
.hello {
color: green;✔️
}
초록색에 나중에 해석되었으므로 초록색 적용됨
div.hello { /*11 점*/
color: red;✔️
}
.hello {
color: green;
}
div.hello가 점수가 더 높으므로 빨간색 적용
점수가 너무 높아서 수정이 어려우므로 되도록 쓰지 않는 게 좋다 (!important를 덮으려고 !important를 계속 쓰게됨)
HTML속성 : Attributes
CSS속성 : Properties
JS속성 : Properties
픽셀(하나의 점). 절대 단위
상대적 백분율
요소의 글꼴 크기. 1em = 10px
루트(최상위) 요소:html의 글꼴 크기
뷰포트 가로너비의 백분율
뷰포트 세로너비의 백분율
일때는 단위를 안붙여도 0 임!
요소의 외부여백(공간)을 지정하는 단축 속성
요소의 내부여백(공간)을 지정하는 단축 속성
요소의 테두리 선을 지정하는 단축속성
border: 선-두께 선-종류 선-색상
요소의 모서리를 둥글게 깎음
요소의 크기 계산 기준을 지정
요소의 크기 이상으로 내용이 넘쳤을 때, 보여짐을 제어하는 단축 속성
요소의 화면출력 특성
요소 투명도
글자의 기울기
글자의 두께(가중치)
글자의 크기
한 줄의 높이, 행간과 유사
글꼴 지정.
font-family: 글꼴1, "글꼴2", ... 글꼴계열;
글자의 색상
문자의 정렬방식
문자의 장식(선)
첫줄의 들여쓰기
배경 색상
요소의 배경 이미지 삽입
요소의 배경 이미지 크기
요소의 배경이미지 스크롤 특성
요소의 위치 지정 기준
어떤 요소가 사용자와 더 가깝게 있는지(위에 쌓이는지) 결정
1. 요소에 position 속성의 값이 있는 경우 위에 쌓임 (기본값 static 제외)
2. 1번 조건이 같은 경우, z-index 속성의 숫자 값이 높을 수록 위에 쌓임
3. 1번과 2번 조건까지 같은 경우, HTML의 나중 구조일수록 위에 쌓임
<요소쌓임 순서 연습>
1. Q. 사용자와 더 가까운 container item은?
.container .item:nth-child(1) {
position: relative;
}
.container .item:nth-child(2) {
position: absolute;
top: 50px
left: 50px;
}
2번 html구조가 나중에 작성 되었으므로
.container .item:nth-child(1) {
position: relative;
z-index: 1;
}
.container .item:nth-child(2) {
position: absolute;
top: 50px
left: 50px;
}
A. 1번 z-index가 더 높으므로
.container .item:nth-child(1) {
position: relative;
z-index: 1;
}
.container .item:nth-child(2) {
position: absolute;
top: 50px
left: 50px;
}
.container .item:nth-child(2) {
z-index: 2;
}
A. 3번 position속성이 설정되어 있지 않음
.container .item:nth-child(1) {
position: relative;
z-index: 1;
}
.container .item:nth-child(2) {
position: absolute;
top: 50px
left: 50px;
}
.container .item:nth-child(2) {
position: fixed;
z-index: 1;
}
A: (위) 3 > 1 > 2(아래)
3 번 : 위치요소✔️, 1번과 z 값 같지만 html에서 나중에 있음✔️
요소의 쌓임 정도를 지정
수직 정렬을 수평 정렬로 만든다
Flex Container의 화면 출력(보여짐) 특성
주 축을 설정한다
Flex Items(자식요소) 묶음(줄바꿈) 여부
주 축의 정렬방법
교차축(주로 가로flex니까 세로축)의 여러줄 정렬방법
발동 조건 때문에 상대적으로 덜 쓰임
1. 여러줄이어야 한다 flex-wrap: wrap
2. 위 아래 공간에 정렬이 가능한 여백이 있어야 한다
교차 축의 한 줄 정렬 방법
자식요소에 부여되는 속성들
Flex Item의 순서
Flex Item의 증가 너비 비율
Flex Item의 감소 너비 비율
Flex Item의 공간 배분 전 기본 너비
display: flex;
justify-content: center;
align-items: center;
요소의 전환(시작과 끝) 효과를 지정하는 단축 속성
transition: 속성명 지속시간 타이밍함수 대기시간
transition: transition-property transition-duration transition-timing-function transition-delay
전환 효과를 사용할 속성 이름을 지정
전환 효과의 지속시간을 지정
div{
width: 100px;
height: 100px;
background-color:orange;
transition:
width .5s;
background-color 1s;
}
div:active {
width: 300px
background-color: royalblue;
}
가로너비는 0.5s동안 늘어나고 배경색은 1s동안 변한다
전환 효과의 타이밍(easing)함수를 지정. 시각적으로 이해하기
<div class="container">
<div class="item">AB</div>
</div>
.container {
width: 100px;
height: 100px;
background-color: tan;
position: relative;
top: 100px; left: 100px;
}
.item {
width: 100px;
height: 100px;
background-color: teal;
transform: rotate(45deg);
}
요소의 변환 효과. 효과를 띄어씌기로 나열후 맨마지막에 ;
transform: 변환함수1 변환함수2 변환함수3 ...;
transform: 원근법 이동 크기 회전 기울임;
이동(x축, y축)
이동(x축)
이동(y축)
크기(x축, y축)
회전(각도)
기울임(x축)
transform:
skewY(-30deg);
기울임(y축)
원통으로 회전하기.
원근법을 가져야 입체감이 느껴지면서 차이가 남.
원근법(거리). 제일 앞에 작성하기!
회전(x축각도)
transform:
perspective(500px)
rotateX(45deg);
회전(y축각도)
하위 요소를 관찰하는 원근거리(px)를 지정
속성과 함수의 차이점
3d 변환으로 회전된 요소의 뒷면 숨김 여부
overwatch-hero-selector-vanilla
! + tab : html구조 자동완성 해주기
head
title 바꿔주기
링크탭으로 연결하기
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/reset-css@5.0.1/reset.min.css" rel="stylesheet">
<link rel="stylesheet" href="./main.css"/>
body
<div class="container">
<div class="heroes">
<div class="hero"> <!--32번 반복-->
<div class="image"></div>
</div>
</div>
</div>
각 요소별 준비
.container {}
.container .heroes {}
.container .heroes .hero {}
.container .heroes .here .image {}
각 hero 를 넣을 칸 기본 셋팅
.container .heroes {
display: flex;
flex-wrap: wrap;
}
.container .heroes .hero {
width:80px;
height:84px;
margin: 4px;
background-color: #555555;
}
flex container 설정해주기
.container .heroes {
display: flex;
flex-wrap: wrap;
/* 👇새로 추가 부분👇*/
justify-content: center;
background-color: orange;
max-width: 700px;
margin: auto;
}
화면 넓이가 700px이상일 때
화면 넓이가 700px이하일 때
body {
height: 100vh;
background-image: url("https://raw.githubusercontent.com/ParkYoungWoong/overwatch-hero-selector-vanilla/master/images/bg.jpg");
background-size: cover;
background-repeat: no-repeat;
background-attachment: fixed;
}
.container {
padding: 50px 0;
}
.container .heroes {
display: flex;
flex-wrap: wrap;
justify-content: center;
max-width: 700px;
margin: 0 auto;
padding: 40px 20px;
}
.container .heroes .hero {
width:80px;
height:84px;
margin: 4px;
border: 3px solid #fff;
border-radius: 10px;
box-sizing: border-box;
background-color: #555555;
overflow: hidden;
transform: skewX(-14deg);
transition:
transform .1s,
background-color .6s;
}
.container .heroes .hero:hover {
background-color: #ff9c00;
transform: skewX(-14deg) scale(1.3);
z-index: 1;
}
.container .heroes .hero .image {
width: 140%;
height: 100%;
background-position: center;
background-size: 90px;
background-repeat: no-repeat;
transform: skewX(14deg) translateX(-16px);
}
.container .heroes .hero:nth-child(1) .image { background-image: url(https://raw.githubusercontent.com/ParkYoungWoong/overwatch-hero-selector-vanilla/master/images/hero1.png);}
/** ~~ **/
.container .heroes .hero:nth-child(32) .image { background-image: url(https://raw.githubusercontent.com/ParkYoungWoong/overwatch-hero-selector-vanilla/master/images/hero32.png);}
<div class="logo">
<img src="https://raw.githubusercontent.com/ParkYoungWoong/overwatch-hero-selector-vanilla/master/images/logo_overwatch.png" alt="Overwatch">
</div>
container 요소 이후에 로고 요소를 추가해준다.
이 상태는 로고가 그냥 엄청 크게 밑에 있으므로 css에서 크기조절해준다
.container .logo {
max-width: 300px;
margin: 0 auto;
padding: 0 20px;
}
.container .logo img{
width: 100%; /* 이미지의 부모요소(300px)보다 커질수 없음 */
}