Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

Leeyanggoo

[CSS] UI/UX 레아이웃 합치기!! 반응형 웹 페이지 만들고 설정하기!! 본문

2023/CSS

[CSS] UI/UX 레아이웃 합치기!! 반응형 웹 페이지 만들고 설정하기!!

Leeyanggoo 2023. 3. 28. 19:46

읽기 전에 잠깐!

이전 "레이아웃 만들기"의 포스팅을 참고하시면 레이아웃 제작 순서에 대해 짚고 넘어가실 수 있습니다!

 

🙄 카드형 레이아웃 만들기 포스팅 보러 가기

🙄 이미지 유형 레이아웃 만들기 포스팅 보러 가기

🙄 이미지+텍스트 유형 레이아웃 만들기 포스팅 보러 가기

🙄 슬라이드 유형 레이아웃 만들기 포스팅 보러 가기

🙄 텍스트 유형 레이아웃 만들기 포스팅 보러 가기

🙄 푸터 유형 레이아웃 만들기 포스팅 보러 가기

 


 

 


이번에는 지금까지 만들었던 모든 레이아웃을 하나로 합쳐서 한 페이지를 구성했습니다.

이제 좀 웹 페이지 같은 모양이 나오나요?ㅎㅎ

여러 개로 구성한 레이아웃을 합칠 때는 공통적으로 적용할 수 있는 여러 항목을 확인하는 게 중요합니다.

 

🧐 레이아웃의 공통 속성을 잘 확인하자!

 

<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>사이트 만들기1</title>

    <!-- SEO -->
    <meta name="author" content="이양구">
    <meta name="description" content="이양구가 만든 사이트 튜토리얼입니다.">
    <meta name="keyword" content="이양구, 사이트, 사이트 만들기, 튜토리얼">
    <meta name="robots" content="all">

    <!-- 파비콘 -->
    <link rel="shortcut icon" type="image/x-icon" href="assets/ico/favicon.png">
    <link rel="apple-touch-icon" sizes="114x114" href="assets/ico/favicon.png">
    <link rel="apple-touch-icon" href="assets/ico/favicon.png">

    <!-- CSS -->
    <link rel="stylesheet" href="assets/css/fonts.css">
    <link rel="stylesheet" href="assets/css/reset.css">
    <link rel="stylesheet" href="assets/css/common.css">
    <link rel="stylesheet" href="assets/css/style.css">
</head>

 

하나로 합친 웹 페이지의 <head> 목록입니다.

<title> 이전의 속성들은 사용자의 환경이 explorer 같은 버전이 오래된 브라우저이거나, 모바일로 보는 경우를 고려한 사항들로 VScode에서 기본적으로 HTML 문서를 만들 때 제공하는 속성입니다.

 

SEO(Search Engine Optimizatio)는 '검색 엔진 최적화'라는 뜻으로 검색 엔진에 노출됐을 때 표시할 정보들을 나타내는 속성을 모아놨습니다.

description은 페이지에 대한 설명, keyword는 어떤 검색  단어에 노출되는지, robots는 검색 엔진들이 내 어떤 content까지 접근을 허용할지를 결정합니다.

또한 파비콘(favicon)은 검색 엔진에 노출되었을 때 페이지 주소 옆에 붙는 사진으로, 노출 시 사용자가 더 쉽게 알아볼 수 있고 페이지의 상징성을 더해주는 역할을 합니다.

 

CSS는 fonts(폰트), reset(초기 설정), common(공통 설정), style(각 섹션)의 네 가지 항목으로 구성되어 있습니다.

웹 페이지를 구성할 때 각각 적용할 수 있는 공통 디자인 속성을 따로 모아놓은 것들인데요, 이렇게 여러 항목으로 나누는 이유는 차후에 유지 및 보수가 수월하기 때문입니다.

만약 폰트만 수정해야 하거나 추가해야 하는 경우, 모든 CSS 속성을 살펴보는 것보다 폰트 관련 CSS 속성만 담겨 있는 .css 파일을 보는 게 간단하기 때문입니다.

 

그렇다면 그 많던 레이아웃의 CSS 속성들은 어디로 갔을까요?

 

 

웹 페이지 디자인에 적용할 레이아웃마다의 CSS 속성들은 "style.css" 파일 속에 "@import url()"으로 불러오고 있습니다.

이렇게 레이아웃을 합치기 전에 앞서 CSS 속성들을 정리한다면 더욱 편리하겠죠?

마치 "CSS - style.css - header.css" 같이 가지를 타고 넘어온다고 생각하시면 됩니다.

 

SEO에서 중요한 Tab의 역할(Skip Navigation)

<div id="skip">
    <a href="#headerType">헤더 영역 바로가기</a>
    <a href="#sliderType">슬라이드 영역 바로가기</a>
    <a href="#imageType">이미지 영역 바로가기</a>
    <a href="#imgTextType">이미지/텍스트 영역 바로가기</a>
    <a href="#cardType">카드 영역 바로가기</a>
    <a href="#bannerType">배너 영역 바로가기</a>
    <a href="#textType">텍스트 영역 바로가기</a>
    <a href="#footerType">푸터 영역 바로가기</a>
</div>
<!-- //skip -->

 

/* skip */
#skip {
    position: relative;
    z-index: 1000000;
}
#skip a {
    background-color: #000;
    color: #fff;
    position: absolute;
    left: -400px;
    top: 0;
    padding: 20px 40px;
}
#skip a:active,
#skip a:focus {
    left: 0;
}

 

위의 <div id=skip>은 Skip Navigation을 만들기 위해 만든 div 박스입니다.

#skip 요소에 z-index 속성으로 다른 콘텐츠에 가려지지 않도록 설정하고 페이지를 Tab키를 이용했을 때 더욱 빨리 해당 콘텐츠로 이동할 수 있도록 만들었습니다.

이런 설정은 시각이 불편한 이용자들에게 도움을 줄 수 있으며, 웹 접근성을 높이는 기능을 합니다.

우리는 웹 페이지를 만들 때 공통으로 적용할 속성과 웹 접근성을 위한 구성을 먼저 갖추고 시작해야 합니다.

 

🧐 페이지 구성과 디바이스를 고려하자!

 

    <header id="headerType" class="header__wrap nexon">
        <h2 class="blind">헤더 영역</h2>
    </header>
    <!-- //headerType -->

    <main id="mainType">

        <section id="sliderType" class="nexon hide">
            <h2 class="blind">슬라이드 영역</h2>
        </section>
        <!-- //sliderType -->

        <section id="imageType" class="nexon section center">
            <h2 class="blind"">이미지 타입 영역</h2>
                        <h2 class="section__h2">Would Smoke?</h2>
            <p class="section__decs">오늘 당신이 태우고 싶은 이야기가 있나요? 편히 쉬세요.</p>

            <div class="image__inner container">
                <article class="image">
                    <figure class="image__header">
                        <img src="assets/img/imageType01_01.jpg" alt="시가 이미지">
                    </figure>
                    <div class="image__body">                    
                        <h3 class="title">지금, 여기</h3>
                        <p class="desc">한 모금의 쉼을 선물하세요. 당신의 한숨은 어떻게 생겼나요?</p>
                        <a href="#" class="btn">자세히 보기</a>
                    </div>
                </article>
                <article class="image">
                    <figure class="image__header">
                        <img src="assets/img/imageType01_02.jpg" alt="시가 이미지">
                    </figure>
                    <div class="image__body">                    
                        <h3 class="title">Cigarette</h3>
                        <p class="desc">More Cigar, More Peace. How do you split your sigh?</p>
                        <a href="#" class="btn">자세히 보기</a>
                    </div>
                </article>
            </div>
        </section>
        <!-- //imageType -->

        <section id="imgTextType" class="nexon section gray">
            <h2 class="blind"">이미지/텍스트 타입 영역</h2>
        </section>
        <!-- //imgTextType -->

        <section id="cardType" class="nexon section">
            <h2 class="blind">카드 영역</h2>
        </section>
        <!-- //cardType -->

        <section id="bannerType" class="banner__wrap nexon section center">
            <h2 class="blind">배너 영역</h2>
        </section>
        <!-- //textType -->

    </main>
    <!-- //main -->

    <footer id="footerType" class="footer__wrap section nexon">
        <h2 class="blind">푸터 영역</h2>
    </footer>
    <!-- //footerType -->

예제 파일은 imageType 부분만 옮겨온 예시입니다!

 

먼저 웹 페이지의 HTML을 사전에 구성한 대로 나누고 밑에 각주(<!-- //레이아웃 -->)를 사용해 보기 좋게 나눴습니다.

이렇게 하고 차례 차례 만든 레이아웃 HTML을 불러온다면 헷갈리지도 않고 나중에 수정하기도 쉽겠죠?

또한 각 섹션에 <h2 class="blind">를 이용해 보이진 않아도 알아볼 수 있게 웹 접근성도 높이고 있습니다.

또한 각각 section에 id로 타입을 명시해서 위의 skip의 <a> 링크 참조로 쓰고 있는 것도 보실 수 있습니다!

 

/* image__type */
.image__inner {
    display: flex;
    justify-content: space-between;
}
.image__inner .image{
    width: 49%;
    background-color: #ccc;
    position: relative;
}
.image__body {
    position: absolute;
    left: 0;
    bottom: 0;
    color: #fff;
    text-align: left;
    padding: 30px;
}
.image__body .title {
    margin-bottom: 15px;
    font-size: 32px;
    line-height: 1;
}
.image__body .desc {
    margin-bottom: 15px;
    line-height: 1.5;
    padding-right: 20%;
}
.image__body .btn {
    color: #fff;
    background-color: rgba(0,0,0,0.7);
    padding: 10px 30px;
    display: inline-block;
}

/* 미디어쿼리 */
@media (max-width: 960px){
    .image__body .desc {
        display: none;
    }
}
@media (max-width: 600px){
    .image__inner {
        flex-direction: column;
    }
    .image__inner .image {
        width: 100%;
        margin-bottom: 3%;
    }
    .image__body .title {
        font-size: 22px;
        margin-bottom: 10px;
    }
    .image__body .btn {
        padding: 10px 20px;
        font-size: 14px;
    }
}

 

위의 CSS 코드는 예제로 보여드린 imageType 섹션의 CSS 속성입니다.

상단에 각주(/* image_type */)로 해당 타입을 명시하고, 이미지 유형 레이아웃에 적용한 CSS 속성을 따로 모았습니다.

또한 하단에 "미디어쿼리"라 이름 지은 각주가 보이실 텐데요, 이는 반응형 웹 페이지를 만들기 위한 CSS 속성을 적었다는 걸 뜻합니다.

 

미디어쿼리(Media Query)는 CSS의 기술 중 하나로, 미디어 타입과 장치의 특성에 따라 웹 페이지 또는 앱의 스타일을 다르게 적용할 수 있도록 하는 기능입니다.

미디어쿼리를 이용하면 웹 페이지를 접근하는 기기의 크기, 해상도, 방향 등을 파악하여 이에 맞게 CSS 스타일을 적용할 수 있습니다.

예제에서는 iPad나 Galaxy Tab 같은 태블릿을 고려한 960px과 핸드폰을 고려한 600px 두 가지 경우에 맞게 CSS 스타일을 적용하고 있습니다.

이렇게 각 환경에 맞게 변화하는 웹 페이지를 '반응형 웹 페이지 또는 앱'라고 합니다.

반응형 웹 페이지를 설정할 때는 작업 중인 페이지를 Live Server로 브라우저에 띄우고, 개발자 도구(F12)를 사용해 자신이 작업한 레이아웃이 어떤 px에서 이상이 생기는지 확인하며 디자인하면 수월합니다.

 

해당 예제는 960px에서 콘텝츠의 설명(.image__body .desc)을 보이지 않게(display: none) 설정해서 축약시켰습니다.

600px에서는 image__inner의 flex-direction을 'column'으로 설정해서 콘텐츠가 아래로 내려가 더욱 보기 쉽도록 하고, 이에 따라 보여줄 이미지 크기 또한 수정(image의 width: 100%)하고 있습니다.

또한 해당 크기에서 콘텐츠와 폰트가 적당한 크기를 유지하도록 하기 위해 font-size를 조정하고 margin-bottom을 수정했습니다.


🙄 예제 완성 화면 보러 가기

🙄 예제 모든 코드 보러 가기

🙄 다양한 디자인 보러 가기