1. FileReader 객체

FileReader 객체는 웹 애플리케이션이 비동기적으로 데이터를 읽기 위하여 읽을 파일을 가리키는File 혹은 Blob 객체를 이용해 파일의 내용을(혹은 raw data버퍼로) 읽고 사용자의 컴퓨터에 저장하는 것을 가능하게 해줍니다.

File 객체는 <input> 태그를 이용하여 유저가 선택한 파일들의 결과로 반환된 FileList 객체, 드래그 앤 드랍으로 반환된 DataTransfer객체 혹은 HTMLCanvasElement의 mozGetAsFile() API로 부터 얻습니다.

 

1-1. FileReader 메서드

MDN 사이트에서 찾아보니 FileReader에 대한 설명이 자세히 나와있었다. 그 중에 우리가 볼 것은 딱 세가지!!!

FileReader.readAsDataURL  Blob의 내용을 읽어서 URL로 표현 (여기에서 URL은 base64)
FileReader.onload  파일 읽기가 완료되면 호출되는 콜백함수
FileReader.readyState  FileReader의 상태를 나타내는 숫자
  • EMPTY : 0 : 아직 데이터가 로드 되지 않았음.
  • LOADING : 1 : 데이터가 로딩 중.
  • DONE : 2 : 모든 읽기 요청이 완료됨.

 

2. 코드

<!DOCTYPE html>
<html lang="en">
<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>CANVAS_1</title>
</head>
<body>
    <input type="file">
    <canvas id="canvas"></canvas>
</body>
</html>

<HTML 코드>

 

window.addEventListener('DOMContentLoaded', (e) => {
        window.$canvas = document.querySelector("#canvas");
        window.ctx = $canvas?.getContext('2d');
        document.querySelector('input')?.addEventListener('change',(e)=>loadFile(e)); //파일 업로드 이벤트는 input의 change로 잡을 수 있다.
    });

    function loadFile(e){
        const file = e.target.files[0];
        console.log(file);
        if(!file.type.match(/image.*/)){ //이미지 파일이 아니라면 필터링
            alert('이미지 파일이 아닙니다.');
            return;
        }
        const reader = new FileReader();
        reader.onload = (e)=>{
            console.log(e);
            const img = new Image();
            img.onload = ()=>{
                $canvas.width = img.width;
                $canvas.height = img.height;
                ctx.drawImage(img,1,1);
            }
            img.src = e.target.result;
        }
        reader.readAsDataURL(file);
    }

<javascript 코드>

메서드 실행순서

  1. input의 change메서드에 이벤트 핸들러를 지정한다. (input의 파일 업로드는 change 이벤트가 발생!)
  2. 사용자가 파일을 업로드
  3. change 이벤트 핸들러인 loadFile() 함수 호출
    1. 이벤트 객체로부터 가져온 file 정보를 기반으로 FileReader의 readAsDataURL메서드 호출 
    2. readAsDataURL메서드가 파일을 모두 읽으면 onload 콜백함수 호출
    3. onload함수 안에서는 Image객체를 생성하고 src를 readeAsDataURL 메서드의 결과물인 Base64로 읽힌 파일(e.target.result) 을 넣어준다.
    4. Image파일의 로드가 모두 끝나면 img.onload 콜백함수가 또 실행되는데 이 함수에서는 canvas의 크기와 canvas에 설정될 이미지를 설정해준다.

 

결과물

 

 

이벤트 객체

위의 코드에서 console.log의 결과물이다.

ProgressEvent객체의 target은 FileReader인데 FileReader의 result를 보면 base64로 인코딩된 file을 볼 수 있고, readerState도 DONE(2) 이 된것을 볼 수 있다.

 

 

 

 

참고사이트 : https://developer.mozilla.org/ko/docs/Web/API/FileReader

 

FileReader - Web API | MDN

FileReader 객체는 웹 애플리케이션이 비동기적으로 데이터를 읽기 위하여 읽을 파일을 가리키는File 혹은 Blob 객체를 이용해 파일의 내용을(혹은 raw data버퍼로) 읽고 사용자의 컴퓨터에 저장하는

developer.mozilla.org

 

'코딩이야기 > JS' 카테고리의 다른 글

[canvas] 캔버스로 모자이크 하기  (0) 2022.11.01
객체 DEEP COPY  (0) 2022.10.17
JavaScript 배열 랜덤 섞기  (0) 2022.10.17

1. 개념 (그냥 스크롤해도 계속 따라 다니면서 그자리 그대로 박혀있는거!)

#고정 레이아웃이란?
-1단 또는 다단 레이아웃에서 상단(header)과 하단(footer) 또는 그 두 영역이 모두 컨텐츠의 높이나 내용에 상관없이 항상 노출 되도록 하는 레이아웃
-컨텐츠의 내용이 길어서 메뉴나 상단 컨텐츠를 고정해주는 것.

#고정 레이아웃 형태를 가진 사이트들
-(네이버 소프트웨어야 놀자) https://www.playsw.or.kr/main
-(네이버 오디오클립) https://audioclip.naver.com
-(라인) https://line.me/ko

 

 

LINE|라인은 언제나 사용자와 함께 합니다.

메신저 앱 그 이상의 경험을 제공합니다. 라인은 새로운 인프라 경험, 새로운 커뮤니케이션 경험을 모두에게 전달하고자 합니다.

line.me

 

소프트웨어야 놀자

Play with AI, Play with DATA

www.playsw.or.kr

 

네이버 오디오클립

즐거움이 들린다, 오디오클립! 당신을 위한 특별한 오디오 콘텐츠를 만나 보세요.

audioclip.naver.com

 

LINE|라인은 언제나 사용자와 함께 합니다.

메신저 앱 그 이상의 경험을 제공합니다. 라인은 새로운 인프라 경험, 새로운 커뮤니케이션 경험을 모두에게 전달하고자 합니다.

line.me

 

2. 코드

<body>
    <div class="wrap">
        <div class="header">header</div>
        <div class="container">
            <div class="content">content</div>
        </div>
        <div class="footer">footer</div>
    </div>
</body>

HTML 구조

 

 

 

	html, body{
            height: 100%;
        }
        .wrap{
            height: 100%;
            min-width: 800px;
            text-align: center;
        }
        .header{
            height: 100px;
            position: fixed;
            background-color: aqua;
            top: 0; left: 0; right: 0;
        }
        .container{
            /* height를 %로 지정하기 위해서는 부모요소로 부터 높이값을 상속받아야한다. */
            min-height: 100%;
            margin: 0 auto;
            margin-top: -100px;
            padding-top: 200px;  /* padding으로 해야 border-box를 사용하여 원하는 레이아웃을 만들 수 있다. */
            box-sizing: border-box;
        }
        .content{
            margin: 0 auto;
            max-width: 1200px;
            height: 300px;
            background-color: brown;
        }
        .footer{
            height: 100px;
            background-color: blue;
        }

CSS구조

 

 

 

레이아웃

 

 

※  reset.css 적용시켜줘야 된다!!

reset.css
0.00MB

 

 

 

이제 하나하나 대충대충 이해한걸 뜯어보자.

 

3. 정리 

3-1. 전체적인 레이아웃

결과본

 

 

※ 주의해야할 점!!!

container

주의해야할 점은 container 영역이 사실 header 영역에서 부터 footer 위까지 쭉 이어져 있다는 것이다. 이는 header가 fixed로 되면서 고정영역으로 되어있기 때문이다.

 

3-2. header

여기에서 중요한 점은 position을 fixed로 설정했다는 것이다.

고정 레이아웃은 상단(header)과 하단(footer) 또는 그 두 영역이 모두 컨텐츠의 높이나 내용에 상관없이 항상 노출 되도록 하는 레이아웃 이므로 fixed가 가장 중요하다고 생각한다.

 

fixed를 적용하면 요소가 해당 영역에 딱 붙어있게 된다. (GIF)

 

 

3-3. container

container css

# header fixed 문제 해결

고정 레이아웃을 공부할 때 가장 감명깊었던것이 container 부분이었다. 그 이유가 header가 fixed가 되면서 container 부분이 header 아래로 들어가버리는 현상을 해결해야했기 때문인데 단순히 margin-top: 100px;(header의 높이가 100px이니까 그만큼 내려주는 것) 을 하면 되는 줄 알았는데, 훨씬 좋은 방법 이 있었다. 

 

[해결방법]

1. 오히려 margin-top : -100px; 을 해준다. (margin은 -를 하면 반대로 움직인다고 생각)

원하는 그림(좌) / margin-100px; 를 했을 때 그림(우)

 

2. padding-top: 200px;

padding-top:200px; 결과

container의 height가 200px; 만큼 더 커진 이유가 중요하다.

예를 들면 해당 예시에서의 container 크기는 969px이다. (html 태그의 height 크기 자체가 969px이고, container는 min-height: 100%; 이기 때문에 부모의 height를 100% 상속받는다.)

하지만 padding-top:200px; 을 하면서 container의 크기가 200px 늘어나버려 1169px; 가 되어버린것.

 

그것을 해결하기 위해 box-sizing: border-box; 를 해준다.

이는 padding 값과 border 값도 포함하여 요소의 height를 지정해주는 속성값이다.

 

3. box-sizing: border-box;

결과적으로 아래와 같은 모양이 된다.

border-box 적용

 

중요한 내용은 다 정리했으니까

끄읕..

'TEMP' 카테고리의 다른 글

윈도우10 자동 드라이버 업데이트 기능 끄기  (0) 2018.08.01

간단한 프로젝트를 할 떄 급하게 GIT에 올려야할 때가 있다.

 

그럴 때는 커맨드를 주로 이용하는 편인데..  너무 가끔씩 쓰다보니까 명령어를 잊버려서 정리도 할 겸 써본다 ㅎㅎ..

 

1. 깃 설치

GIT이 설치되어있지 않다면 먼저 깃을 설치해주자.

GIT 설치주소 : https://git-scm.com

 

Git

 

git-scm.com

 

2. 깃 설치 확인 및 초기화

git version

git version : git이 제대로 설치되었는지 확인 할 겸 부가적으로 버전도 볼수 있다. 개이덕

 

git init

git init : git 저장소를 생성한다. (.git 폴더 생성) 

이때 부터 IDE의 파일 색이 달라지고 파일이름 옆에 U, M 과같은 알파벳이 붙는다. git이 버전을 관리하기 시작했다는 증거이다.

 

3. 원격 저장소 생성

https://github.com/

 

GitHub: Where the world builds software

GitHub is where over 83 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and feat...

github.com

깃 허브에 로그인하고 들어가면 좌측 상단에 New 라는 초록색 버튼이 보인다. 해당 버튼을 누르면 원격 저장소를 생성할 수 있다.

기본적으로 저기 빨간상자 부분만 입력해주면 쉽게 원격저장소 생성이 가능하다. 소유자와 저장소 이름을 설정하는 부분이다.

 

4. 원격 저장소 설정

4-1. 원격 저장소 주소 복사하기

원격 저장소를 생성했으니 이제 로컬 GIT에게 원격 저장소를 알려줘야한다.

생성된 원격저장소 화면에 들어가서 우측 상단 Code 부분을 클릭하면 원격저장소의 주소가 나온다.

HTTPS 부분의 주소를 복사해준다.

 

4-2. 로컬 GIT에 원격 저장소 추가하기

remote add origin [원격저장소주소]
remote -v

remote add origin 원격저장소주소 : origin이라는 이름으로 원격저장소를 추가한다.

remote -v : 저장되어있는 원격저장소 주소들을 보여준다.

remote -v 를 했을 때 위와 같이 origin이 추가되면 된다.

 

5. 로컬 저장소에 commit하고 원격 저장소에 push 하기

5-1. 로컬 저장소 commit하기

git add moza.html
git status
git commit -m "layout"

일단 로컬 저장소에 commit하기 위해서 git add 명령어를 통해 스테이징 영역에 파일을 넣어준다.

스테이징 영역에는 버전을 만들 파일들이 대기하는 장소라고 생각하면 될것같다.

 

git status로 add한 파일들이 잘 들어갔는지 확인하고 확인이 끝나면 

git commit 명령어로 커밋해준다. 위의 예시에서 "layout"은 커밋 메시지이다. (해당 버전에 대한 설명)

 

이때 커밋을 완료하면 master 브랜치가 자동으로 생성될 것이다.

이렇게 브랜치가 생성된 상태에서 마지막으로 원격 저장소에 PUSH해주면 된다.

 

5-2. 원격 저장소 PUSH하기

git push origin master

 

근데 여기서 git을 최초 설치하여 사용자 정보가 설정되어있지 않다면 Authentication failed for~ 에러가 뜬다.

그럴떄는 당황하지 말고 설정해주면 된다.

* 사용자 설정

git config user.name 사용자명
git push origin master

다시 푸쉬를 시도하면 비밀번호를 입력하라고 뜨는데 그때 비밀번호 혹은 Token을 입력해주면 된다.

※발급 받은 토큰이 없다면 ... 나중에 또 하는 방법 만들어야지

 

+ Recent posts