여는 글


 

재디자인한 메인 페이지에서 가장 어려울 것이라고 예상했던 효과다.

 

div 위에 마우스를 올리면 div가 천천히 커지면서 안의 내용물이 보이게 하고 싶었다.

 

프로젝트 페이지들을 이런식으로 보여주고 싶었는데 생각보다 쉽게 구현해냈다.

 

 

CSS + div 커지는 효과 구현


 

먼저 div를 만든다.

 

App.js

export default class Mainpage extends Component {
  render() {
    return (
    
        
   { /* 생략 */ }
        
        
        <div>
          <Project />

        </div>
        
        
  { /* 생략 */ }
  
  
  
  
  class Project extends Component {
  render(){
    return( 
      <div className="project">
        <div className="project1">
          <h1>Capstone Renewal</h1> 
          <img alt= "aws" src={process.env.PUBLIC_URL+"/img/awsicon.png"} /> 
        <img alt= "linux" src={process.env.PUBLIC_URL+"/img/linuxicon.png"} /> 
        {/* 위의 이미지태그는 테스트용 */}
          {/* 추후 따로 클래스 써서 깔끔하게 코드 넣고 이미지, 링크, 소개글 작성 */}

        </div>
        <div className="project2">
          <h1>Showpping Mall</h1>
          {/* 추후 따로 클래스 써서 깔끔하게 코드 넣고 이미지, 링크, 소개글 작성 */}

        </div>
        <div className="project3">
          <h1>Naver Renewal</h1>
          {/* 추후 따로 클래스 써서 깔끔하게 코드 넣고 이미지, 링크, 소개글 작성 */}

        </div>


      </div>

);
  }
}

 

주석때문에 코드가 길어보이는 거지 별 내용도 없다.

 

CSS로 보면 그냥 project 안에 project 1,2,3이 있는 형식이다.

 

나도 처음엔 이렇게 1,2,3 나눌 생각이 없었는데 배경색이 각각 다르다보니 따로 구현해야 했다.

 

 

App.css

.project {
  position: relative;
  width: 80%;
  margin-left: 20%;
  font-size: large;
  margin-bottom: 10%;
}

.project img{
  visibility: hidden; /* 핵심코드 */
}

.project1 {
  width: 70%;
  height: 100px;
  background-color: #fffd9e;
  transition: all 1.5s ease-in-out; /* 핵심코드 */
}


.project1:hover{ /* 핵심코드 */
  width: 90%;
  height: 700px;
  background-color: #fffd9e;
  border-radius: 5%;
}


.project1:hover img{ /* 핵심코드 */
  visibility: visible; /* 핵심코드 */
  transition-delay: 0.5s; /* 핵심코드 */
}


.project2 {
  width: 70%;
  height: 100px;
  background-color: #adbdda;
  transition: all 1.5s ease-in-out;
}


.project2:hover{
  width: 90%;
  height: 700px;
  background-color: #adbdda;
  border-radius: 5%;
}


.project2:hover img{
  visibility: visible;
  transition-delay: 0.5s;
}


.project3 {
  width: 70%;
  height: 100px;
  background-color: #abda8a;
  transition: all 1.5s ease-in-out;
}


.project3:hover{
  width: 90%;
  height: 700px;
  background-color: #abda8a;
  border-radius: 5%;
}


.project3:hover img{
  visibility: visible;
  transition-delay: 0.5s;
}

 

project 1. 2. 3은 백그라운드 컬러만 다르고 똑같기 때문에 핵심코드라고 주석표시 해놓은 project1만 보면 된다.

 

마우스를 올려 div가 커지기 전에는 div 안 내용물이 보이지 않아야한다. 그래서 부모에게 hidden 값을 줘서 전체 기본값이 hidden이 되도록 했다. img 테스트용으로 img를 지정했지만 h1 등 다른 태그를 써도 무방하다.

.project img{
  visibility: hidden; /* 핵심코드 */
}

 

 

 

이해가 쉽도록 아래 코드를 먼저 가져왔으나 위는 project img이고 아래 코드는 project1:hover img인 것을 주의해야 한다.

hover는 마우스 올렸을 때 효과가 발생하도록 하는 코드다.

마우스를 올렸을 때는 다시 이미지가 보여야하므로 hover에서 다시 이미지가 보이도록 한다.

delay를 준이유는 내 코드는 천천히 커지도록 구현했기 때문에 어느정도 커지고 나서 이미지가 보이도록 하기 위해서 delay를 줬다.

.project1:hover img{ /* 핵심코드 */
  visibility: visible; /* 핵심코드 */
  transition-delay: 0.5s; /* 핵심코드 */
}

 

 

 

 

transition을 주지 않으면 마우스 올리거나 내리면 바로 크기가 변한다. 그러면 뚝뚝 끊기는 느낌이 나서 별로이므로 천천히 커지거나 작아지도록 효과를 줬다.

 

여기서 주의할 점은 project1,2,3을 감싸고있는 project에 적용하지 않도록 주의해야한다. project는 그냥 이 3개를 감싸고 있는 틀에 불과하므로 적용하면 제대로 구현되지 않는다. (이거때문에 1시간 날림)

.project1 {
  width: 70%;
  height: 100px;
  background-color: #fffd9e;
  transition: all 1.5s ease-in-out; /* 핵심코드 */
}

 

 

마우스 올리는 효과를 hover라고 한다. 위 코드를 보고 비교해보면 알겠지만 width가 20%, height가 600px이 커지도록 했다. border-radius는 값이 클 수록 모서리가 둥글어진다.

.project1:hover{ /* 핵심코드 */
  width: 90%;
  height: 700px;
  background-color: #fffd9e;
  border-radius: 5%;
}

 

 

 

닫는 글


 

이번 포스팅이 마지막이다.

 

나중에도 따로 포스팅하진 않을 것 같지만 모바일 최적화를 위해 CSS @media를 사용했다.

 

 

원래는 메인페이지를 지난주에 끝냈어야하는데 재디자인 한다고 오래걸렸다.

 

 

 

모든 코드(GitHub)와 포트폴리오 주소

 

웹 애플리케이션 포트폴리오(Full Stack)

GitHub https://github.com/codelistwriter/portfolio 메인 페이지 : 자기 소개 (https://codelistwriter.github.io/portfolio/) (JavaScript, React, Node.js, GitHub) 서브 페이지 1 : 4학년 졸업작품 리뉴얼 (D..

codelist.tistory.com

 

 

여는 글


 

애니메이션 구현방식에는 크게 JavaScript랑 CSS가 있는 것 같은데 차이점은 JavaScript는 좀 더 적용범위가 넓고 구현할 수 있는 기능이 다양하다, CSS는 구현이 쉽다 정도라고 한다.

 

이번에 메인페이지를 구현하면서 CSS에 익숙해진 만큼 끝까지 CSS를 사용하기로 하고 다른 페이지를 구현할 때는 최대한 JavaScript를 사용해보기로 했다.

 

 

CSS 텍스트 나타나기 효과


 

구현이 매우 쉽다.

 

App.js

class Profile extends Component {
  
  render() {
    return(
       
    <div className="fadein">

      <h1> ⸢ 2019 한국형 사물이미지 인공지능 학습데이터 활용 아이디어 공모전 ⸥ 우수상</h1>
      <h1> 2021년 2월 19일, 컴퓨터공학과 학사 취득</h1>
      <h1> 2021년 자격증 취득</h1>
      <h1> 2021년 9월 토익 000점</h1><br></br>
      <h1> #98년생 #ISTP #취미는_Unity_공부</h1>

   </div>

    );
  }
}

 

나는 h1에 적용했다.

 

App.css

.fadein{
  font-size: medium;
  position: relative;
  overflow: hidden;
  animation: fadein 7s ease-in-out;


}


@keyframes fadein{
  0% {
    opacity: 0;
    transform: translateY(20px);
  }
  100% {
    opacity: 1;
    transform: none;
  }

}

 

출처  

 

CSS 글 목록이 아래에서 위로 올라오는 기능 fadeIn

@keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 3; transform: none; } } main { animation: fadeIn 0.5s ease-in-out; } 글 목록이 아래에서 위로 올라오는 기능 fadeIn

windorsky.tistory.com

 

 

닫는 글


 

이번 구현부터 모바일화면도 같이 띄워놓고 구현하기 시작했는데 둘 다 신경쓰려니 확실히 오래걸린다.

 

거의 동적으로만 개발해야하니 결과적으론 좋을 것 같긴 하다.

 

 

 

모든 코드(GitHub)와 포트폴리오 주소

 

웹 애플리케이션 포트폴리오(Full Stack)

GitHub https://github.com/codelistwriter/portfolio 메인 페이지 : 자기 소개 (https://codelistwriter.github.io/portfolio/) (JavaScript, React, Node.js, GitHub) 서브 페이지 1 : 4학년 졸업작품 리뉴얼 (D..

codelist.tistory.com

 

 

여는 글


 

메인 페이지를 재디자인했다. 실컷 구현한 슬라이드가 없어졌다

 

그래서 상단에 배너가 위치하게 됐고 글자를 넣을 필요성이 생겨 구현하게 됐다.

 

글자를 넣게되니 예쁜 폰트를 사용하고 싶어 폰트 적용 방법도 작성되어 있다.

 

폰트는 저작권이 중요하다. 무료일지라도 상업용 사용여부, 출처 표기 여부를 확인해야 한다.

 

학교 다닐 때 교수님이 말씀해주시길, 졸업작품으로 앱을 개발했던 학생들이 플레이스토어에 출시했다가 폰트 값으로 몇 천만원을 내라고 폰트 개발 회사에서 학교로 찾아왔다고 한다.

 

정확하진 않지만 내 기억에는 앱을 내리고 학생인 점을 감안해서 그냥 넘어갔다고 들었던 것 같다.

 

저작권을 반드시 지키자

 

 

 

이미지에 글 넣기


 

이미지에 글 넣는 게 그렇게 뚝딱 되는 건 아니었다.

 

구글링하느라 고생 좀 했지만, 역시나 코드는 간단하다.

 

App.js

export default class Mainpage extends Component {
  render() {
    return (
      <div className="App">
        <div className= "banner"> /* 이미지 넣을 div */
          <div className="banner-txt"> /* 텍스트 넣을 div */
          <h1> 코드 작성자 포트폴리오 </h1> /* 넣을 글자 */
          </div>
        </div>

        <div className="line">
          <img></img>
        </div>
      
</div>
    );
  }
}

 

App.css

.banner {
  width: 100%;
  height: 200px;
  background-image: url(/src/bgimg/banner.png);
  background-size: cover; /* 핵심코드 */
  position: relative; /* 핵심코드 */
  display : inline-block;
  margin-top: 10px;
  margin-bottom: 5%;
  max-width: 100%;
  background-repeat :no-repeat;
}

.banner-txt {
  position: absolute; /* 핵심코드 */
  top: 50%; /* 핵심코드 */
  left: 50%; /* 핵심코드 */
  transform: translate( -50%, -50%); /* 핵심코드 */
  font-size: x-large;
}

 

중요한 코드는 주석으로 표시해 놨다.

 

내가 제일 고생했던 부분인 배너 가운데정렬부터 설명하자면,

 

이미지 가운데 정렬할 때 구글링하면 text-align 쓰라는 말이 많은데 나는 이미 부모요소인 .App에 적어놨기 때문에 따로 적을 필요는 없었다.

 

또한 background-size를 cover로 해놔야 모니터에 따라서 이미지(배너)가 유동적으로 사이즈 조절된다.

 

background-repeat은 no-repeat으로 해놓아야 바둑판식으로 이미지가 반복되지 않는다.

 

position이 중요하다고 하는 이유는 두 CSS를 모두 봐야한다. 

 

App.js에서 봤듯이 banner가 부모인데 부모 position을 반드시 relative, 자식을 absolute를 해놓아야 한다.

 

그다음 자식에서 가운데 정렬을 위한 top, left 마진을 50%로 설정하고 transform을 사용해서 이미지의 가운데에 글자가 올 수 있도록 한다.

출처 https://urliveblogger.blogspot.com/2021/01/css-text-align-center-on-image.html

 

이미지 위에 텍스트 정가운데에 넣는 방법

사진을 강조하는 블로그나 사이트의 경우 이미지 위에 텍스트를 놓는 경우가 많습니다. 텍스트가 보이게 놓기도 하고, 마우스를 올리면 보이게 하기도 합니다. 텍스트를 이미지 위에 어떻게 넣

urliveblogger.blogspot.com

 

그럼 배너 가운데 정렬과 글자 배치가 끝난다.

 

 

폰트 적용하기


 

먼저 사용할 폰트를 인터넷에서 찾아 고른다. 저작권 중요

 

나는 아래의 폰트를 사용했다.

 

https://blog.naver.com/hp0/222417104986

 

[무료 한글폰트] HS새마을체(2021)

HS새마을체는 토끼네활자공장에서 기획 및 제작하고, 유미주의적 달필가에서 발행하는 산 세리프 계열의 ...

blog.naver.com

 

그 다음 윈도우에 폰트를 넣어주긴 했는데 어차피 서버에 올려놓고 사용할거라 상관 없을 것 같기도 하다.

 

font도 src에 넣어줘야 오류가 안난다.

 

따라서 src아래에 font라는 폴더를 생성해 그 안에 넣어주었다.

 

그 다음 최상위 부모에 코드를 작성한다. (한 폰트로 웹페이지 전체를 사용할 경우)

 

App.css

.App {
  text-align: center;
  min-height:100vh;
  font-family: HS새마을체;
  overflow-x: hidden;
}

@font-face {
  font-family: HS새마을체;
  src: url(/src/font/HS새마을체.otf);
}


 .banner {

 

아, overflow-x는 자꾸 웹페이지 오른쪽에 여백이 생겨서 작성했다.

 

적용은 매우 간단하다. 저 코드가 끝이다.

 

 

닫는 글


 

디자인은 다시 또 내가 했는데, PPT 만들 때 자주 사용하던 픽사베이 이미지들을 사용했고 그래서 그런지 내가 학교다닐 때 만들던 PPT 느낌이 많이 난다.

 

전보다 훨씬 나은 것 같다

 

 

모든 코드(GitHub)와 포트폴리오 주소

 

웹 애플리케이션 포트폴리오(Full Stack)

GitHub https://github.com/codelistwriter/portfolio 메인 페이지 : 자기 소개 (https://codelistwriter.github.io/portfolio/) (JavaScript, React, Node.js, GitHub) 서브 페이지 1 : 4학년 졸업작품 리뉴얼 (D..

codelist.tistory.com

 

여는 글


 

웹을 구현해본 사람은 알겠지만 내 생각대로 이미지가 원하는 위치에 바로 위치한 적이 없었던 적도 꽤 있다.

 

또한 모니터의 크기에 고려하여 비율에 맞춰 배치해야 되기 때문에 함부로 좌표를 설정해 배치할 수도 없다.

 

그래서 오늘은 지난 번에 구현했던 슬라이드에 이미지와 글을 넣는 코드를 작성한다.

 

+ 웹 페이지 배경에 이미지 넣기 코드

 

 

React에서 JS와 HTML 코드 분리하기


 

App.js에서 하나의 클래스나 함수 안에도 html 코드를 작성할 수 있다.

 

그러나 앞으로 삽입해야 할 js 코드며, html 코드, 그리고 길진 않지만 css를 적용하는 코드까지 이 모든 것을 한 클래스에 작성하는 것은 가독성을 떨어뜨린다.

 

html 코드 분리를 위해 구글링을 하던 중 아래의 포스팅들을 읽고 React의 구조를 쉽게 이해할 수 있었다.

 

처음에는 당연히 index.html에 작성하는 줄 알았다.

 

초기에 주어지는 html 파일이고 App.js와 별도의 파일로 분리가 가능해 깔끔해 보였기 때문이다.

 

그러나 아래의 글을 읽으면 제시하는 방법은 내 생각과 달랐다는 것을 알 수 있다.

 

https://ljh86029926.gitbook.io/coding-apple-react/1/where-is-html

 

React에는 HTML이 없나요 ?

JS, CSS 코딩만으로 어떻게 HTML을 생성해 내는지

ljh86029926.gitbook.io

 

요약하자면, index.html은 단순한 틀일 뿐이고 실제로는 src 폴더에서 html을 작성한다는 내용이다.

 

그리고 다음 글을 읽어보면,

 

https://ljh86029926.gitbook.io/coding-apple-react/1/component-of-react

 

Component Of React

리액트의 컴포넌트

ljh86029926.gitbook.io

 

 

js 클래스를 그대로 두고 그 밑줄에, 즉 같은 파일 내 하단에 이어서 html 클래스를 생성해 작성한다는 내용이다.

 

처음에는 '파일로 분리해서 import 시키지 않는다고?' 라는 생각이 들었지만 사용하다보니 이 방법도 깔끔하고 편리했다.

 

아래 코드들도 이 구조를 사용해 구현했다.

 

 

이미지 1장만 삽입하기 + 글 삽입


 

먼저, 이미지 1장과 그 옆에 글을 삽입하는 코드다.

 

App.js

import './App.css';
import React, { Component } from "react";
import Slider from "react-slick";

export default class SimpleSlider extends Component {
  render() {
    //const profile = "img/profile.png"
    const settings = {
     // dots: true,
      infinite: true,
      speed: 500,
      slidesToShow: 1,
      slidesToScroll: 1
      
    };
    return (
      <div className="App">
        <div>
          <t1>여기는 네비게이션바 자리</t1>
        </div>
      <div>
        <Slider {...settings}>
          <div>
          <Firstpage />  /* 중요 포인트!! */
          </div>
          <div>
            <Secondpage />
          </div>
          <div>
            <Thirdpage />
          </div>
          <div>
            <Fourthpage />
          </div>
        </Slider>
      </div>
</div>
    );
  }
}


class Firstpage extends Component{  // 클래스 이름 첫문자 무조건 대문자!

  render() {
    return(
      <div>
      <h1>소개</h1>
      <blockquote>
        <img alt= "profile" src={process.env.PUBLIC_URL+"/img/profile.jpg"} align="left" hspace="20"/>
      <br></br><h3>"졸업 작품에서 백엔드 개발을 경험 해 본 후 백엔드 개발로 진로를 정해 <br></br> 현재는 풀스택 개발자를 목표로 하고 있습니다."</h3>
      <br></br></blockquote>
      <h3 align="left">나이 : 98년생</h3>
      <h3 align="left">MBTI : ISTP</h3>
      <h3 align="left">취미 : Unity 공부</h3>

      </div>
    );

  }
}

 

주석 처리한 부분을 보면 하단의 html 클래스의 이름을 js 클래스에 태그 형식으로 삽입해 사용한다.

 

이 구조가 앞서 얘기했던 구조로 구현한 방식이다.

 

이제 html 클래스 부분만 따로 떼어 보면,

 

App.js

class Firstpage extends Component{  // 클래스 이름 첫문자 무조건 대문자!

  render() {
    return(
      <div>
      <h1>소개</h1>
      <blockquote>
        <img alt= "profile" src={process.env.PUBLIC_URL+"/img/profile.jpg"} align="left" hspace="20"/>
      <br></br><h3>"졸업 작품에서 백엔드 개발을 경험 해 본 후 백엔드 개발로 진로를 정해 <br></br> 현재는 풀스택 개발자를 목표로 하고 있습니다."</h3>
      <br></br></blockquote>
      <h3 align="left">나이 : 98년생</h3>
      <h3 align="left">MBTI : ISTP</h3>
      <h3 align="left">취미 : Unity 공부</h3>

      </div>
    );

  }
}

 

img 태그에서 src 부분을 주목하면 된다.

 

process.env.PUBLIC_URL 이 부분은 필수 부분이 아니다.

 

그 뒤의 파일 경로명만 작성했을 때 img가 잘 보인다면 굳이 사용하지 않아도 되지만, 나처럼 경로명을 써도 img가 뜨지 않을 경우에만 사용하면 된다.

 

대개 img를 넣을 때는 public/img 라는 폴더를 생성해 그 안에 이미지를 넣어준다.

 

사진이 안 떠서 구글링하다보니 반드시 img 폴더를 생성하고 그 안에 사진을 넣어야 된다고 말씀하시는 분들도 계셨으니 웬만하면 img라는 파일을 별도로 만드는 것이 좋을 것 같다.

 

align은 왼쪽에 정렬하겠다는 뜻인데, 이 코드를 사용하면 사진 옆에 글이 올 수 있게 된다.

 

나중에 알게된 사실이지만 이 속성은 html 표준인 html5에서는 지원하지 않는다고 한다.

 

차후 리팩토링을 하게 된다면 다른 코드로 대체해볼 것 같다.

 

hspace는 이미지 좌우 여백을 지정해주는 속성이다.

 

마지막으로 blockquote는 들여쓰기 역할을 하는 태그다.

 

 

웹 페이지 이미지 배치하기


 

처음에는 단순히 아래처럼 img 태그에 align를 추가해 배치했다.

 

 

근데 코드를 보면 display 속성까지 사용하고 있는데 배치가 제대로 안 돼서 block 값을 줬다가... 이리저리 구글링해보는 중이었다.

 

그러나 배치는 계속 아래처럼 비뚤었고 코드까지 지저분해져서 근본적으로 해결할 수 있는 방안을 찾기로 했다.

 

그러다 알게된 것이 gridlayout이다.

 

https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Grid_Layout

 

CSS 그리드 레이아웃 - CSS: Cascading Style Sheets | MDN

CSS 그리드 레이아웃(Grid Layout)은 페이지를 여러 주요 영역으로 나누거나, 크기와 위치 및 문서 계층 구조의 관점에서 HTML 기본 요소로 작성된 콘트롤 간의 관계를 정의하는 데 아주 탁월합니다.

developer.mozilla.org

 

HTML이 아니라 CSS로 아주 깔끔하게 해결할 수 있었다.

 

App.css

.App {
  text-align: center;
  min-height:100vh;
  background-image: url(/src/bgimg/bgimg.jpg); /* 뒤에서 자세한 설명 */
  background-size: 100% 100%;
}


.wrapper {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  grid-gap: 30px; /* 칸(이미지) 사이 간격 */
  grid-auto-rows: minmax(100px, auto);
  padding : 20px;
}
.one {
  grid-column: 1;  /* 첫 번째 줄 */
  grid-row: 1; /* 첫번째 칸 */
}
.two {
  grid-column: 2;
  grid-row: 1;
}
.three {
  grid-column: 3;
  grid-row: 1;
}
.four {
  grid-column: 4;
  grid-row: 1;
}
.five {
  grid-column: 1;
  grid-row: 2;
}
.six {
  grid-column: 2;
  grid-row: 2;
}
.seven {
  grid-column: 3;
  grid-row: 2;
}
.eight {
  grid-column: 4;
  grid-row: 2;
}

 

코드가 길어서 그렇지 엄청 간단하다!

 

나는 한 슬라이드에 최대 8개의 이미지가 들어가기 때문에 eight까지 있다.

 

gridlayout을 이용하면 비율에 맞춰 이미지가 자동으로 들어간다.

 

적용 방법은 아래와 같다.

 

App.js

class Thirdpage extends Component{  // 클래스 이름 첫문자 무조건 대문자!

  render() {
    return(
      <div>
        <h1>사용 가능 툴</h1><br></br>
      <div class="wrapper">
        <img class="one" alt= "weblogo" src={process.env.PUBLIC_URL+"/img/weblogo.png"}/>
        <img class="two" alt= "linuxlogo" src={process.env.PUBLIC_URL+"/img/linux.png"}/>
        <img class="three" alt= "djangologo" src={process.env.PUBLIC_URL+"/img/djangologo.png"}/>
        <img class="four" alt= "mysqllogo" src={process.env.PUBLIC_URL+"/img/mysqllogo.png"} />
        <img class="five" alt= "mongodblogo" src={process.env.PUBLIC_URL+"/img/mongodblogo.png"} />
        <img class="six" alt= "mariadblogo" src={process.env.PUBLIC_URL+"/img/mariadblogo.png"}/>
        <img class="seven" alt= "phplogo" src={process.env.PUBLIC_URL+"/img/phplogo.png"}/>
        <img class="eight" alt= "nodejs" src={process.env.PUBLIC_URL+"/img/nodejslogo.png"}/>
      </div>
      </div>
    );

  }
}

 

코드가 매우 간단하므로 별도로 설명하지 않겠다.

 

 

웹 페이지에 배경 이미지 넣기


 

이 코드도 매우 간단하다.

 

.App {
  text-align: center;
  min-height:100vh;
  background-image: url(/src/bgimg/bgimg.jpg); /* 이 부분 */
  background-size: 100% 100%; /* 이 부분 */
}

 

background-image는 말 그대로 배경 이미지를 넣을 수 있는 속성이다.

 

다만, url 경로를 보면 아까는 이미지를 넣을 때 public/img 폴더를 사용한다고 했는데 배경 이미지는 그렇게 넣으면 아래의 에러가 났다.

 

Module not found: You attempted to import ...... which falls outside of the project src/ directory. Relative imports outside of src/ are not supported

 

에러를 봐도 src 폴더에 사진이 없어서 찾을 수 없다는 내용이다.

 

그래서 구글링하다가 해결했는데, 단순하게 그냥 src에 이미지 폴더를 하나 생성하는 방법이다.

https://britny-no.tistory.com/21

 

react에서 이미지 경로 문제

Module not found: You attempted to import ../img/1.jpg which falls outside of the project src/ directory. Relative imports outside of src/ are not supported 클래스 안에 이미지 태그를 넣어주고, 경로..

britny-no.tistory.com

 

background-size는 한 화면에 보여지는 이미지 비율이다.

 

만약 50% 50%로 지정하게 되면 바둑식으로 가로세로 동일한 이미지가 2개씩 나타나게 된다.

 

 

닫는 글


 

이미지 배치하는 데 시간을 너무 잡아먹었다.

 

CSS 배운 게 3년 전이라서 거의 모든 게 낯설지만 좋은 경험이 됐다.

 

마지막은 완성된 페이지

 

아무리 생각해도 디자인 감각은 진짜 없는 듯하다

 

 

 

모든 코드(GitHub)와 포트폴리오 주소

 

웹 애플리케이션 포트폴리오(Full Stack)

GitHub https://github.com/codelistwriter/portfolio 메인 페이지 : 자기 소개 (https://codelistwriter.github.io/portfolio/) (JavaScript, React, Node.js, GitHub) 서브 페이지 1 : 4학년 졸업작품 리뉴얼 (D..

codelist.tistory.com

 

 

 

++ 현재는 위의 페이지를 전부 리뉴얼했다. 다음 포스팅에서 볼 수 있다.

 

여는 글


 

자바스크립트로 Slide 구현하려고 알아보던 중 React-Slick 라이브러리를 사용하면 쉽게 구현할 수 있다는 것을 발견해 구현해보았다.

 

라이브러리를 사용하더라도 아직 React 파일 구조를 잘 모르는 나는 어디에 코드를 넣어야할 지 등 꽤 헤맸기 때문에 어느 파일에 코드를 넣어야하는 지, 이를 통해 내가 알게된 파일 구조를 상세히 설명할 예정이다.

 

 

환경설정


 

먼저 VSCODE 터미널에서 아래 명령어를 실행한다.

출처 : https://13akstjq.github.io/react/2020/06/28/react-slick-carousel.html

 

npm install react-slick --save

npm install slick-carousel

 

그리고 슬라이드와 관련된 CSS 파일을 import 시켜줘야 하는데 그 전에, React-Slick 설치를 성공했다면 파일 구조를 살펴보자.

 

VSCODE의 파일 구조를 보면 우리가 사용했던 src(App.css, App.js 가 있는 곳)와 그 위에 public,  node_modules 라는 폴더가 보인다. 

 

node_modules 안에 방금 설치했던 React-Slick 라이브러리가 설치되고 node_modules 아래에 slick-carousel 이라는 폴더를 클릭해보면 slick > slick.css, slick-theme.css 라는 파일이 보인다. 

 

이 파일 두 개를 일단 복사해준다. (필수는 아니지만 추후 매우 편리함)

출처 : https://sirong.tistory.com/38

 

import "slick-carousel/slick/slick.css";
import "slick-carousel/slick/slick-theme.css";

 

위 코드에 보이는 것처럼 원래 import 시켜야 할 CSS 파일 경로다.

 

앞으로 이 CSS 코드를 수정할 경우가 잦은 데, 파일을 복사해 src에 넣고 import 경로를 아래와 같이 해주면 바로바로 사용할 수 있어 편리하다.

 

index.js

import "./slick.css";
import "./slick-theme.css";

 

 

React-Slick (슬라이드) 구현


 

이제 본격적으로 슬라이드 구현을 시작한다.

 

먼저 React-Slick은 샘플 코드가 아주 잘 되어 있다. 이 코드를 그대로 가져와 사용한다.

출처 : https://react-slick.neostack.com/

 

import React, { Component } from "react";
import Slider from "react-slick";

export default class SimpleSlider extends Component {
  render() {
    const settings = {
      dots: true,
      infinite: true,
      speed: 500,
      slidesToShow: 1,
      slidesToScroll: 1
    };
    return (
      <div>
        <h2> Single Item</h2>
        <Slider {...settings}>
          <div>
            <h3>1</h3>
          </div>
          <div>
            <h3>2</h3>
          </div>
          <div>
            <h3>3</h3>
          </div>
          <div>
            <h3>4</h3>
          </div>
          <div>
            <h3>5</h3>
          </div>
          <div>
            <h3>6</h3>
          </div>
        </Slider>
      </div>
    );
  }
}

 

나는 이 코드를 도대체 어느 파일에 넣어야 하는 지 한참 헤맸는 데 구글링으로도 샘플 코드만 나와있지 어디에 넣으라는 말이 없어서 그냥 눈치껏 App.js에 넣었다. (사실 아직도 여기가 맞는 건지 모르겠다. 그래도 동작하긴 한다)

 

그러면 원래 있던 fuction App()은 어떻게 할 지(안그래도 App 함수때문에 여기 넣어도 되나 고민했다)  생각하다가 혹시 모르니 일단 전체 주석처리 해버렸다.

 

이렇게 App 함수를 주석처리 해버렸으니 코드를 수정해야 하는 부분이 약간 있다.

 

index.js

ReactDOM.render(
  <React.StrictMode>
    <SimpleSlider />  /*수정된 부분*/
  </React.StrictMode>,
  document.getElementById('root')
);

 

원래는 <SimpleSlider />가 <App /> 였다.

 

여기서 눈치 챌 수 있겠지만 SimpleSlider는 샘플코드의 Class 이름이다.

 

원래도 함수명(App)을 적어놨길래 바꿔야 될 것 같아서 바꿔줬는데 아마 바꿔주는 게 맞는 것 같다.

 

이제 npm start를 터미널에 입력해주면 좁은 슬라이드가 생길텐데 배경색, 슬라이드 크기를 지금부터 조정 할 것이다.

 

 

React-Slick 구현 후 웹 페이지 배경색


 

아마 슬라이드가 구현되면서 웹페이지 배경색이 날아갔을 것이다.

 

배경색 구현은 기존 코드를 재활용했다. 초기에 제공해주는 App.css 파일에는 .App 부분이 있다.

 

function App() 코드를 자세히 봤다면 알겠지만 아래처럼 function App()에 원래 있던 코드다.

function App() {
  return (
    <div className="App">  /* 여기 */
      <header className="App-header"> 
      </header>
    </div>
  );
}

export default App;

 

이 App은 App.css 파일에 있고 App.css를 사용하는 App.js는 맨 첫 줄에

import './App.css';

 

이렇게 App.css를 사용하겠다고 명시해놓았다.

 

이 구조는 간단하지만 기억해두는 것이 좋다. 슬라이드 CSS도 이와 같은 방식으로 사용한다.

 

그럼 이제 App.css로 가서 .App를 통해 웹페이지 배경색을 지정해보자.

 

App.css

.App {
  text-align: center;
  background-color: #c1d3f4;
  min-height:100vh;

}

 

컬러 코드는 원하는 코드로 사용하면 된다. 생각보다 코드가 짧은데 많은 시행착오를 거쳤다.

 

처음에는 min-height를 지정하는 이유를 몰라서 지웠더니 배경색이 웹페이지 일부만 채워지는 문제가 발생했다.

 

저 코드를 사용하고나서는 아래쪽까지 색이 잘 채워졌다.

 

웹 수업을 들었을 때 교수님이 모니터 크기마다 보이는 넓이가 다르니 절대, 상수로 크기를 지정하지 말라고 말씀하신 게 생각나서 조금 찝찝했는데 구글링 해보니 vh는 상수가 아니라 화면을 채우는 데 많이 사용되는 단위였다.

 

이제 .App을 App.js에 적용시키면 된다.

 

App.js

/* . . . 생략 . . . */

return (
      <div className="App"> /* 추가된 부분 */
        <div>
          <t1>여기는 네비게이션바 자리</t1>
        </div>
      <div>
        <Slider {...settings}>
          <div>
        	<h3>1</h3>
          </div>
          <div>
            <h3>2</h3>
          </div>
          <div>
            <h3>3</h3>
          </div>
          <div>
            <h3>4</h3>
          </div>
          <div>
            <h3>5</h3>
          </div>
        </Slider>
      </div>
</div> /* 추가된 부분 */
    );
  }
}

 

이렇게 전체적으로 감싸듯이 넣어주면 배경색이 잘 출력된다.

 

++혹시 이렇게 했을 때 위쪽이나 오른쪽에 좁은 흰 여백이 보인다면 그건 <h#> 태그 때문이니 지우면 해결된다. 

 

 

슬라이드 배경색 및 위치


 

슬라이드 배경색은 slick.css에서 설정한다. slick.css에 .slick-slider에서 작성하면 된다.

 

slick.css

.slick-slider /*슬라이드 틀 조정*/
{
    position:relative;
    background: #fffff4;
    display:inline-block;
    width: 1000px;
    height: 500px;
    align-items: center;
    justify-content: center;

    -webkit-user-select: none;
       -moz-user-select: none;
        -ms-user-select: none;
            user-select: none;

    -webkit-touch-callout: none;
    -khtml-user-select: none;
    -ms-touch-action: pan-y;
        touch-action: pan-y;
    -webkit-tap-highlight-color: transparent;
}

 

저 코드에서 positon, display, align-items, justify-content만 살펴보면 positon 속성은 크게보면 고정인지 아닌지로 나뉘는 것 같았다.

 

구글링하다보니 별로 추천하지는 않는 방법이지만 positon 속성 중에 absolute 속성이 있다.

 

그럼에도 저 속성을 잠깐 사용했었는데 absolute를 지정해놓고 left, top 등에 숫자를 줘서 숫자 준 만큼 밀어낼 수 있고(여백 크기 지정), 이 방식으로 가운데 정렬을 시킬 수 있다고 해서 잠깐 쓴 적이 있었다.

 

그러나 슬라이드의 width나 height가 바뀔 때마다 수치를 다시 재조정해야했고 정확한 가운데 정렬이 아니다보니 왼쪽 오른쪽 공백 크기도 그때그때 달라서 포기했다.

 

display의 inline-block은 inline, 말그대로 내용(텍스트 등)에 영향을 받아 align-items, justify-content 등이 center면 텍스트를 감싸고 있는 block 또한 가운데 정렬이 된다고 한다.

 

그러다가 저 코드로 display, align-items, justify-content를 사용해서 정확한 가운데는 아니고, 웹 페이지 상단에서 가운데 정렬까지 성공했다.

 

완전히 가운데 정렬을 시킬까하다가 상단에 네비게이션바를 만들 예정이라 <t1> 태그를 사용해서 표시했더니 슬라이드가 그 공간만큼 아래로 밀려났다.

 

그래서 굳이 완전 가운데 정렬로 만들지 말고 위에 네비게이션 바가 생기면 자연스럽게 밑으로 밀려날 것 같아서 더 이상 위치에는 손대지 않았다.

 

 

닫는 글


 

그렇게 해서 완성된 아래 페이지.

 

 

글이랑 사진 넣는 것은 다음 포스팅에서 설명

 

 

모든 코드(GitHub)와 포트폴리오 주소

 

웹 애플리케이션 포트폴리오(Full Stack)

GitHub https://github.com/codelistwriter/portfolio 메인 페이지 : 자기 소개 (https://codelistwriter.github.io/portfolio/) (JavaScript, React, Node.js, GitHub) 서브 페이지 1 : 4학년 졸업작품 리뉴얼 (D..

codelist.tistory.com

 

 

 

여는 글


 

작년에 구글 클라우드 플랫폼(1년만 무료)으로 배포?는 아니지만 서버(정확하게 말하면 구글 API 호출 위한 중간 매개 역할)를 사용한 적 있었는데

 

배포에서 막혀서 결국 배포는 못했던 기억이 있기 때문에 이번엔 배포부터 하자고 마음 먹었다.

 

다행히 React를 사용해 GitHub 저장소를 사용하면 쉽고 무료로 배포가 된다고 한다.

 

어차피 소스코드를 저장해 둘 곳도 필요했다.

 

 

환경설정


 

먼저, VSCODE(비주얼스튜디오 아님! 혼동금지), Node.js, React(라이브러리)를 설치하고 GitHub와 연결하면 된다.

 

 연결은 나도 잘 정리되어 있는 블로그를 참고했다. 

https://velog.io/@byjihye/react-github-pages

 

[React] 프로젝트 GitHub Pages 배포하기

React 프로젝트 GitHub Pages로 배포하기 (create-react-app)

velog.io

 

 

GitHub 코드 수정 후 배포 방법


 

여기서는 처음에 push하는 것 까지 나와있지만 코드를 수정하고 나서 다시 배포된 사이트를 갱신하는 내용은 없어서 이 부분에서 조금 헤맸지만 결국 저 포스팅 안에 다 나와있었다.

 

코드 수정 후 갱신 명령어 순서는 다음과 같다. vscode 터미널에서 작성

 

git add * // * 대신 변경된 파일명을 써도 됨

변경된 파일명이 정확히 뭔지 모를 때는 터미널에 git status 라고 치면 나온다.

 

git commit -m '저장소에 갱신되면서 뜨는 문구'

 

git push -u origin 브랜치이름

여기까지 하면 github 저장소에 소스코드가 갱신된다.

 

+ 혹시 여기서 failed to push some refs to... 오류가 발생한다면 아래 명령어로 사용

git pull origin 브랜치이름
git push origin 브랜치이름

(pull도 안 먹히던 상태였으나 저 명령어로 해결됨. 출처 :  https://how-can-i.tistory.com/83)

 

[오류 해결] failed to push some refs to ‘저장소주소’

오류 문구 ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to '저장소_주소' hint: Updates were rejected because the tip of your current branch is behind hint: its rem..

how-can-i.tistory.com

 

 

npm run deploy

끝. 배포 사이트에 갱신되는 명령어

 

 

닫는 글


이렇게 완성된 메인 페이지

https://codelistwriter.github.io/portfolio/

 

React App

 

codelistwriter.github.io

 

 

 

모든 코드(GitHub)와 포트폴리오 주소

 

웹 애플리케이션 포트폴리오(Full Stack)

GitHub https://github.com/codelistwriter/portfolio 메인 페이지 : 자기 소개 (https://codelistwriter.github.io/portfolio/) (JavaScript, React, Node.js, GitHub) 서브 페이지 1 : 4학년 졸업작품 리뉴얼 (D..

codelist.tistory.com