VueJS/VueJS

2023/06/14__VueJS(Vuetify)

HELLICAT 2023. 6. 14. 18:31
반응형

03. 뷰티파이 기초 쌓기

간단하게 Vue에서 사용하는 UI프레임워크

- 01. 뷰티파이, 뷰 최고의 UI프레임워크

뷰티파이(Vuetify.js)란 무엇인가?

  • 뷰 자바스크립트 프레임워크에 머티리얼 디자인을 사용할 수 있는 컴포넌트 프레임워크
  • 구글의 머티리얼 디자인 스펙2를 충실하게 표현
  • 현대 웹앱에 필요한 컴포넌트를 편리하게 사용

뷰티파이가 주목받는 4가지 특징

  1. 구글 머티리얼 스펙의 충실한 지원
  2. 80개 이상의 시맨틱 머티리얼 디자인 컴포넌트
  3. 빠른 속도
  4. 쉬운 학습곡선

- 02. 기본 레이아웃 만들기 1

삼단 레이아웃 실습

  • 모바일 UI의 가장 기본이 되는 툴바, 본문, 바닥글의 삼단 레이아웃을 구성

핵심 내용

  • 틀바 영역: v-toolbar 엘리먼트 사용
  • 본분 영역: v-main 엘리먼트 사용
  • 여백 자동 설정: v-container 엘리먼트 사용
  • 바닥글 영역: v-footer 엘리먼트 사용
 <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

    <link
      href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900&display=swap|Material+icon"
      rel="stylesheet"
    />
    <!-- |Material+icon 아이콘 같이 사용하려면 기입 -->
    <link
      href="https://cdn.jsdelivr.net/npm/@mdi/font@6.x/css/materialdesignicons.min.css"
      rel="stylesheet"
    />
    <link
      href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css"
      rel="stylesheet"
    />
    <title>vuetify practice</title>
      </head>
  <body>
    <div id="app">
      <!-- 첫화면의 시작은 v-app엘리먼트 사용 -->
      <v-app>
        <!-- 상당부분은 v-app-bar 엘리먼트 사용 -->
        <v-app-bar app>
          <v-app-bar-nav-icon></v-app-bar-nav-icon>
          <v-toolbar-title>Header입니다</v-toolbar-title>
        </v-app-bar>
        <!-- 콘텐츠 부분은 v-main 엘리먼트 사용 -->
        <v-main>
          안녕하세요
          <v-container>Contents 입니다.</v-container>
        </v-main>
        <!-- 하단 부분은 v-footer 엘리먼트 사용 -->
        <v-footer>
          <div>Footer입니다.</div>
        </v-footer>
      </v-app>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
    <script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>
    <script>
      new Vue({
        el: "#app",
        vuetify: new Vuetify(),
      });
    </script>
  </body>

- 03. 기본 레이아웃 만들기 2

구성요소 추가 및 스타일 적용

  • 틀바에 버튼 아이콘을 추가
  • 콘텐츠 영역에 타이포그래피 추가 및 스타일 적용
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

    <link
      href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900&display=swap|Material+icon"
      rel="stylesheet"
    />
    <!-- |Material+icon 아이콘 같이 사용하려면 기입 -->
    <link
      href="https://cdn.jsdelivr.net/npm/@mdi/font@6.x/css/materialdesignicons.min.css"
      rel="stylesheet"
    />
    <link
      href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css"
      rel="stylesheet"
    />
    <title>vuetify practice</title>
  </head>
  <body>
    <div id="app">
      <v-app>
        <!-- 앱바색상을 primary(파란색)로 설정하고 fixed로 위치 고정 -->
        <v-app-bar app color="primary" dark fixed>
          <v-app-bar-nav-icon></v-app-bar-nav-icon>
          <v-toolbar-title>마스터 페이지</v-toolbar-title>
          <!-- 우측에 추가메뉴 아이콘을 넣기 위해 v-spacer엘리먼트사용 -->
          <v-spacer></v-spacer>
          <v-btn icon>
            <v-icon>mdi-dots-vertical</v-icon>
          </v-btn>
        </v-app-bar>

        <v-main>
          <v-container>
            <!-- display-1/3, body-1/2 타이포그래피 서체 종류와 크기로 설정 -->
            <h1 class="display-1 my-5">안녕하세요</h1>
            <!-- my-4로 상하 안쪽여백 설정 -->
            <p class="body-2 my-4">마스터페이지입니다.</p>
            <v-divider></v-divider>
            <h1 class="display3 my-4">안녕하세요</h1>
            <p class="body-1 my-4">마스터페이지입니다.</p>
          </v-container>
        </v-main>
        <!-- footer 색상을 secondary로 설정하고 fixed로 위치를 고정 -->
        <v-footer color="secondary" dark fixed>
          <!-- mx-auto는 블럭레벨 엘리먼트의 내용을 가운데 정렬시킴 -->
          <div class="mx-auto">Copyright &copy;</div>
        </v-footer>
      </v-app>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
    <script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>
    <script>
      new Vue({
        el: "#app",
        vuetify: new Vuetify(),
      });
    </script>

- 04. 카드 UI

카드 UI는 실전에서 상당히 많이 사용되는 UI 컴포넌트

  • v-card 엘리먼트로 카드 UI를 쉽게 구현
  • v-img와 v-card-title 엘리먼트로 이미지와 제목 작성
 <v-app>
        <!-- 앱바색상을 primary(파란색)로 설정하고 fixed로 위치 고정 -->
        <v-app-bar app color="primary" dark fixed>
          <v-app-bar-nav-icon></v-app-bar-nav-icon>
          <v-toolbar-title>마스터 페이지</v-toolbar-title>
          <!-- 우측에 추가메뉴 아이콘을 넣기 위해 v-spacer엘리먼트사용 -->
          <v-spacer></v-spacer>
          <v-btn icon>
            <v-icon>mdi-dots-vertical</v-icon>
          </v-btn>
        </v-app-bar>

        <v-main>
          <v-container>
            <!-- 카드 UI 사용을 선언하는 v-card 엘리먼트 -->
            <v-card max-width="400">
              <!-- 카드 상단에 이미지 배치 // aspect-ratio 는 비율 -->
              <v-img src="" aspect-ratio="2"></v-img>
              <!-- 카드 중간에 텍스트 배치 -->
              <v-card-text>
                <div>
                  <!-- 제목의 타이포그래피 스타일을 title로 설정 -->
                  <!-- 하단의 margin을 2로 설정 -->
                  <h2 class="title primary--text mb-2">카드UI</h2>
                  <p class="mb-0">카드 디자인에 출력될 텍스트를 입력합니다.</p>
                </div>
              </v-card-text>
              <!-- 카드 하단에 버튼 배치 -->
              <v-card-actions>
                <!-- 버튼 색상은 붉은 색으로 설정 -->
                <v-btn color="red white--text ">확인</v-btn>
                <!-- outline으로 버튼의 배경색 제거 -->
                <v-btn outlined color="red">취소</v-btn>
                <v-btn color="#9c27b0 dark">적용</v-btn>
              </v-card-actions>
            </v-card>
          </v-container>
        </v-main>

        <v-footer color="secondary" dark fixed>
          <div class="mx-auto">Copyright &copy;</div>
        </v-footer>
      </v-app>

- 05. 그리드 기본 원리

그리드는 화면 레이아웃 작업에서 가장 핵심

  • 반응형 웹 디자인을 하려면 그리드 사용법은 필수
  • v-row, v-col 엘리먼트를 통해 그리드 기능을 충실히 제공
 <v-app>
        <v-main>
          <v-container>
            <!-- 한 행은 12개의 열이 기준 -->
            <v-row class="text-center">
              <v-col cols="12" class="border_style">xs12</v-col>
              <v-col cols="6" class="border_style">xs6</v-col>
              <v-col cols="3" class="border_style">xs3</v-col>
              <!-- 현재 열의 개수가 9개인데 열 4개를 추가하면 12를 초과하므로 자동 줄바꿈 -->
              <v-col cols="4" class="border_style">xs4</v-col>
              <!-- 총 12개의 열을 추가 . 8개열을 채운 후 4개의 열은 자동으로 줄바꿈 -->
              <v-col
                cols="1"
                v-for="item in 12"
                v-bind:key="item.id"
                class="border_style"
                >xs1</v-col
              >
            </v-row>
            <br />
            <v-row class="text-center">
              <v-col
                cols="1"
                v-for="item in 20"
                v-bind:key="item.id"
                class="border_style"
              >
                xs1</v-col
              >
            </v-row>
          </v-container>
          <v-container fluid>
            <v-row class="text-center">
              <v-col cols="12" sm="4" class="border_style">sm4</v-col>
              <!-- offset으로 그리드 사이에 4개의 열 간격을 띄움 -->
              <v-col cols="12" sm="4" offset-sm="4" class="border_style"
                >4</v-col
              >
            </v-row>
          </v-container>
        </v-main>
      </v-app>

- 06. 반응형 그리드

반응형 웹 디자인을 그리드로 제작

  • 데스크톱 pc와 모바일 웹 디자인을 반응형으로 제작
<v-app>
        <v-app-bar app flat color="primary">
          <v-toolbar-title class="white--text mx-auto">
            화면 크기에 따른 레이아웃 변경
          </v-toolbar-title>
        </v-app-bar>

        <v-main>
          <v-container>
            <!-- 한 행은 12개의 열이 기준 -->
            <v-row>
              <!-- 첫번째 열의 반응형 크기를 지정 1. xs의 경우 : 12개의 열을 사용하여
              한 행을 모두 차지 2. sm의 경우 6개의 열을 사용하여 절반 너비를
              차지 -->
              <v-col cols="12" sm="6">
                <h2 class="mb-3">Content1</h2>
                <p>첫 번째 영역</p>
              </v-col>
              <!-- 두번째 열의 반응형 크기 지정
              1.xs의 경우 :12개의 열을 사용하여 한 행을 모두 차지
              2.sm의 경우 : 6개의 열을 사용하여 절반 너비를 차지 -->
              <v-col cols="12" sm="6">
                <h2 class="mb-3">Content1</h2>
                <p>두 번째 영역</p>
              </v-col>
            </v-row>
          </v-container>
        </v-main>
      </v-app>
728x90