[SNS프로젝트] Input 널 너무 모르고 니 type도 모르고

핫걸코더지망생·2023년 6월 5일
0

SNS프로젝트

목록 보기
2/3
post-thumbnail

✅ SNS 프로젝트의 프로필페이지에는 이미지를 불러오는 기능이 있다.
그 과정에서 Input에는 우리가 주로 쓰는 Input type=button 이외에도 수 많은 타입이 있다는걸 알게되었다. 그 부분에 대해 공부하고 정리해보려 한다.



✔ input : 입력 요소

HTML input 요소는 웹 기반 양식에서 사용자의 데이터를 받을 수 있는 대화형 컨트롤을 생성합니다. 사용자 에이전트에 따라서 다양한 종류의 입력 데이터 유형컨트롤 위젯이 존재합니다. 입력 유형과 특성의 다양한 조합 가능성으로 인해, input 요소HTML에서 제일 강력하고 복잡한 요소 중 하나입니다.
-mozilla-



✔ input 유형

input 요소type에 따라 완전히 달라진다. input 요소에 특성을 지정하지 않은 경우 기본값은 text로 설정된다.

표로 보는 input의 다양한 "유형" 열어서 확인하기
유형설명
button기본 행동을 가지지 않으며 value을 레이블로 사용하는 푸시 버튼.
checkbox단일 값을 선택하거나 선택 해제할 수 있는 체크박스.
color (en-US)색을 지정할 수 있는 컨트롤. 브라우저가 지원하는 경우, 활성화 시 색상 선택기를 열어줍니다.
date날짜(연월일, 시간 없음)를 지정할 수 있는 컨트롤. 브라우저가 지원하는 경우, 활성화 시 날짜를 선택할 수 있는 달력 등을 열어줍니다.
datetime-local (en-US)날짜와 시간을 지정할 수 있는 컨트롤. 시간대는 지정할 수 없습니다. 브라우저가 지원하는 경우, 활성화 시 날짜를 선택할 수 있는 달력과, 시계 등을 열어줍니다.
email (en-US)이메일 주소를 편집할 수 있는 필드. 텍스트 입력 필드처럼 보이지만 유효성 검증 매개변수가 존재하며, 브라우저와 장치가 동적 키보드를 지원하는 경우 이메일에 적합한 키보드를 보여줍니다.
file파일을 지정할 수 있는 컨트롤. accept 특성을 사용하면 허용하는 파일 유형을 지정할 수 있습니다.
hidden (en-US)보이지 않지만 값은 서버로 전송하는 컨트롤. 오른쪽 칸에 예제가 있지만 숨겨져서 안보이네요!
image (en-US)src 특성에 지정한 이미지로 나타나는 시각적 제출 버튼. 이미지의 src를 누락한 경우 alt 특성의 텍스트를 대신 보여줍니다.
month (en-US)연과 월을 지정할 수 있는 컨트롤. 시간대는 지정할 수 없습니다.
number (en-US)숫자를 입력하기 위한 컨트롤. 스피너를 표시하고 지원되는 기본 확인을 추가합니다. 몇몇 장치에서는 동적 키패드들과 숫자 키패드를 표시합니다.
password (en-US)값이 가려진 한줄 텍스트 필드. 사이트가 안전하지 않으면 사용자에게 경고합니다.
radio (en-US)같은 name 값을 가진 여러개의 선택중에서 하나의 값을 선택하게 하는 라디오 버튼입니다
range (en-US)값이 가려진 숫자를 입력하는 컨트롤. 디폴트 값이 중간값인 범위 위젯으로 표시합니다. 접속사 min 와 max 사이에 사용되며 수용가능한 값의 범위를 정의합니다.
reset (en-US)양식의 내용을 디폴트값(기본값)으로 초기화하는 버튼. 권장되지 않습니다.
search (en-US)검색문자열을 입력하는 한줄 텍스트 필드. 줄바꿈 문자는 입력값에서 자동으로 제거됩니다. 지원 브라우저에서 필드를 클리어하기 위해 사용되는 삭제 아이콘이 포함됩니다. 동적 키패드들이 있는 몇몇 장치에서 엔터키 대신에 검색 아이콘을 표시합니다.
submit (en-US)양식을 전송하는 버튼
tel (en-US)전화번호를 입력하는 컨트롤. 몇몇 장치에서 동적 키패드들과 전화번호 입력기를 표시한다.
text (en-US)디폴트 값. 한줄의 텍스트 필드입니다. 새줄 문자는 입력값으로부터 자동으로 제거됩니다.
time (en-US)시간대가 없는 시간값을 입력하는 콘트롤
url (en-US)URL을 입력하는 필드. 텍스트 입력처럼 보이지만, 검증 매개변수가 있습니다. 동적 키보드들을 지원하는 브라우저와 장치들에 관련된 키보드가 있습니다.
week (en-US)시간대가 없는 주-년 값과 주의 값을 구성하는 날짜를 입력하는 컨트롤입니다.


✔ input 속성

Input강력한 요소라고 불리는 이유는 다양한 속성 때문이다.
나도 이번에 다중 이미지 선택을 위해 찾아보며 이렇게 많은 속성이 있다는 점에서 놀랐다.💨
일단 모든 Input 요소는 유형에 상관하지 않고, HTMLInputElement (en-US) 인터페이스에 기반하므로 기술적으로 모든 Input은 동일한 속성을 가집니다.
그러나 사실 대부분의 속성은 일부 유형에서만 효과를 보입니다. 게다가, 어떤 속성은 유형별로 그 영향이 달라집니다.

표로 보는 input의 다양한 "속성" 열어서 확인하기
특성유형설명
acceptfile파일을 업로드 컨트롤에서 기대하는 파일 유형을 암시
altimage이미지 유형에 대한 대체 속성. accessibiltiy 측면에서 필요.
autocompleteall양식 자동생성 기능 (form autofill) 암시
autofocusall페이지가 로딩될때 양식 제어에 오토포커스
capturefile파일 업로드 제어에서 input 방식에서 미디어 capture
checkedradio, checkbox커맨드나 컨트롤이 체크 되었는지의 여부
dirnametext, search양식 전송시 요소의 방향성을 전송할 때 양식 필드의 Name
disabledall양식 컨트롤이 비활성화되었는지의 여부
formall컨트롤을 양식 요소와 연결
formactionimage, submit양식 전송시 URL 사용하기
formenctypeimage, submit양식의 데이터 인코딩 유형이 양식 전송시 사용될 것
formmethodimage, submit양식 전송시 HTTP 방식을 사용
formnovalidateimage, submit양식 전송시 양식 컨트롤 확인을 무시하기
formtargetimage, submit양식 전송시 브라우징 맥락
heightimage이미지 높이에서 height 속성과 같음
listalmost alldatalist 자동입력 옵션의 id 속성값
maxnumeric types최대값
maxlengthpassword, search, tel, text, urlvalue의 최대 길이 (문자수)
minnumeric types최소값
minlengthpassword, search, tel, text, urlvalue의 최소 길이 (문자수)
multipleemail, file불리언값. 여러 값을 허용할지의 여부
nameallinput 양식 컨트롤의 이름. 이름/값 짝(name/value pair)의 일부로서 양식과 함께 전송된다
patternpassword, text, telvalue 가 유효하기 위해 일치해야 하는 패턴
placeholderpassword, search, tel, text, url양식 컨트롤이 비어있는 때 양식 컨트롤에 나타나는 내용
readonly (en-US)almost all불리언값. 이 값은 수정이 불가능함
required (en-US)almost all불리언값. 양식이 전송되기 위해서 반드시 입력하거나 확인이 필요한 값
sizeemail, password, tel, text컨트롤의 크기
srcimage이미지 출처의 주소에서 src 와 같은 속성
stepnumeric types유효한 증분적인 (Incremental)값
typeallinput 양식 컨트롤의 유형
valueall양식 컨트롤의 현재 값. 이름/값 짝(name/value pair)의 일부로서 양식과 함께 전송된다
widthimage이미지의 width 속성과 같다


✅ input 유형과 속성을 사용하여 이미지불러오기 기능 구현하기

✔ 프로필 설정 🔹 저희팀은 React를 사용하여 프로젝트를 제작했습니다.

UploadInput이라는 클릭시 파일을 찾는 부분으로 연결되는 클래스에 Input의 type="file" 유형과 accept=".png, .jpg, .jpeg" 속성을 부여하였고, onClick 이벤트를 추가하여 구현하였습니다.

✔ html

<Label htmlFor="file-sync" className="file-sync" onClick={handleImgClick}>
  <ImgUploadBtn>
    <Img src={imageUrl || image} alt="uploadFile" />
    <ImgIcon src={uploadIcon} alt="업로드아이콘" />
  </ImgUploadBtn>
</Label>
<UploadInput ref={uploadInputRef} id="profile" type="file" accept=".png, .jpg, .jpeg" hidden onChange={handleFile} />

✔ CSS (styled-component)

export const Label = styled.label`
  font-size: 1.2rem;
  color: var(--gray-color);
  margin-bottom: 1rem;
`;

export const ImgUploadBtn = styled.button`
  width: 11rem;
  height: 11rem;
  margin: 3rem 0;
  position: relative;
`;

export const Img = styled.img`
  width: 11rem;
  height: 11rem;
  border-radius: 50%;
  width: 11rem;
  cursor: pointer;
  position: relative;
  object-fit: cover;
`;

export const ImgIcon = styled.img`
  width: 5rem;
  position: absolute;
  bottom: 0%;
  right: 0%;
`;

✔ js

const handleImgClick = () => {
    uploadInputRef.current.click();
  };

//프로필 사진 업로드
const handleFile = async (event) => {
    const file = event.target.files[0];
    var reader = new FileReader();

    reader.onload = function (e) {
      reader.result && setImage(reader.result);
    };

    reader.readAsDataURL(event.target.files[0]);

    const profile = document.querySelector("#profile");
    const url = "api주소";

    const formData = new FormData();
    formData.append("image", file);
    try {
      const response = await fetch("api주소/image/uploadfile", {
        method: "POST",
        body: formData,
      });
      const data = await response.json();

      console.log(data);
      const path = url + data.filename;
      setImageUrl(path);
    } catch (error) {
      console.error(error);
    }
  };


✔ 결과물 (이름, id, 소개부분에 대한 폼은 이어지는 게시글을 참고해주세요)




📚 Reference

profile
산은 산, 물은 물, 코드는 코드

0개의 댓글