CSS(Cascading Style Sheet)는 HTML 문서의 스타일이나 레이아웃 등 디자인 서식을 작성하는 언어

 

※공부를 진행하다 보니 CSS의 속성 중 사용빈도, 활용도가 높은 속성들이 정리가 되었습니다.

그래서 이번 시간은 자주 사용되는 속성들을 자세히 파해쳐볼까 하여 준비하였습니다.

이 부분도 내용이 많은 편이기 때문에 파트를 나누어 정리해 보도록 하겠습니다.

(1) 편에선 width와 height, margin과 padding 속성에 대하여 정리해 보았습니다.

목차

1. width와 height

2. margin과 padding

 

1. width와 height

※width와 height속성은 단어의 뜻처럼 가로, 세로의 길이를 의미합니다. 값의 단위는 %  px, vw와 vh가 있습니다. px는 픽셀 값을 말하며 % 는 상위 컨테이너에서 차지하는 비율, vw와 vh는 html, body에 대한 비율을 말합니다.

width, height 속성은 padding, borders, margins 가 포함된 길이가 아닙니다. padding, borders, margins과과 별개의 넓이와 높이 값을 가집니다.

 

@속성

  • auto : 브라우저가 너비와 높이를 계산한다. 기본값이다.
  • length(길이) : 너비와 높이를 부동 소수점 숫자 뒤에 절대 단위 지정자( cm , mm , in , pt , pc ) 또는 상대 단위 지정자( em , ex , px )가 오는 값을 지정한다.
  • %(퍼센트) : 너비와 높이를 퍼센트로 폭을 적용한다.
  • inherit : 부모 요소로부터 값을 상속받는다.
  • VW, VH : html, body의 너비와 높이값에 대한 비율로 적용한다.
  • max-width, max-height : 최대로 가질 수 있는 너비, 높이 값을 지정합니다. 지정한 값 이하로만 사이즈가 적용됩니다.
  • min-width, min-heigth : 최소로 가질 수 있는 너비, 높이 값을 지정합니다. 지정한 값 이상으로만 사이즈가 적용됩니다.

 

 

2. margin과 padding

※margin과 padding 속성은 각각 외부여백과 내부여백을 의미합니다. border를 기준으로 보면 border와 content 사이의 여백을 padding, border와 다른 요소와의 여백을 margin이라 합니다.

 

<!DOCTYPE html>
<html lang="ko">
<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>
        div {
            width: 100px;
            height: 100px;
            border: 1px solid black;
            padding: 10px;
            margin: 20px;
        }
    </style>
</head>
<body>
    <div></div>
</body>
</html>

위의 코드처럼 content자체의 크기는 100*100이지만 1px크기의 border와의 내부여백 10px, border를 기준으로 한 외부여백이 20px로 적용된 것을 확인할 수 있습니다.

margin의 경우 위의 사진처럼 요소가 세로로 배치되어 있을 시 서로의 margin값을 공유하여 하나의 값으로 적용되며 두 요소의 margin값이 다르다면 더 큰 값으로 적용합니다. 

 

그러나 가로로 배치된 경우에는 요소 각각의 margin값이 적용되어 첫 번째 요소의 값과 두 번째 요소의 값을 합친 크기의 여백이 생기게 됩니다. 이점을 유의하여 배치해야 할 것입니다.

 

 

@margin을 이용한 가운데 정렬방법

            margin: 0px auto;

위 코드처럼 상단, 하단에 대한 값을 주고 우측, 좌측에 대한 값을 auto로 지정하면 좌, 우 여백을 같은 값으로 적용하여 요소가 가운데로 정렬됩니다.

 

 

 

@속성 값 입력 방법

            padding: 10px; /*top right bottom left 각각 10px로 적용*/
            padding: 10px 20px; /*top,bottom이 10px, right,left가 20px로 적용*/
            padding: 10px 20px 30px; /*top이 10px right,left가 20px bottom이 30px*/
            padding: 10px 20px 30px 40px; /*top right bottom left 순서로 적용*/

 

CSS에서 box형태의 속성값들은 거의 상단, 하단, 우측, 좌측의 순서로 값이 입력됩니다.

값이 하나일 때에는 전체 값이 적용되며 두 개일 경우 상단과 하단, 우측과 좌측으로 묶여 적용됩니다.

세 개일 경우는 상단, 우측과 좌측을 묶고 하단으로 적용되어 상단 10px, 우측, 좌측 20px, 하단 30px 값이 적용되는 것을 볼 수 있습니다. margin도 이와 같은 방식으로 적용되며 대부분의 box형태의 속성값들이 이와 같은 방식을 사용합니다.

※홈페이지를 만들면서 필수적으로 필요한 화면 중 하나가 로그인 화면이라고 생각합니다.

이번 시간에는 간단한 로그인 폼을 만들어 보고 화면을 구성하면서 사용되는 속성값들에 대해서 하나씩 살펴보도록 하겠습니다.

목차

1. 로그인 폼 소스 보기

2. 로그인 폼 <body>

3. 로그인 폼 CSS

 

1. 로그인 폼 소스 보기

로그인 폼

 

<!DOCTYPE html>
<html lang="ko">
<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>로그인화면</title>
    <style>
        * {padding: 0px; margin: 0px;}
        form {
            width: 350px;
            margin: 0 auto;
            padding: 20px;
            border: 1px solid black;
            border-radius: 5px;
        }
        legend {
            font-size: 16px;
            font-weight: bold;
            padding-left: 5px;
            padding-bottom: 10px;
        }
        #loginbox label {float: left; width: 120px; font-size: 15px; margin-left: 20px;}
        li {list-style-type: none; margin-bottom: 5px;}
        fieldset {
            border: 1px solid #ccc;
            margin-bottom: 30px;
            padding: 10px;
        }
        #join {
            border: none;
            margin-top: 20px;
        }
        #joinbox {
            text-align: center;
            border: none;
            padding: 10px;
        }
        #joinbox button {
            font-size: 15px;
            padding: 5px;
            border-radius: 5px;
            border: 1px solid black;
        }
        #joinbox button:hover {
            background-color: gray;
        }
        #mailbox label {
            font-size: 12px;
            margin-left: 20px;
        }
        #mailbox input {
            vertical-align: middle;
        }
    </style>
 
</head>
<body>
    <form id="login">
        <fieldset id="loginbox">
            <legend>로그인</legend>
                <ul>
                    <li><label for="user-id">아이디</label><input id="user-id" type="text" placeholder="공백없이 2자 이상" autofocus required></li>
                    <li><label for="user-pw">비밀번호</label><input id="user-pw" type="password" placeholder="특수기호 포함 8자 이상" autocomplete="off" required></li>
                    <li><label for="user-pws">비밀번호확인</label><input id="user-pws" type="password" autocomplete="off" required></li>
                    <li><label for="user-email">이메일</label><input id="user-email" type="email" placeholder="abc@naver.com" autocomplete="off" required></li>
                    <li><label for="user-tel">전화번호</label><input id="user-tel" type="tel"></li>
                </ul>
        </fieldset>

        <fieldset id="mailbox">
            <legend>광고성 메일 수신여부</legend>
            <label for="maily">메일수신</label><input id="maily" type="radio" name="mail" value="y">
            <label for="mailn">메일수신 안함</label><input id="mailn" type="radio" name="mail" value="n" checked>
        </fieldset>

        <fieldset id="joinbox">
            <button type="submit">가입하기</button>
        </fieldset>
    </form>
</body>
</html>
 

2. 로그인 폼 <body>

<body>
    <form id="login">
        <fieldset id="loginbox">
            <legend>로그인</legend>
                <ul>
                    <li><label for="user-id">아이디</label><input id="user-id" type="text" placeholder="공백없이 2자 이상" autofocus required></li>
                    <li><label for="user-pw">비밀번호</label><input id="user-pw" type="password" placeholder="특수기호 포함 8자 이상" autocomplete="off" required></li>
                    <li><label for="user-pws">비밀번호확인</label><input id="user-pws" type="password" autocomplete="off" required></li>
                    <li><label for="user-email">이메일</label><input id="user-email" type="email" placeholder="abc@naver.com" autocomplete="off" required></li>
                    <li><label for="user-tel">전화번호</label><input id="user-tel" type="tel"></li>
                </ul>
        </fieldset>

        <fieldset id="mailbox">
            <legend>광고성 메일 수신여부</legend>
            <label for="maily">메일수신</label><input id="maily" type="radio" name="mail" value="y">
            <label for="mailn">메일수신 안함</label><input id="mailn" type="radio" name="mail" value="n" checked>
        </fieldset>

        <fieldset id="joinbox">
            <button type="submit">가입하기</button>
        </fieldset>
    </form>
</body>

※우선 각각 다른 속성값을 주기 위해 form id로 "login"을 각 필드마다 "loginbox", "mailbox", "joinbox"로 구분을 지어놓았습니다. 그리고 <ul><li>를 통하여 각 항목, <input>으로 입력란을 만들어 준 뒤 이를 <label>로 묶어주었습니다.

 

<label for="user-id"> 아이디 </label><input id="user-id" type="text" placeholder="공백 없이 2자 이상" autofocus required>

 

<label for="묶어줄 아이디"><id="묶어줄 아이디">로 활용하시면 됩니다.

<input type=""> : text, password, email, tel 등 원하는 입력방식에 맞추어 지정해 주시면 됩니다.

<input placeholder="내용"> :  내용을 입력하면 사라지는 힌트 개념이라고 생각하시면 됩니다.

<input autofocus> : 화면이 실행될 시 커서가 위치할 수 있도록 해줍니다.

<input required> : 필수 입력항목을 지정하는 것으로 submit버튼으로 넘어갈 때에 지정된 항목이 비어있다면 항목을 채우라는 메시지를 보냅니다. 

<input autocomplete> : 자동완성기능 사용여부를 정하는 속성입니다. on과 off를 사용합니다.

<input value="보여줄 값" readonly> : 값을 입력할 수 없고 입력되어 있는 값을 보여주기만 하는 속성입니다.

 

<label for="maily"> 메일수신 </label><input id="maily" type="radio" name="mail" value="y">

<label for="mailn"> 메일수신 안 함 </label><input id="mailn" type="radio" name="mail" value="n" checked>

 

<input type="radio"> : 라디오버튼 타입을 생성합니다.

<input name> : 같은 이름을 가진 버튼끼리는 한 가지 항목만 선택됩니다.

<input value="값"> : submit버튼으로 정보를 넘길 때에 들어갈 값을 입력합니다.

<input checked> : 화면이 실행될 시 체크가 되어있는 항목을 지정합니다. 

 

3. 로그인 폼 CSS

    <style>
        * {padding: 0px; margin: 0px;}
        form {
            width: 350px;
            margin: 0 auto;
            padding: 20px;
            border: 1px solid black;
            border-radius: 5px;
        }
        legend {
            font-size: 16px;
            font-weight: bold;
            padding-left: 5px;
            padding-bottom: 10px;
        }
        #loginbox label {float: left; width: 120px; font-size: 15px; margin-left: 20px;}
        li {list-style-type: none; margin-bottom: 5px;}
        fieldset {
            border: 1px solid #ccc;
            margin-bottom: 30px;
            padding: 10px;
        }
        #join {
            border: none;
            margin-top: 20px;
        }
        #joinbox {
            text-align: center;
            border: none;
            padding: 10px;
        }
        #joinbox button {
            font-size: 15px;
            padding: 5px;
            border-radius: 5px;
            border: 1px solid black;
        }
        #joinbox button:hover {
            background-color: gray;
        }
        #mailbox label {
            font-size: 12px;
            margin-left: 20px;
        }
        #mailbox input {
            vertical-align: middle;
        }
    </style>

※간단한 내용이며 한눈에 보기 위해 따로 CSS로 만들지 않고 <style>로 한 번에 입력하였습니다.

 

        form {
            width: 350px;
            margin: 0 auto;
            padding: 20px;
            border: 1px solid black;
            border-radius: 5px;
        }

전체적인 form에 대한 속성값을 지정해 줍니다.

margin 0 auto : left, right margin을 auto로 주어 가운데 정렬이 되도록 했습니다.

 

li {list-style-type: none; margin-bottom: 5px;}

list-style-type:none : <li> 항목 앞 기호를 없애기 위해 스타일 값을 none으로 지정해 주었습니다.

 

 #loginbox label {float: left; width: 120px; font-size: 15px; margin-left: 20px;}

float:left : <label></label>의 항목값이 좌측으로 정렬되도록 설정하였습니다.

 

        #joinbox button {
            font-size: 15px;
            padding: 5px;
            border-radius: 5px;
            border: 1px solid black;
        }
        #joinbox button:hover {
            background-color: gray;
        }

button:hover {backgrond-color:gray} : 버튼에 마우스가 올라갔을 때에 버튼 색상이 변경되도록 하였습니다.

 

 

※이렇게 간단하게 로그인 폼을 구성해 보았습니다. 

나머지 width, margin, padding 값들을 통하여 규격을 맞추어 디자인하였습니다. 

규격을 정하는 부분들은 직접 수치들을 변경해 보면서 진행해야 전체적인 구상을 할 수 있는 눈이 생길 것 같습니다.

※CSS에서 레이아웃 페이지를 나눌 때에 주로   플렉스(Flex)와 그리드(Grid)를 많이 사용합니다.

flexbox는 한 방향 레이아웃 시스템(1차원), grid는 두 방향 레이아웃 시스템(2차원)으로 이번 시간은 그리드에 대해서 알아보려 합니다. 그리드 레이아웃(Grid Layout)은 페이지를 여러 주요 영역으로 나누거나, 크기와 위치 및 문서 계층 구조의 관점에서 HTML 기본 요소로 작성된 컨트롤 간의 관계를 정의하는 데 사용합니다.

테이블과 마찬가지로 그리드 레이아웃은 세로 열과 가로 행을 기준으로 요소를 정렬할 수 있습니다. 하지만, 테이블과 달리 CSS 그리드는 다양한 레이아웃을 훨씬 더 쉽게 구현할 수 있습니다. 예를 들어, 그리드 컨테이너 속 자식 요소를, 마치 CSS로 일일이 위치를 지정해 준 것처럼, 실제로 겹치게 층을 지면서 자리를 잡도록 각 요소의 위치를 지정해 줄 수도 있습니다. 이번 시간은 간단한 기본 구조와 속성에 대해 알아보고 다음시간에 아이템배치방법이나 축약어등을 다루어 보도록 하겠습니다.

목차

1. GRID의 기본구조

2. GRID의 속성

 

1. GRID의 기본구조

@그리드 선언

grid 레이아웃을 위한 html의 기본 구조는 container(부모)와 item(자식)으로 이루어져 있습니다.

flex와 마찬가지로 CSS에 display : grid; 를 선언 후 <body>에서 형태를 잡아야 합니다.

 

   @코드로 보기
<!DOCTYPE html>
<html lang="ko">
<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>
        .container {
            display: grid; /*그리드 선언*/
            grid-template-columns: 200px 200px 200px;/*열 생성*/
            grid-template-rows: repeat(3, 100px); /*행 생성 repeat(생성개수, 크기) = 100px크기를 3개 생성*/
            background-color: #bbb;
        }
        .box:nth-child(even) {
            background-color: #eee; /*box클래스의 짝수(even) 자식들의 속성*/
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
        <div class="box">5</div>
        <div class="box">6</div>
    </div>
</body>
</html>

 

 

 

2.  GRID의 속성

@Grid container 속성 (부모 속성)

  • grid-template-row : 행(Track)의 크기를 정의
  • grid-template-columns: 열(Track)의 크기를 정의
  • grid-template-areas : 영역 이름을 참조해 템플릿 생성
  • grid-template : grid-template-xxx의 단축 속성
  • row-gap(grid-row-gap) : 행과 행 사이의 간격(Line)을 정의
  • column-gap(grid-column-gap) : 열과 열 사이의 간격(Line)을 정의
  • gap(grid-gap) : xxx-gap의 단축 속성
  • grid : grid-template-xxx과 grid-auto-xxx의 단축 속성

@Grid item 속성 (자식 속성)

  • grid-row-start : 그리드 아이템(Item)의 행 시작 위치 지정
  • grid-row-end : 그리드 아이템의 행 끝 위치 지정
  • grid-row : grid-row-xxx의 단축 속성(행 시작/끝 위치)
  • grid-column-start : 그리드 아이템의 열 시작 위치 지정
  • grid-column-end : 그리드 아이템의 열 끝 위치 지정
  • grid-column : grid-column-xxx의 단축 속성(열 시작/끝 위치)
  • grid-area : 영역 이름을 설정하거나, grid-row와 grid-column의 단축 속성
  • align-self : 단일 그리드 아이템을 수직(열 축) 정렬
  • justify-self : 단일 그리드 아이템을 수평(행 축) 정렬
  • order : 그리드 아이템의 배치 순서를 지정
  • z-index : 그리드 아이템의 쌓이는 순서를 지정

@grid-template-xxx속성

  • grid-template-row
  • grid-template-columns
  • grid-template-areas
  • grid-template

@gap속성 : 간격조절 가능

  • row-gap(grid-row-gap) : 행과 행 사이의 간격(Line)을 정의
  • column-gap(grid-column-gap) : 열과 열 사이의 간격(Line)을 정의
  • gap(grid-gap) : xxx-gap의 단축 속성

@정렬속성 (justify-items / align-items)

  • align-content  : 그리드 콘텐츠(Grid Contents)를 수직(열 축) 정렬
  • justify-content : 그리드 콘텐츠를 수평(행 축) 정렬
  • align-items : 그리드 아이템(Items)들을 수직(열 축) 정렬
  • justify-items : 그리드 아이템들을 수평(행 축) 정렬

 

 

※TRANSFORM 속성은 요소에 회전, 크기 조절, 기울이기, 이동 효과를 부여할 수 있습니다.

TANSITION 속성은 속성 변경이 즉시 영향을 미치게 하는 대신, 그 속성의 변화가 일정 기간에 걸쳐 일어나도록 해 주는 것으로 두 가지를 잘 활용한다면 다양한 애니메이션 적 효과를 줄 수 있습니다.

 

목차

1. TRANSFORM(변형)

2. TRANSITION(변화)

 

1. TRANSFORM (변형)

TRANSFORM 속성은 요소에 회전, 크기 조절, 기울이기, 이동 효과를 부여할 수 있습니다.

크게 2차원 변형과 3차원 변형으로  2가지의 형태를 가집니다.

  • 2차원 변형 : 웹 요소를 단순히 수평이나 수직으로 이동하고 회전하는 것
  • 3차원 변형 : x축과 y축에 원근감을 주는 z 축을 추가해 변형시키는 것

@2D 변형의 속성

rotate() 요소를 회전, 단위는 deg
scale(x,y) 요소의 너비와 높이를 같이 변경, 단위는 등배단위
scaleX() 요소의 너비만 변경, 단위는 등배단위
scaleY() 요소의 높이만 변경, 단위는 등배단위
skew(x,y) X축과 Y축에 따라 기울기 변환, 단위는 deg
skewX() X축을 기준으로 기울기 변환, 단위는 deg
skewY() Y축을 기준으로 기울기 변환, 단위는 deg
translate(x,y) 요소의 이동을 x축, y축으로 이동, 단위는 px
translateX() 요소를 x축으로 이동, 단위는 px
translateY() 요소를 y축으로 이동, 단위는 px
matrix(n,n,n,n,n,n) 6개의 매개변수를 한번에 처리
matrix(scaleX(), skewY(), skewX(), scaleY(), translateX(), translateY())

 

@코드로 보기
<!DOCTYPE html>
<html lang="ko">
<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>
        div {
            width: 100px;
            height: 100px;
            background-color: orange;
        }
        .box:hover {
            transform: scale(1.5,1.5);
        }
    </style>
</head>
<body>
    <div class="box"></div>
</body>
</html>

위와 같이 적용하면 box에 마우스가 닿으면 x, y축이 각 1.5배씩 증가하게 됩니다.

 

 

@3D 변형의 속성

rotate3d(x, y, z, angle) 3D회전을 한번에 정의
rotateX() X축을 중심으로 3D회전을 정의
rotateY() Y축을 중심으로 3D회전을 정의
rotateZ() Z축을 중심으로 3D회전을 정의
scale3d(x, y, z) 3D스케일(크기) 변화를 한번에 정의
scaleX() X축을 중심으로 3D크기를 정의
scaleY() Y축을 중심으로 3D크기를 정의
scaleZ() Z축을 중심으로 3D크기를 정의
translate3d(x, y, z) 3D적 요소 이동을 한번에 정의
translateX() X축을 중심으로 3D이동을 정의
translateY() Y축을 중심으로 3D이동을 정의
translateZ() Z축을 중심으로 3D이동을 정의
matrix3d
(n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n)
16개값으로 구성되어 4X4행렬로 모든 3Dtransform값을 정의
perspective(n) 3D 변형 요소의 투시도를 지정

 

 

 

2. TRANSITION(변화)

※CSS 속성을 변경할 때 애니메이션 속도를 조절하는 방법을 제공합니다. 속성 변경이 즉시 영향을 미치게 하는 대신, 그 속성의 변화가 일정 기간에 걸쳐 일어나도록 할 수 있습니다.

 

linear  등속 변화, cubic-bezier(0, 0, 1, 1)과 같다.
ease 느리게 시작했다가 빨라졌다 다시 느려진다. cubic-bezier(0.25, 0.1, 0.25, 1)과 같다.
ease-in 점점 빨라진다. cubic-bezier(0.42, 0, 1, 1)과 같다.
ease-out 점점 느려진다. cubic-bezier(0, 0, 0.58,1)과 같다.. 
ease-in-out 처음과 끝이 느리다.. cubic-bezier(0.42, 0, 0.58,1)와 같다.
cubic-bezier(N,N,N,N) 값을 입력하여 가/감속을 조작한다. 

+ Recent posts