Day5
CSS의 최강자 빔캠프님께서 오셔서 특강을 해주셨다.
진짜 너무 재미있게 실속있게 배울 수 있는 시간을 가질 수 있었고
오전 9시부터 오후 6시까지 했는데도 아쉬울 정도로 빨리 끝난 기분이었다 ,,
정말 최고의 강사님,, ❤️
아무튼!
CSS의 핵심 부분을 실습하며 배웠고 두가지 실습을 해보았다!
처음에 볼 땐 디테일보다 전체적인 덩어리를 보고 설계할 수 있어야 한다
배경색을 만들어서 영역을 확인한다
div {
background-color: orange;
}
여기서 div 를 뭐라고 부를까 ?
= selector
(선택자)
div
셀렉터는 좀 더 구체적으로 말해보자면
type selectors (타입 선택자) 가 공식명칭이다.
background-color
은 property(속성) 라고 부른다 orange
= 값 ;
= 반드시 지켜야하는 틀 지금 여기에서는 div 가 차지하는 width 를 설정해주지 않았다!
그럼 지금은 얼마나 공간을 차지하고 있는거지?
부모요소의 너비를 기준으로 따라감
이 이미지에서는 width
값을 줄여줬다!
그랬을때,
왼쪽에서부터 정렬됨 !
대체 왜?
저 주황색 위아래로 있는 빈 공간은 뭐지?
= 브라우저가 기본으로 제공하는 디폴트 스타일
여기에서는 margin:8px;
을 제공함
=> 근데 이 디폴트 디자인이 브라우저마다 다르다
✨ 결과물이 어떤 이유로 어떠한 결과로 나오는지? 를 항상 생각하면서 코딩하기
자, 스타일을 만져주기 전에 '재료'를 다듬어줘야 한다고 생각해보자
body {
margin: initial;
}
margin: initial;
이 가진 초기값을 명시적으로 적어준 것 ( = 0px )
div {
background-color: orange;
width: auto;
}
width
는 width: auto;
로 초기값 설정
background-color
의 초기값 : transperant (투명)
이런 결과값이 나옴
🤚 여기서 잠깐
그럼 auto
랑 initial
은 같은건가?
=> NO ! 각각의 프로퍼티마다 디폴트값 설정이 다름 (mdn에서 확인 가능)
body {
margin: initial;
}
div {
background-color: orange;
}
div
에 width
값을 적어주지 않아도
부모요소의 width
를 따라가기 때문에 위와 같은 결과값을 낸다는 것을 기억하기
div {
background-color: orange;
width: 100px;
height: auto;
}
height: auto;
가 되면?
=> 부모가 아니라 자식 기준으로 높이가 자동 조절
즉 width:auto
는 부모
height:auto
는 자식 요소(콘텐츠) 에 따라감
<margin>
바깥쪽 여백 (그 누구도 침범할 수 없는 영역)!
div {
background-color: orange;
width: 100px;
height: 100px;
margin: 20px;
}
<padding>
: 전체 크기가 커져버림
(마치 겨울에 패딩을 입으면 몸이 커지듯 ..이라고 하셨다..ㅎㅎ )
div {
background-color: orange;
width: 100px;
height: 100px;
margin: 20px;
padding: 10px;
}
<border>
: 테두리
div {
background-color: orange;
width: 100px;
height: 100px;
margin: 20px;
padding: 10px;
border: 10px solid red;
}
<div>
: 의미없는 태그 디자인위해 묶어주기 위해 사용
: block level element
div {
background-color: orange;
border: 1px solid gray;
width: 200px;
}
block level element :한줄이 한 공간 다 차지한다
<div>contents</div>
<div>contents2</div>
두개의 div
를 마크업 해줬을 때
두번째 오는 div
는 첫째div
다음줄을 차지하게 됨
여기서 margin-left: auto;
를 해주면
div {
background-color: orange;
border: 1px solid gray;
width: 200px;
margin-left: auto;
}
'남는 공간을 여백으로 다 차지하겠다' 라는 의미
여기서 margin-right: auto;
까지 해주면 아래 이미지처럼
가운데정렬이 된다 !
div {
background-color: orange;
border: 1px solid gray;
width: 200px;
margin-left: auto;
margin-right: auto;
}
이걸 줄여서
margin: 0 auto;
라고 써줄 수 있음 !
⭐️ 유의할점
block level element 의 가로 가운데 정렬만 된다!
위에서 배운 내용을 토대로 프로필을 만들어 보자!
강사님이 제공한 프로필이미지에서 조금 수정하여 나의 사랑 노제의 프로필을 만들어보았다^^^
전체적으로 보자면 이 페이지는 하나의 덩어리로 볼 수 있다
그리고 그 안의 프로필 영역은 세등분으로 볼 수 있다.
<body>
<div>
<div>Header</div>
<div>Contents</div>
<div>Footer</div>
</div>
</body>
⭐️ 타입셀렉터는 위험하다 !!!!!
타입셀렉터 : body, h1 , header 등등
<div class="wrapper">
<div class="header">Header</div>
<div class="contents">Contents</div>
<div class="footer">Footer</div>
</div>
class = 명찰
div
이면서 header
라는 class를 가진 요소를 나타냄 (.header)으로도 많이 사용
구체적으로 작성해야 할 필요가 있을때 사용
div.header {
}
거의 이렇게 사용하는 편!
.header {
}
* : universial selector
모든 타입을 다 선택하는것
지금 .header 에서 *.header 이 생략되어있는것
img
: Inline element!기본 스타일 제거해주기
h1
의 기본 스타일링이 이렇게되어 있음
h1 {
display: block;
font-size: 2em;
margin-block-start: 0.67em;
margin-block-end: 0.67em;
margin-inline-start: 0px;
margin-inline-end: 0px;
font-weight: bold;
}
CSS의 몇몇 프로퍼티는 상속이 되는 속성을 가지고 있다.
-> 상속이란? 부모의 속성값이 자식요소에 적용됨을 말한다.
font-size
다시 돌아와서! 기본 스타일을 제거해줌! (한번에 묶어서도 가능)
body,h1,p {
margin: initial;
}
아 근데 안되는 브라우저(IE) 있어서 initial 대신 0으로 해준다.
body,h1,p {
margin: 0;
/* initial 로 해줄 수 있지만 안되는 브라우저있어서 0으로 해줌 */
/* unset 이라는 저절로 설정해주는 속성도 있는데 IE지원이 안돼서 아직 대중적을 쓰지 않음 */
}
h1
의 font-size
를 초기화해줄 차례
근데 잠깐만요 .
initial 로 해주면 초기값만 유지하려해서
부모요소를 바꿔줘도 값이 먹지 않아서 부모의 값을 상속받게끔 inherit 사용
h1{
font-size: inherit;
}
📌 TIP
inherit : 원래 상속이 지원되는 속성을 초기화 해줄때 사용
initial : 원래 상속이 지원되는 속성이 아닐때 사용
width:100% 와 width:auto에게 margin-left
를 줬을때
width:100%
는 옆으로 터져나가고
width: auto;
는 좀 더 합리적으로 움직인다. (margin을 자동으로 포함해서 좀 더 행복해짐 )
width: auto;
를 쓰는게 좋다!
Header부터 만들어보자!
text-align: center;
로 가운데 정렬 (가로 가운데 정렬)
=> inline 요소라 가능
.header {
background-image: url(/D5-CSS/profile/images/cover04.png);
text-align: center;
}
h1
만 쓰는것보다는 안전하다 ㅎ .header h1 {
font-size: 100px;
}
여기서 .header h1
은 header 안에있는 모든 h1
을 가르킨다.
class를 사용하지만 좀 더 구체적으로 명시하기 위해서도 하위선택자를 사용한다.
.header img.profile {
width: 250px;
border-radius: 50%;
border: 4px solid rgb(198, 255, 237);
}
border-radious
https://9elements.github.io/fancy-border-radius/#100.35.0.41--
에서 만져가면서 정할수도 있다
.header img.profile {
width: 250px;
border-radius: 50%;
border: 4px solid rgb(198, 255, 237);
}
box-sizing
box-sizing : content-box
가 기본border-box;
를 선택할 수 있게 해줘서 이걸 선택하면 맘대로 조절이 가능하게끔 됨.<몰랐던 속성>
fit-content
.header p {
/* p는 블록요소라 전체줄을 차지함 그래서 width 설정 */
border-top: 4px solid;
width: fit-content;
margin: 20px auto;
}
width
를 그냥 300px 로 설정하면 이렇게 나오지만 나는 글자크기에 맞는 보더탑을 원함!
이럴때 쓰는게 fit-content
그 . 런 . 데
IE에서는 fit-content
가 작동안됨
(우리는 다양한 사용자를 고려해야 하기 때문에 항상 신경쓰기 .. !)
대신할 수 있는 속성
display: inline-block;
width 대신 display: inline-block;
해주면 위와 같은 결과값을 내준다 !
<display-line>
h1
으로 감싼다고 그게 블록요소가 아니라 안에 텍스트는 inline
이기 때문에 inline-block
으로 설정해줌
.header p {
/* p는 블록요소라 전체줄을 차지함 그래서 width 설정 */
border-top: 4px solid;
display: inline-block;
margin: 20px auto;
}
<div class="footer">
<a class="icon" href="#">Github</a>
<a class="icon" href="#">Facebook</a>
<a class="icon" href="#">Contact</a>
</div>
먼저,
a
의 기본 스타일을 박멸하자 !
/* a의 기본스타일 */
a:-webkit-any-link {
color: -webkit-link;
cursor: pointer;
text-decoration: underline;
}
이런 기본 스타일을 없애주겠음 (커서를 제외한 나머지)
a {
text-decoration: none;
/* text-decoration: inherit; */
/* 부모에게 이걸 줄 케이스가 생긴다면 inherit, 아니라면 초기값인 inisial로 설정 가능. 하지만 통상적으로는 none 많이 씀 */
color: inherit;
/* initial 하면 나중에 footer(부모)에서 컬러 바꿔줄때 먹지않음 */
}
(어떻게 배치되어있는지 확인위해 배경색을 넣어줬다!)
a
는 인라인 요소라 가로배치가 됨을 볼 수 있다).icon {
background-color: orange;
/* width: 100px; */
/* height: 100px; */
margin: 20px;
padding: 20px;
}
요소들의 크기를 크게 해주고싶은데
inline 요소라 width
/ height
값을 넣어줘도 먹지 않는다 !
(CSS 자체에서margin: 20px
해주면 좌우로는 조절이 가능하게끔 만들어짐)
padding
까지 넣어주면
🙈 엉망..그 자체
그래서 이걸 해결하기 위해 나온게
Display
display:block;
을 해주니 나오는 배치
하지만 이 배치? 원하지 않음.
베이스라인을 기준으로 block 요소가 되게끔 만들어 줄 수 있음
display: inline-block;
🐵 편안 ..
안에있는 텍스트 크기만큼 너비를 잡고싶다?
.icon {
background-color: orange;
padding: 20px;
display: inline-block;
}
가운데 정렬과 패딩값까지 넣어줌~!
자 근데 이걸 아래 이미지처럼 아이콘으로 나오게 해줄것!
일단 먼저 마크업을 수정
<div class="footer">
<a class="icon github" href="#">Github</a>
<a class="icon facebook" href="#">Facebook</a>
<a class="icon email" href="#">Contact</a>
</div>
그리고 css를 수정해보자면 이러하다
.icon {
width: 48px;
height: 48px;
display: inline-block;
border-radius: 30px;
border: 2px solid #ddd;
color: #fff;
/* 이미지 스프라이트 기법 => 웹성능 위해 */
background-image: url(images/icons.png);
text-indent: -9999px; /*IR 기법*/
background-size: 144px 96px;
}
text-indent: -9999px;
를 이용해 날림.icon.github {
background-position: left top;
}
.icon.facebook {
background-position: center top;
}
.icon.email {
background-position: right top;
}
hover
했을 때 이렇게 나오게끔 하기 위해! background-position-y
로 설정.icon:hover {
background-position-y: bottom;
/* background-position-y로 안하면 일일이 다 해줘야함 ,,
근데 너무 쓸데없고 나머지는 다 그대로 적용하되 y 값만 바꿔야 한다면 이걸 써줌! */
}
큰 레이아웃 먼저 마크업 해주자 !
두개의 덩어리로 볼 수 있기 때문에 두개의 div를 만들어주었다.
(여기에서는 실습을 위해 div로 했지만 시멘틱마크업을 해주자)
<div class="contents">
<div class="section">Section#1</div>
<div class="section">Section#2</div>
</div>
그리고 먼저 그 덩어리들을 스타일링해주었다.
.section {
background-color: #fff;
margin: 20px;
padding: 20px;
}
그랬더니 블록레벨에 있는 마진끼리 겹치는 현상이 일어났다.
이 현상을 '마진 상쇄' 로 해결해야한다.
(참고로 마진 상쇄 현상은 블록과 블록 레벨끼리만 일어나며 아래에서 더 설명할 것!)
마크업을 마무리하고
<div class="contents">
<div class="section information">
<h2>Information</h2>
<ul class="list">
<li>No Jihye </li>
<li>nozeworld@instagram.com</li>
<li>Seoul,Korea</li>
</ul>
</div>
<div class="section skills">
<h2>Skills</h2>
<ul class="list">
<li>Poppin</li>
<li>Hiphop</li>
<li>All</li>
</ul>
</div>
</div>
스타일링을 위해 css reset 시작 !
body,p,ul {
margin: 0;
padding: 0;
}
h1,h2{
margin: 0;
font-size: inherit;
font-weight: inherit;
}
이렇게 수정해줌으로서 초기화해준다
li
는 초기화할때 initial
or inherit
이 아닌 none
으로 처리해준다 ! li {
list-style-type:none;
}
block level
끼리의 만남일때
인접해있는 상하단이라면 부모와 자식간에도 겹칠 수가 있다.
여기서의 이미지를 보면
부모요소: margin-top: 100px;
/ 자식요소: margin-top: 30px;
일때
같은 선상에서 margin-top
이 시작돼서 마진상쇄가 일어난다!
이럴 때 해결하는 방법
padding: 1px
주기overflow:hidden;
( IE 고려함 )display:flow-root;
(IE 고려 안함)지금 아래 이미지를 보면 마진 상쇄로 박스가 이상함 ,,
이랬던 애를 overflow:hidden;
을 통해 행복한 박스로 만들어줌
*** 마진상쇄에 대한 더 자세한 내용은 아래 주소 영상 참고
https://www.youtube.com/watch?v=c19Mjg-ivxc
클래스를 여러개 쓰자 !
ackground-image
를 따로 설정해줄 수 있다!<div class="contents">
<div class="section information">
<h2>Information</h2>
<ul class="list">
<li>No Jihye </li>
<li>nozeworld@instagram.com</li>
<li>Seoul,Korea</li>
</ul>
</div>
<div class="section skills">
<h2>Skills</h2>
<ul class="list">
<li>Poppin</li>
<li>Hiphop</li>
<li>All</li>
</ul>
</div>
</div>
바꾸고 싶은 부분만 이렇게 작성해주면
(cascading css잖아? 그래서 더 뒤에 작성해야 먹힘 )
.skills {
background-image: url(images/icon-skills.png);
}
이렇게 같았던 이미지를
짠 .skills
를 달아준 녀석한테만 적용해줄 수 있다
상황에 따라 우선순위를 주고싶을때 구체성을 띄게 명찰을 달아주면 됨!
*** Mouse를 hover 했을때 selector speciality 를 볼 수 있음! (예시: 아래 이미지)
class
중첩에 한계는 없지만 너무 많이 쓰는 것 지양id
는 우선순위를 높이기 위해 사용하는 것은 지양!!important
.a.b
: descendant 후손 모두를 가리킴.a > .b
.a 의 직계자식 .b 만 가리킴🌊 폭포처럼 위에서 아래로 흐르고 한 군데로 모여 계단으로 만들어진다.
전체적인 덩어리를 먼저 나눠라.
(컨텐츠부터 막 서둘러 넣지말아요~)
구분을 위해 각각 시각적으로 힌트를 줘야한다.
(백그라운드컬러를 주고 이미지를 넣는 등)
기본(레이아웃 관련) 스타일만 짠다.
(안에 내용물을 막 넣기 이전에 공간부터 마련한다. 기본 margin
/ padding
값)
👩🍳 요리 재료(요소, 타입셀렉터 이용) 손질부터 먼저 해주자.
(초기화를 통해 가장 담백한 상태로 만들기 inherit
, initial
(IE박멸), margin: 0
, padding: 0
)
그때부터 왠만하면 class를 사용하여 섬세한 작업 시작~!