CSS skills(1) - display, float, position

2021. 12. 22. 19:47·CSS
반응형

이번 포스팅에서는 html에 css를 적용할 때 자주 사용하는 다양한 속성들에 대해 알아보도록 하자.

 

<목차>

  1. display : inline-block;
  2. float
  3. position
  4. 기타 

 

 

 

<display: inline-block;>

<div>는 기본적으로 블록 속성을 가지고 있다. 그렇기 때문에 <div> 안에서 컨텐츠를 정렬하려고 할 때 인라인(inline) 속성을 가지고 있는 <span>을 사용할 것이라고 생각할 수 있다. 하지만 실상은 그렇지 않다. 인라인 속성을 가지고 있을 경우 컨텐츠의 넓이와 높이 지정이 불가능하다. 인라인 속성은 기본적으로 자기가 가지고 있는 크기만큼의 영역만을 차지하기 때문에 넓이와 높이를 지정해 줄 수 있는 <div>를 주로 사용해서 정렬을 한다. 이때 사용하게 되는 css가 바로 display: inline-block; 이다.

 

<div>의 블록 속성을 인라인 속성으로 변환하고 싶을 때 사용하는 것이 바로 display: inline-block; 이다. display: inline-block;은 블록 속성을 가진 엘리먼트를 인라인 속성으로 바꿔주는 역할을 한다. 이렇게 블록 속성을 가진 <div>가 인라인 속성을 가지게끔 바꿔주면 인라인 속성을 가지고 있는 상태에서 width와 height를 이용해 넓이와 높이를 조절할 수 있게 되는 것이다.

반대로 인라인 속성을 가지고 있는 엘리먼트에 display: inline-block;을 적용하면 인라인 엘리먼트에서는 불가능했던 width와 height 속성 지정을 할 수 있게 된다. 즉, 인라인(inline)이지만 블록(block)처럼 스타일을 부여하고 싶을 때 사용하는 속성이다.

ex) 인라인이지만 블록처럼 width와 height를 넣어 크기 조절을 하고 싶을 때, 인라인이지만 효과를 부여하고 싶을 때

 

아래의 코드를 보면서 다시한번 살펴보도록 하자.

<!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>Document</title>

    <link href=".\css\practice.css" type="text/css" rel="stylesheet">    
</head>
<body>
    <div id="wrap">
        <div id="header">
            <h1 id="logo">
                로고입니다.
            </h1>
            <ul id="menu">
                <li>menu1</li>
                <li>menu2</li>
                <li>menu3</li>
                <li>menu4</li>
            </ul>
            <div id="ex">asdf</div>
        </div>
    </div>
</body>
</html>
/* CSS style sheet */

*{
    margin:0;
}

#wrap{
    width:100%;  /* 블록처럼 한 줄을 전부 사용하겠다는 의미 */
    background: red;
}

#header{
    width:1200px;  /* 웹사이트 제작시 가장 이상적인 픽셀 */
    height:500px;
    background: blue;
    margin: 0 auto;
}

#logo{
    background: green;
    font-size: 70px;
    display: inline-block;
}

#menu{
    padding:0;
    font-size: 40px;
    display: inline-block;
}

#menu > li{
    color:white;
    display: inline-block;
}

#ex{
    color: white;
    font-size: 40px;
}

코드 실행 결과

display: inline-block; 을 적용한 결과 블록 속성을 가지는 <h1>, <ul>, <li> 엘리먼트들이 인라인 속성을 가지게 된 것을 확인할 수 있다.

  • display: block;  →  해당 엘리먼트가 블록 속성을 가지게 된다. width / height 조절 가능. margin / padding 조절 가능.
  • display: inline;  →  인라인 속성으로 width / height 조절이 불가하고 margin / padding 역시 조절 불가.
  • display: inline-block;  →  성질 자체는 inline과 비슷하지만 inline이 가지고 있는 단점들을 커버할 수 있는 css속성이다. inline 속성을 가지고 있는 엘리먼트들의 width / height 조절이 가능해지고 margin / padding 값 역시 조절이 가능해진다. 

 

 

<float: left;>

float 속성은 <div>엘리먼트들을 정렬할 때 도움을 준다. 또한 블록 속성을 가지고 있는 엘리먼트에게 float 속성을 지정해 주면 별도로 display: inline-block; 속성을 지정할 필요 없이 자동으로 해당 엘리멘트를 인라인 속성으로 바꿔주게 된다. 이러한 성격 때문에 주로 <div>들을 오른쪽으로 보내거나 왼쪽으로 보내서 정렬할 때 많이 사용한다. 예를 들어 특정 <div>엘리먼트에 float: left; 속성을 적용하면 해당 <div>는 인라인 속성으로 변한 후 강제로 왼쪽으로 붙게 된다. 

아래의 코드를 보면서 조금 더 자세히 살펴보도록 하자.

<!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>Document</title>

    <link href=".\css\practice.css" type="text/css" rel="stylesheet">    
</head>
<body>
    <div id="wrap">
        <div id="header">
            <h1 id="logo">
                로고입니다.
            </h1>
            <ul id="menu">
                <li>menu1</li>
                <li>menu2</li>
                <li>menu3</li>
                <li>menu4</li>
            </ul>
            <div id="ex">asdf</div>
        </div>
    </div>
</body>
</html>
/* CSS style sheet */

*{
    margin:0;
}

#wrap{
    width:100%;  /* 블록처럼 한 줄을 전부 사용하겠다는 의미 */
    background: red;
}

#header{
    width:1200px;  /* 웹사이트 제작시 가장 이상적인 픽셀 */
    height:500px;
    background: blue;
    margin: 0 auto;
}

#logo{
    background: green;
    font-size: 70px;
    display: inline-block;
}

#menu{
    padding:0;
    font-size: 40px;
    float: left;
}

#menu > li{
    color:white;
    display: inline-block;
}

#ex{
    color: white;
    font-size: 40px;
}

코드 실행 결과

출력된 결과물을 보면 float: left; 속성을 적용한 <ul id="menu">의 <li>들이 인라인 속성을 갖고 왼쪽으로 빈 공간 없이 붙은 것을 확인할 수 있다. 그런데 조금 이상한 것을 발견할 수 있다. <h1 id="logo"> 다음으로 위치해야할 <ul id="menu">의 <li>들이 <h1 id="logo"> 보다 앞에 위치하고 있는 것을 확인할 수 있다. 이것은 float: left; 가지고 특징과 관련이 있다.

float: left;는 기존에 있던 순서를 변형시키는 특징을 갖고 있다. float: left;가 적용된 엘리먼트는 다른 엘리먼트들 보다 선행하게 된다. 다시 말해, 코드 위치상 나중에 작성되어 있을지라도 float: left;가 적용된 엘리먼트들을 먼저 처리한 후에 그 다음 것들을 처리한다. 이러한 특징 때문에 float: left;를 사용하게 되면 위에 있는 엘리먼트에도 float: left; 속성을 적용해 줘야만 한다. 

css style sheet를 다음과 같이 수정해보자.

/* CSS style sheet */

*{
    margin:0;
}

#wrap{
    width:100%;  /* 블록처럼 한 줄을 전부 사용하겠다는 의미 */
    background: red;
}

#header{
    width:1200px;  /* 웹사이트 제작시 가장 이상적인 픽셀 */
    height:500px;
    background: blue;
    margin: 0 auto;
}

#logo{
    background: green;
    font-size: 70px;
    float: left;
}

#menu{
    padding:0;
    font-size: 40px;
    float: left;
}

#menu > li{
    color:white;
    display: inline-block;
}

#ex{
    color: white;
    font-size: 40px;
}

앞선 css style sheet에서 #logo{ } 부분의 display: inline-block; 을 float: left; 로 바꿔보았다. 다음과 같은 결과물이 출력되는 것을 확인할 수 있다. 

 

코드 실행 결과

그런데 이번에는 <div id="ex">가 <ul id="menu">에 왼쪽으로 붙어버리는 현상이 발생하였다. 이러한 결과를 통해 float: left;는 아래에 있는 엘리먼트들도 강제로 옆에 붙게끔 만드다는 것을 알 수 있다. float: left;의 난해한 특성으로 float: left;가 가지고 있는 문제점 중에 하나이다. float: left;를 사용할 때는 이런 문제점들을 안고 있다는 것을 인지하고 사용하여야 한다.

 

지금까지 알아본 float: left;의 특징을 요약해보면 다음과 같다.

  • float: left; 속성을 적용하면 인라인 속성을 갖게 되면서 강제로 왼쪽으로 붙게끔 만든다.
  • float: left; 를 적용한 엘리먼트 아래에 위치한 엘리먼트들도 강제로 옆에 붙게끔 만든다. (문제점)

+) float:left;로 인해 하위 엘리먼트까지 강제로 영향을 받는 것을 해결할 수 있는 방법 중에 clear:both; 라는 속성이 있다. clear:both;는 상위 엘리먼트의 속성을 무시하고자 할 때 적용하는 css 속성이다. 상위 엘리먼트에 float:left; 혹은 float:right;가 있을 때 하위 엘리먼트에 clear:both;를 사용하여 css를 적용하면 상위 엘리먼트에 적용되었던 float 효과가 하위 엘리먼트에서는 무시되어 나타난다.

 

추가로, 레이아웃을 구성할 때는 display: inline-block;이 아닌 float을 사용하길 추천한다.

 

 

 

<position>

position 속성은 <div>를 띄울 때 사용하는 속성이다. 띄운다는 것이 애매하게 들릴 수 있으므로 "겹친다"라는 표현을 사용하면 그 뜻이 더 정확히 전달될 것 같다. 웹페이지를 제작하다 보면 <div>엘리먼트들을 겹쳐서 표현하고 싶은 순간이 존재할 수 있다. 이 때 사용하는 것이 바로 position 속성인 것이다. 다시말해 <div>들이 서로 겹쳐질 수 있도록 <div>엘리먼트에 레이어(layer) 개념을 적용해서 표현하는 것이라고 생각하면 된다.

 

position 속성을 설명하기에 앞서 position 속성을 사용할 경우, 추가적으로 쓸 수 있는 다음의 다섯가지 속성값에 대해 먼저 살펴보도록 하자.

  • top
  • bottom
  • right
  • left
  • z-index

top, bottom, right, left는 각각 영역의 위, 아래, 오른쪽, 왼쪽을 기준으로 해서 position이 적용된 엘리먼트를 기준으로부터 부여된 속성값만큼 떨어지게 하는 속성이다. 그런데 이 네가지 속성을 사용할 때는 주의할 점이 있다. 속성값을 부여할 때 top과 left, bottom과 right으로 두가지씩 묶어서 줘야한다는 것이다. 즉, 동시에 사용할 수 있는 속성이 최대 2가지 뿐이라는 말이다. 하나의 엘리먼트에 top, left, bottom, right 4가지 속성을 전부 부여할 경우 이동에 있어서 기준점이 모호해져 버리는 현상이 발생한다. 이렇게 될 경우 먼저 선언한 것을 우선순위로 두고 속성이 부여된다. 먼저 선언한 묶음만 실행되고 나머지는 실행되지 않는다. 

 

z-index는 position이 적용된 엘리먼트의 레이어(layer) 순서이다. 여러개의 엘리먼트들이 겹쳐지게 될 경우 우선순위를 두고 누가 가장 앞에 올 것인지, 누가 가장 뒤에 위치할 것인지를 정해야 하는데 이 때 사용하는 것이 z-index 속성이다. 레이어의 순서는 z-index 값이 높을수록 먼저 나오고 값이 낮을수록 나중에 나오게 나오게 된다.

 

이제 본격적으로 position 속성 자체에 대해 알아보자. 특정 엘리먼트에 position 속성을 사용할 때 position: absolute; 와 position: relative; 를 사용해서 적용 가능하다. 두 개의 차이를 알아보기 위해 다음의 두 코드를 비교하면서 살펴보자.

/* 코드1 */

<!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>Document</title>
    <style>
        #wrap{
            width:100%;
            height:500px;
            background: red;
            margin-left: 100px;
        }

        #header{
            width:100%;
            height:100px;
            background: blue;
            position: absolute;   /* 5개 속성 top right bottom left z-index 사용 가능 */
            left: 50px;
        }

    </style>
</head>
<body>
    <div id="wrap">
        <div id="header">
        </div>
    </div>
</body>
</html>

코드1 실행 결과

 

/* 코드2 */

<!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>Document</title>
    <style>
        #wrap{
            width:100%;
            height:500px;
            background: red;
            margin-left: 100px;
        }

        #header{
            width:100%;
            height:100px;
            background: blue;
            position: relative;   /* 5개 속성 top right bottom left z-index 사용 가능 */
            left: 50px;
        }

    </style>
</head>
<body>
    <div id="wrap">
        <div id="header">
        </div>
    </div>
</body>
</html>

코드2 실행 결과

코드1과 코드2를 살펴보면 <div id="wrap">과 <div id="header">가 <body>엘리먼트 안에서 부모, 자식 관계를 이루고 있는 것을 확인할 수 있다. 두 코드의 차이점은 단지 <div id="header">에 부여된 css 속성값이 코드1의 경우 position: absolute;이고 코드2의 경우 position: relative;라는 것이다. 

 

absolute와 relative의 차이점은 바로 기준점이다. position: absolute;는 <div> 사이에서 부모, 자식 관계가 형성되어 있는 경우에도 <body> 영역을 기준으로 움직인다. 코드1을 보면 <body id=""wrap">이 margin-left: 100px;에 의해 <body> 영역에서 왼쪽으로부터 100px만큼 떨어져있다. 이 때 position: absolute; left: 50px;를 사용하여 자식 관계에 있는 <body id="header">를 이동시키면 <body> 영역을 기준으로 50px만큼 움직이게 되고 <body id="wrap">보다 50px만큼 앞에 위치하게 된 것을 확인할 수 있다.

 

이와 다르게 position: relative;는 부모 영역을 기준으로 움직인다. <div> 사이에서 부모, 자식 관계가 성립할 때 부모 엘리먼트 영역의 왼쪽 상단 끝점을 기준으로 하여 이동하게 되는 것이다. 코드2를 보면 <body id="wrap">이 <body> 영역에서 왼쪽으로부터 100px만큼 떨어져 있는 상황에서 position: relative; left: 50px;를 사용하여 <body id="header">를 이동시키면 자식 관계에 있는 <body id="header">는 부모 관계에 있는 <body id="wrap">의 왼쪽 상단 끝점을 기준으로 하여 50px만큼 왼쪽으로부터 떨어진다. <body> 영역을 기준으로 해서 <body id="header">를 보면 <body id="header">는 150px만큼 왼쪽으로부터 떨어져 있게 되는 것이다. 

+) 부모 관계에 있는 <div>에까지 position: relative;를 적용할 필요는 없다. 자식 관계에 있는 <div>에만 position: relative;를 적용해도 괜찮다.

 

이렇게 position: absolute;와 position: relative;는 이동할 때의 기준점에 있어서 차이가 존재한다는 것을 알 수 있다. 한가지 주의할 점은 position: relative;를 사용할 때 부모, 자식 관계를 형성하고 있는 엘리먼트들 간의 사이즈에 신경 쓸 필요가 있다는 것이다. 자식의 영역이 부모보다 크고 자식의 z-index값이 부모보다 클 경우 부모의 영역이 자식에게 가려져서 안 보이는 경우가 생길 수 있기 때문이다.

 

참고로 레이아웃을 구성할 때는 웬만하면 position: relative;를 사용할 것을 추천한다.

 

 

 

<기타 여러 속성들>

  • list-style: none;  →  리스트의 동그라미 부분이 사라짐.
  • width: 100%;  →  블록처럼 한 줄을 전부 사용하겠다는 의미.
  • text-decoration: none;  →  <a>엘리먼트를 통해 링크를 걸면 밑줄이 발생하는데 이 css 속성을 사용해서 밑줄 제거 가능.
  • color: ○○○;  →  폰트 컬러 변경.
  • font-size: ○○px;  →  폰트 크기 변경.
  • font-weight: bold;  →  폰트 굵기 굵어짐.
  • text-align: ○○;  →  글자 정렬. (left, right, center 등등)
  • opacity: ○○;  →  투명도 주기. (단점 : 글자까지 투명해진다. 글자가 있을 경우 다른 방법으로 background에만 투명도를 줘야한다.)

 

 

 

반응형

'CSS' 카테고리의 다른 글

CSS 응용(1) - 햄버거 버튼(메뉴바) 만들기  (1) 2021.12.27
CSS skills(2) - 속성 선택자 , display:none; , input[id=" "]:checked{ } , 인접 접근자 + , :nth-child  (0) 2021.12.27
CSS 문법  (0) 2021.12.21
CSS(2) - width, height, margin, padding  (0) 2021.12.21
CSS (1) - CSS 적용 방법  (0) 2021.12.21
'CSS' 카테고리의 다른 글
  • CSS 응용(1) - 햄버거 버튼(메뉴바) 만들기
  • CSS skills(2) - 속성 선택자 , display:none; , input[id=" "]:checked{ } , 인접 접근자 + , :nth-child
  • CSS 문법
  • CSS(2) - width, height, margin, padding
bitkunst
bitkunst
Ever tried, Ever failed, No matter. Try again, Fail again, Fail better.
  • bitkunst
    THE DEVELOPER
    bitkunst
  • 전체
    오늘
    어제
  • bitkunst GitHub
    • 분류 전체보기 (154)
      • Setup (1)
      • HTML (7)
      • CSS (10)
      • Go (2)
      • JavaScript (14)
      • TypeScript (3)
      • Node (34)
        • Node.js (7)
        • Express (19)
        • NestJS (8)
      • React (19)
      • MySQL (6)
      • BlockChain (14)
      • Ethereum (20)
      • AWS (5)
      • Linux (2)
      • Infra (2)
        • Docker (2)
      • Testing (2)
      • ABOUT CS (11)
      • 토이 프로젝트 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Nest
    타입스크립트로 블록 체인 만들기
    AWS EC2
    Nodejs
    타입스크립트 블록 체인
    Ethereum
    nodejs mysql
    css
    웹프론트엔드
    리액트
    nestJS
    CSS Style
    자바스크립트
    웹개발
    이더리움 스마트 컨트랙트
    프론트엔드
    웹
    타입스크립트로 블록체인 만들기
    블록체인 지갑 서버 만들기
    React
    AWS
    타입스크립트 블록체인 만들기
    JavaScript
    redux
    Blockchain
    블록체인 트랜잭션 만들기
    html
    이더리움
    TypeScript Blockchain
    블록체인
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.1
bitkunst
CSS skills(1) - display, float, position
상단으로

티스토리툴바