본문 바로가기

programming study/Clone coding

[노마드코더]코코아톡 클론코딩 (5)(2021.1.7)

본 내용은 해당 강의 토대로 작성

Git and Github

  • Git: 파일의 변경 내역을 관리할 수 있다.
  • Github : Git의 사항을 조회할 수 있다.
  • Github Desktop : Github과 데스크톱을 연동한다.
  • .gitignore : git으로 추적하고 싶지 않은 파일을 적어놓으면, 해당 파일을 무시된다.

Cloning time

1. Introduction

  • 카카오톡을 HTML과 CSS만으로 구현한다.
    • 로딩 화면
    • 회원 가입 페이지
    • 친구 목록 페이지
    • 대화 목록 페이지
    • 검색 페이지
    • 더보기 페이지
    • 설정 페이지
    • 채팅방
  • 백엔드는 적용하지 않는다.

2. index.html

index

  • 기본적으로, 대부분의 웹 서버는 index.html을 먼저 읽어 낸다.
  • HTML과 CSS로 위 페이지를 Cloning 한다.

기본 구성

  • VSC 환경에서, !를 입력하면 HTML 기본 서식을 바로 입력할 수 있다.
  • 클래스 명을 지을 때, 일반적인 이름보다는 다른 요소들과 구분을 짓기 위해서 아래처럼 특징적인 이름을 짓는다.
<div class="status-bar">
  <div class="status-bar__column">
  </div>
</div>
  • BEM(Blcok Element Modifier)
    • 클래스 속성만 사용한다.
    • Element : .block__element
    • Modifier : .block block--color--red

아이콘 삽입

  • svg 형식으로 아이콘을 추가한다.

    • 좌표로 되어있고 늘이고 줄이기가 자유롭다.

    • heroicons, Font Awesome 에서 무료 아이콘을 받아 사용할 수 있다.

Font Awsome 사용방법

  • 회원가입을 하여 이메일 인증을 한다.
  • Font Awsome에서 제공되는 script태그를 복사한다.
  • 적용할 페이지의 body태그 하단에 붙여넣기 한다.
  • 삽입할 곳에 아이콘의 html태그를 붙여 넣는다.
<body>
    <div class="status-bar">
        <div class="status-bar__column">
            <span>No Service</span>
            <i class="fas fa-wifi"></i>
            <!-- Wifi Icon -->
        </div>
        <div class="status-bar__column">
            <span>12:00</span>
        </div>
        <div class="status-bar__column">
            <span>100%</span>
            <i class="fas fa-battery-full"></i>
            <!-- Battery Icon -->
        </div>
    </div>
    <script src="https://kit.fontawesome.com/7ae4be9b50.js" crossorigin="anonymous"></script>
    <!-- fontawesome 스크립트 -->    
</body>

폼 만들기

  • 배운 HTML을 토대로 회원가입 폼 만들기
    <form id= "login-form">
        <input type="text" placeholder="Email or phone number" />
        <input type="password" placeholder="Password" />
        <input type="submit" value="Log In" />
        <input type="submit" value="Sign Up" />
        <a href="#">Find kokoa Account or Password</a>
    </form>
  • fom에 id를 지정한다.

상태바 CSS

  • index.html head상단에 CSS파일을 link한다.
 <link rel="stylesheet" href="css/styles.css">

이제, styles.css에서 CSS를 작성한다.

body font 설정하기

body {
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen,
    Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
}
  • font-family 을 추가한다.
  • Google Fonts에서 다양한 폰트를 가져올 수 있다.
    • 원하는 폰트를 선택한다.
    • 폰트의 url을 복사해서 CSS 파일 상단에 @import 해준다.
    • font-family를 복사해서 적용할 곳에 붙여넣기 한다.
  • 많이 추가하면 웹 사이트가 무거워진다.

CSS hack

  • 콘텐츠의 글자나 이미지때문에 가운데 정렬이 안될 때 사용할 수 있다.
  • 이상하지만, 작동한다.
  • 적용 순서
    • 상위 박스 :
    • justify-content: center;
    • 내부 박스 :
    • width: 33%;
    • 중앙에 위치할 박스 :
    • display: felx; justify-content: center;
    • 오른쪽에 위치할 박스 :
    • display: flex; justify-content: flex-end; align-items: center;

CSS 파일 분리하기

  • stauts의 CSS를 다 설정했으면, 별도의 파일로 분리한다.
  • 모든 페이지에 공통적으로 status bar가 포함되므로 분리 후 링크를 하는 것이 더 편하기 때문이다.

Reset CSS

  • 브라우저에서 제공하는 body의 기본 margin 설정을 없앤다.
  • 검색 후 파일을 복사한 뒤 @import 한다.
  • 전체 웹 페이지의 기본 설정 CSS파일로 지정
  • input의 border를 전부 지워 줄 것이므로 마지막에 아래의 코드를 추가
input:focus {
  outline: none;
}

Header CSS

  • index.html 의 header태그를 설정한다.
.welcome-header {
  margin: 90px 0px;
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
}

.welcome-header__title {
  margin-bottom: 20px;
  font-size: 25px;
}

.welcome-header__text {
  width: 60%;
  opacity: 0.7;
}
  • 지정한 클래스 명을 사용해서 세부 사항들을 설정한다.
    • Chrome의 확장 프로그램 page ruler redox를 사용해서 샘플 이미지의 치수를 측정
  • .welcom-header__text의 폰트 색상이 회색일 때, opacity를 설정하는 방법도 있다.
  • .welcom-header 의 자식 요소가 세로로 있어야 하므로 flex-direction: column을 설정한다.
  • text-align : center : 텍스트 태그들을 가운데 정렬한다.

Login form CSS

  • index.html의 Login form을 설정한다.
#login-form {
  display: flex;
  flex-direction: column;
  margin: 0px 30px;
}

#login-form input {
  border: none;
  padding: 15px 0px;
  font-size: 18px;
  border-bottom: 1px solid rgba(0, 0, 0, 0.2);
  margin-bottom: 25px;
  transition: border-color 0.3s ease-in-out;
}

#login-form input::placeholder {
  color: rgba(0, 0, 0, 0.4);
}

#login-form input:focus {
  border-color: var(--yellow);
}
  • 로그인 폼은 요소들이 위 아래로 나란히 있으므로 login-formflex-direction : colomn을 설정한다.
  • margin, padding 값들을 설정한다.
  • font-size, color를 설정한다.
    • 색상은 Chrome의 확장 프로그램 colorzilla를 사용하여 추출한다.
  • login-form input::placeholderplaceholder의 색상 지정
  • form이 focus 되었을 때 색상 변화transition 설정
    • 색상 변수를 선언하기 위해, 별도의 변수 파일을 생성한다.
:root {
  --yellow: #fae100;
}
  • @import 후, #login-form input:focusvar(--yellow)변수 선언한 색상을 적용한다.
  • 부모 요소인 #login-form inputtransition 설정한다.

not

  • 적용하고 싶지 않은 요소를 not으로 제외할 수 있다.
#login-form input:not([type="submit"]) {
  border-bottom: 1px solid rgba(0, 0, 0, 0.2);
  transition: border-color 0.3s ease-in-out;
}
  • type="submit"은 아래의 속성을 적용하지 않게 된다.

Submit CSS

#login-form input[type="submit"] {
  background-color: var(--yellow);
  cursor: pointer;
  padding: 20px 0px;
  border-radius: 5px;
}

#login-form a {
  text-align: center;
  text-decoration: none;
  color: inherit;
  font-size: 13px;
}
  • cursor: pointer는 커서를 submit 버튼에 올렸을 때 모양을 설정한다.
  • color: inherit은 부모 요소로부터 속성을 상속받는다는 듯이다.

CSS 코드 정리하기

  • index.html의 CSS코드를 별도의 파일로 분리한다.
    • status-bar.csscomponents 폴더에 정리
    • login.cssscreens 폴더에 정리
  • styles.css에는 전 페이지 공통으로 가지는 설정을 한다.
    • 전체 페이지의 배경 색, 기본 폰트 등등

스크린샷 2021-01-07 오후 4.45.42

Form action, method

  • action은 어떤 페이지로 data를 보낼 것인지 지정한다.
 <form  action="friends.html" method="get" id= "login-form">
  • 다음에 만들 페이지인 friends.html과 연결되었다.
  • method는 2가지 방식 중 하나를 사용한다.
    • post : 백엔드 서버에 정보를 전송한다. 이 프로젝트에서는 할 수 없다.
    • get : 보안에 취약하다. URL에 포함되어도 상관없는 정보들을 이 방식으로 전송한다.

완성된 페이지

스크린샷 2021-01-07 오후 5.54.10

느낀점

나는 개인적으로 BEM방식이 편한 것 같다. 하지만, 공부할 때는 id를 사용하는 방식도 좋은 것 같다.

근데, placeholder는 왜 ::를 써야하는지, :를 쓰는 것들과 ::를 쓰는 것들의 차이가 혼동스러웠는데, 모질라에서 알아냈다.

placeholder는 의사 요소(가상 요소)이다. 가상 요소는 선택자에 추가하는 키워드로 요소의 일부분에만 스타일을 입힌다.

의사클래스 또한 선택자에 추가하는 키워드인데, 선택한 요소가 특별한 상태여야 만족할 수 있다. 가령, :hover 같은 것이 있다. 이것들을 스타일을 적용할 때, 구분하기 위해서 ::, : 를 각각 쓰는 것이다. 그러나, 최신 브라우저에서는 딱히 구분하지 않고 적용한다고 한다.

뭔가 알것 같으면서 헷갈리는 개념이다… 의사 요소에 selection은 텍스트를 드래그 했을 때의 효과인데 이것도 특별한 상태가 아닌가…?

Source Code

https://github.com/greedysiru/kokoa-clone-2021