웹프로그래밍/CSS

프로그래밍 언어 활용 17일차 (24/12/03)

wkun 2024. 12. 3. 13:10

CONTENTS

 

CSS 기능

1. css 작업순서

2. 드롭다운 메뉴

3. position: absolute;

 

------------------------------

 

CSS 기능

 

1. css 작업순서

   1. 부모가 자식 정렬: display: flex;

       하위 flex, align, justify 관련 속성들

   2. 자기자신 정렬  

       position

       transform:translate()  

       margin, padding  

   3. 크기: width, height (px, %) 

 

html

<body>
  <header class="container">
    <div class="img_box">
      <img src="./img/famms_logo.png" alt="logo">
    </div>
    <nav>
      <ul class="nav">
        <li>home</li>
        <li>pages</li>
        <li>products</li>
        <li>blog</li>
        <li>contact</li>
        <li>cart</li>
        <li>search</li>
      </ul>
    </nav>
  </header>
</body>

 

css

*{
  margin:0;
  padding:0;
  text-decoration : none;
  list-style:none;
  box-sizing:border-box;
  color: inherit;
}

/* 마지막에 container 주기 */
 
.container{
  width: 80%;
  margin: 0 auto;
}

/* 1. 직계 부모 정렬 */
 
header{
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 20px;
  /* background-color: aqua; */
}

/* 2. 자기자신 정렬 x */
 
/* 3. 크기 */
 
header .img_box{
  width: 20%;
  /* background-color: blueviolet; */
}

header .img_box img{
  width: 100%;
}

/* 1. 직계 부모 정렬 */
 
header .nav{
  display: flex;
  /* background-color: blue; */
  /* padding: 20px */
}

/* 2. 자기자신 정렬 */
 
header nav ul li{
  margin-right: 20px;
  /* background-color: red; */
}

/* 3. 크기x */
 
/* width, height 안주고 hover 영역 키울 때 padding 사용 */
 
header nav ul li:hover{
  padding: 10px;
  background-color: aquamarine;
}

 

cf)- background-color 또는 border로 영역 확인

    - .container 마지막에 사용(직계에 따로 사용)

    -box 크기 설정하고 이미지 크기(img) 100% 주면 됨

    -자식 요소 정렬 안될 때 width 늘려서 확인(콘텐츠 사이즈로 설정되어 있음)->너비주면 flex 가능

    -width, height 안주고 hover 영역 키울 때 padding 사용

 

*마우스 우클릭->문서 서식: 자동 들여쓰기 기능

 

 

2. 드롭다운 메뉴

 

-사용자가 특정 메뉴 항목을 "클릭하거나, 마우스를 올렸을 때" 숨겨져있던 하위 메뉴 항목들이 나타남

-하위 메뉴 항목들은 특정 메뉴와 관련이 있고 추가적인 메뉴임

 

드롭다운 메뉴의 원리

1)드롭다운 메뉴는 특정 메뉴와 관련된 내용이니, 특정 메뉴 항목(li)과 같이 묶여있어야함

2)드롭다운메뉴는 특정 메뉴 항목 바로 밑에 배치되어야하고 다른 메뉴 항목에 영향을 주지 않아야 함

3)보이지 않게 숨겼다가 특정 조건(클릭하거나 마우스를 올렸을 때)을 만족하면, 나타나야함

 

드롭다운 메뉴의 원리의 코드화

1)드롭다운메뉴는 특정 메뉴와 관련된 내용이니, 특정 메뉴 항목(li)과 같이 묶여있어여함

  

2)드롭다운메뉴는 특정 메뉴 항목 바로 밑에 배치되어야하고 다른 메뉴 항목에 영향을 주지 않아야 함

/* 특정 항목의 추가 메뉴 배치 작업 */
/* 특정 항목 li를 선택하여 하위 요소가 position:absolute; 했을 때의 기준점 제시 */
 
.main_menu > :nth-child(1){
  position: relative;
}

 

/* 특정 항목 li를 기준으로 position:absolute;하고 위치 조정: absolute해야 다른 메뉴 항목에 영향을 주지 않음 */
.sub_menu{
  position: absolute;
  top: 30px;
  left: 0;
}

 

3)보이지 않게 숨겼다가 특정 조건(클릭하거나 마우스를 올렸을 때)을 만족하면, 나타나야함

.sub_menu{
  position: absolute;
  top: 30px;
  left: 0;
  display: none;
 /* 배치 끝나면 시각, 구조적 숨기기*/
}
/* 특정 조건 지정하고, sub_menu 나타나도록 속성 지정 */
.main_menu>li:nth-child(1):hover .sub_menu{
  display: block;
/*첫번째 항목에 마우스를 올렸을 때 숨겨져 있는 메뉴 나타나도록 지정 */
}

 

기본 드롭다운메뉴 구현

html

<body>
  <ul class="main_menu">
    <li>Portfolio</li>
    <li>Calender
      <ul class="sub_menu">
        <li>Event1</li>
        <li>Event2</li>
        <li>Event3</li>
      </ul>
    </li>
    <li>Resume</li>
    <li>Blog</li>
  </ul>
</body>

 

css

*{
  margin:0;
  padding:0;
  text-decoration : none;
  list-style:none;
  box-sizing:border-box;
  color: inherit;
}

/* main_menu 가로, 가운데 정렬 */
.main_menu{
  display: flex;
  justify-content: center;
  align-items: center;
  padding: 20px;
}

/* 직계 li 설정 margin, padding 간격 주기 */
.main_menu>li{
 margin-right: 20px;
 padding: 10px;
 font-size: 20px;
 background-color: yellow;
}

/* 특정 메뉴 항목에 position: relative; 주기 */
.main_menu>li:nth-child(2){
  position: relative;
}

/* 드롭 다운 메뉴 position: absolute; 설정 */
.sub_menu{
  position: absolute;
  top: 45px;
  left: 0; /* 라인 맞추기 */
  padding: 20px;
  font-size: 20px;
  background-color: blue;
  display: none;
}

.sub_menu>li{
  margin: 2px;
}

/* 드롭다운 메뉴 hover시 표시 */
.main_menu>li:nth-child(2):hover .sub_menu{
  display: block;
}

 

 

 

3. position: absolute;

 

◎position: 요소의 배치 방법 설정

 

HTML 기본 배치 원칙

-요소와 요소는 겹칠 수가 없음-> 유일한 예외 조건이 position:absolute;

-블록 레벨 요소는 세로로 쌓이고, 인라인 레벨 요소는 가로로 쌓임

 

position: absolute; 특징

1) 기준점: 부모/조상 중에 position: absolute; 값을 가진 요소를 기준, 없다면 body 태그 기준

2) 기준점에 대한 top, bottom, left, right 속성과 값을 사용할 수 있음

3) 첫번째 기본 배치 원칙에 대한 예외 조건이므로, 요소와 요소가 겹칠 수 있어 z-index 속성을 쓸 수 있음

4) 요소끼리 겹칠 수 있다는 것은 문서 흐름에서 제거된 것임 (absolute된 요소의 빈 자리를 다른 요소가 채울 수 있음)

5) 가로, 세로 중앙 정렬하기가 수월함

 

position: absolute 사용하기

 

html

<body>
  <div class="level1">
    <div class="level2">
      <div class="level3">
        <p class="content">내용</p>
      </div>
    </div>
  </div>
</body>

 

css

 *{
  margin:0;
  padding:0;
  text-decoration : none;
  list-style:none;
  box-sizing:border-box;
  color: inherit;
}

.level1{
  width: 300px;
  height: 300px;
  margin-top: 100px;
  margin-left: 100px;
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: yellow;
}

.level2{
  width: 200px;
  height: 200px;
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: aqua;
}

.level3{
  position: relative;
  width: 100px;
  height: 100px;
  background-color: chartreuse;
}

.content{
  position: absolute;
  top: 0%;
  left: 0px;
}

 

* position: absolute는 부모 요소에 relative가 여러 개 있을 경우 가까이 있는 relative를 기준으로 적용