✅ SNS 프로젝트의 프로필페이지에는 이미지를 불러오는 기능이 있다.
그 과정에서 Input에는 우리가 주로 쓰는 Input type=button 이외에도 수 많은 타입이 있다는걸 알게되었다. 그 부분에 대해 공부하고 정리해보려 한다.
HTML input 요소는 웹 기반 양식에서 사용자의 데이터를 받을 수 있는
대화형 컨트롤
을 생성합니다.사용자 에이전트
에 따라서 다양한 종류의입력 데이터 유형
과컨트롤 위젯
이 존재합니다. 입력 유형과 특성의 다양한 조합 가능성으로 인해,input 요소
는HTML
에서 제일강력하고 복잡한 요소
중 하나입니다.
-mozilla-
표로 보는 input의 다양한 "유형" 열어서 확인하기
input 요소
는type
에 따라 완전히 달라진다.input 요소
에 특성을 지정하지 않은 경우기본값은 text
로 설정된다.
유형 | 설명 |
---|---|
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
은 동일한 속성을 가집니다.
그러나 사실 대부분의 속성은일부 유형
에서만 효과를 보입니다. 게다가, 어떤 속성은유형별
로 그 영향이 달라집니다.
특성 | 유형 | 설명 |
---|---|---|
accept | file | 파일을 업로드 컨트롤에서 기대하는 파일 유형을 암시 |
alt | image | 이미지 유형에 대한 대체 속성. accessibiltiy 측면에서 필요. |
autocomplete | all | 양식 자동생성 기능 (form autofill) 암시 |
autofocus | all | 페이지가 로딩될때 양식 제어에 오토포커스 |
capture | file | 파일 업로드 제어에서 input 방식에서 미디어 capture |
checked | radio, checkbox | 커맨드나 컨트롤이 체크 되었는지의 여부 |
dirname | text, search | 양식 전송시 요소의 방향성을 전송할 때 양식 필드의 Name |
disabled | all | 양식 컨트롤이 비활성화되었는지의 여부 |
form | all | 컨트롤을 양식 요소와 연결 |
formaction | image, submit | 양식 전송시 URL 사용하기 |
formenctype | image, submit | 양식의 데이터 인코딩 유형이 양식 전송시 사용될 것 |
formmethod | image, submit | 양식 전송시 HTTP 방식을 사용 |
formnovalidate | image, submit | 양식 전송시 양식 컨트롤 확인을 무시하기 |
formtarget | image, submit | 양식 전송시 브라우징 맥락 |
height | image | 이미지 높이에서 height 속성과 같음 |
list | almost all | datalist 자동입력 옵션의 id 속성값 |
max | numeric types | 최대값 |
maxlength | password, search, tel, text, url | value의 최대 길이 (문자수) |
min | numeric types | 최소값 |
minlength | password, search, tel, text, url | value의 최소 길이 (문자수) |
multiple | email, file | 불리언값. 여러 값을 허용할지의 여부 |
name | all | input 양식 컨트롤의 이름. 이름/값 짝(name/value pair)의 일부로서 양식과 함께 전송된다 |
pattern | password, text, tel | value 가 유효하기 위해 일치해야 하는 패턴 |
placeholder | password, search, tel, text, url | 양식 컨트롤이 비어있는 때 양식 컨트롤에 나타나는 내용 |
readonly (en-US) | almost all | 불리언값. 이 값은 수정이 불가능함 |
required (en-US) | almost all | 불리언값. 양식이 전송되기 위해서 반드시 입력하거나 확인이 필요한 값 |
size | email, password, tel, text | 컨트롤의 크기 |
src | image | 이미지 출처의 주소에서 src 와 같은 속성 |
step | numeric types | 유효한 증분적인 (Incremental)값 |
type | all | input 양식 컨트롤의 유형 |
value | all | 양식 컨트롤의 현재 값. 이름/값 짝(name/value pair)의 일부로서 양식과 함께 전송된다 |
width | image | 이미지의 width 속성과 같다 |
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, 소개부분에 대한 폼은 이어지는 게시글을 참고해주세요)