이전글
2024.06.03 - [FrontEnd&Publisher/javascript & jquery] - input file 버튼 css 커스텀
input file 버튼 css 커스텀
input file은 각 브라우저마다 디자인이 조금씩 다르다.그런 이유로 각 브라우저나 디바이스마다 모양이 틀어지거나 할 수 있는데이를 방지하기 위해 해당 기능들을 직접 만들어 동일한 ui,ux를 제
dreams-whale.tistory.com
이전글에 발행한 css만 커스텀 하는건 기본 input file을 이쁘게는 하나
사실상 편의성을 좀 더 개선하거나 이런 기능은 없다.
좀 더 좋은기능들을 사용하기 위해선 결국 script로 직접 일일히 하나하나 만드는 방법뿐...
그래서 완전히 새로 만들어 보자.
Result
.hidden { display:none; }
label.file-cs {
border:1px solid #72b3ff;
background:#fff;
border-radius:8px;
padding:5px;
display: inline-flex;
}
label.file-cs .name {
padding: 0 10px;
min-width:140px;
background:#eee;
}
label.file-cs span {
border:1px solid #72b3ff;
border-radius:8px;
color:#72b3ff;
background:#fff;
cursor:pointer;
display:inline-block;
padding:2px 5px;
font-size:12px;
}
<label class="file-cs" for="file01">
<input type="file" name="" id="file01" class="hidden" onchange="fileUpt(this)">
<span class="btn">파일선택</span>
<div class="name"></div>
</label>
function fileUpt(el){
const elArr = Array.from(el.parentNode.children);
elArr.forEach(function(e){
if(e.className =="name"){
e.textContent = el.files[0].name;
}
}
)
}
기본틀 잡기
- inpuf file을 만들고 클릭하면 파일 선택 창이 떠야하기에 label 태그로 감싸서 틀부터 잡는다
<label class="file-cs" for="file01">
<input type="file" name="" id="file01">
</label>
- 클릭영역을 정했으면 '파일선택' 텍스트와 선택된 파일명이 나올 영역만들기
<label class="file-cs" for="file01">
<input type="file" name="" id="file01">
<span class="btn">파일선택</span>
<div class="name"></div>
</label>
- 대충 스타일도 이전 글 처럼 잡아줍시다.
label.file-cs {
border:1px solid #72b3ff;
background:#fff;
border-radius:8px;
padding:5px;
display: inline-flex;
}
label.file-cs .name {
padding: 0 10px;
min-width:140px;
background:#eee;
}
label.file-cs span {
border:1px solid #72b3ff;
border-radius:8px;
color:#72b3ff;
background:#fff;
cursor:pointer;
display:inline-block;
padding:2px 5px;
font-size:12px;
}
input file 모양은 이따 확인해야될부분이 있어, 보이게 남겨놨습니다.
기본 모양은 대략 잡았으니 이제 기능을 입혀줍시다.
이벤트 부여
- 파일 선택을 누르고 파일을 선택했을때 텍스가 name 클래스에 들어가게 script를 작성해줍니다
- input에 onchage 이벤트걸기
- input에 파일이 선택되 정보가 나오면 해당 정보값을 name 클래스에 출력해야하니
- input의 파일명 값을 찾아 name 클래스에 뿌려줌
<input type="file" name="" id="file01" class="" onchange="fileUpt(this)">
function fileUpt(el){
const elArr = Array.from(el.parentNode.children); //input file의 형제 요소부터 찾을꺼임
}
다음요소, 이전 요소 안쓰는 이유는 중복 사용과 커스텀 유용하게 할라고
클릭한 객체를 중심으로 해서 name을 찾으면 중복 사용해도 클릭한 부분에 name만 바뀌니까 씁니다
그리고 jquery 안써서 구문이 좀 기네요
여튼..
input의 형제 요소들을 찾기위해 부모로 갖다가 다시 자식으로 와서
배열에 [ input , span.btn , div.name ]을 가져다 넣습니다
여기서 우리는 name을 찾아 텍스트를 변경해줄것이기에
forEach으로 name 클래스를 찾아줍시다.
function fileUpt(el){
const elArr = Array.from(el.parentNode.children); //input file의 형제 요소부터 찾을꺼임
}
function fileUpt(el){
const elArr = Array.from(el.parentNode.children);
elArr.forEach(function(e){
if(e.className =="name"){ // name 클래스 찾음
e.textContent = el.files[0].name; // name 클래스 태그에 input:file이 가지고 있는 텍스트를 뿌림
}
}
)
}
이렇게 하면 기본형 완성!
css로 hidden 클래스 하나 더 만들어주고
input에 클래스 hidden 하나 더 씁시다
'Dev > Javascript & Jquery' 카테고리의 다른 글
input file 버튼 css 커스텀 (0) | 2024.06.03 |
---|---|
cookie 등록,삭제 ( 하루 동안 보이지 않기 / 1주일 동안 보이지 않기 ) (0) | 2024.04.16 |
cookie 등록,삭제( 오늘 하루 동안 보이지 않기) (0) | 2024.04.16 |
cookie 간단 등록,삭제, (0) | 2024.04.15 |