JavaScript CSS 수정 학습 제5 장"업로드"에 스타일 추가

문 제 는 한 사이트 에서 제 입력 상자 아래 에 있 을 수 있 습 니 다.image 디자이너 는 업로드 부분 에 도 이렇게 해서 select 단 추 를 추가 하고 싶 을 수도 있 습 니 다.하지만 일반적인 입력 상 자 를 업로드 상자 로 바 꾸 려 고 할 때 는 일 을 할 수 없습니다.브 라 우 저 간 에 큰 차이 가 있 습 니 다.기본 단추 에 스타일 을 추가 하 는 것 도 거의 불가능 합 니 다.image
디자인 이 좋 은 업로드 상자 가 되 기 는 어렵 지만 우리 가 가장 많이 할 수 있 는 것 이다.
사 파리 의 디자인 이 좀 다르다 는 것 을 알 아 차 렸 다.Safari 팀 은 수 동 으로 파일 을 입력 하 는 기능 을 닫 으 려 고 하 는데 이렇게 넘 쳐 요. 을 걱정 할 수 있 습 니 다.이러한 디자인 은 사용자 가 파일 을 선택 한 후에 업로드 파일 을 취소 할 수 없다 는 단점 이 있다.
해결 방법
독자 Michael McGrady 은 업로드 버튼 에 스타일 을 추가 하 는 문 제 를 해결 하 는 좋 은 작은 기 교 를 발명 했다.이 페이지 의 모든 해결 방법 은 그 가 발명 한 것 이다.나 는 단지 position:relative,일부 주석 과 테스트 를 추가 한 후에 자바 스 크 립 트 로 바 뀌 었 을 뿐이다.
이 기술 을 사용 하지 않 았 을 때:
사용 한 후에 나 는 이렇게 되 고 싶다.
image
이제 좀 괜찮아 보이 지 않 아 요?
McGrady 의 방법 은 간단 하고 우아 합 니 다.
1.일반적인 <input type="file"> 을 설정 한 다음 에 post:relative 속성 을 포함 하 는 요소 에 배치 합 니 다.
2.부모 요소 에 일반적인과 그림 을 추가 하여 스타일 을 설정 합 니 다.이 일반적인 input type="file">과 겹 칠 수 있 도록 절대 위 치 를 설정 합 니 다.
3.그리고4.마지막 으로이 보이 지 않 습 니 다.아래 의 input/image 가 나타 나 지만"탐색"단 추 를 누 를 수 있 습 니 다.이 버튼 의 위치 가 그림 위 에 있다 면 누 른 것 이 그림 인 것 처럼 보 입 니 다.
visibility:hidden 을 사용 할 수 없습니다.진정한 보이 지 않 는 요 소 는 클릭 할 수 없 기 때문에 클릭 할 수 있 는 보이 지 않 는 요소 가 필요 합 니 다.
이로써 이 효 과 는 순수 CSS 를 통 해 나 타 났 지만 아직 멀 었 다.
5.사용자 가 파일 을 선택 한 후에 보 이 는 가짜 입력 상 자 는 파일 을 선택 하 는 경 로 를 표시 해 야 합 니 다.정상 적 인그래서 이 기술 은 자 바스 크 립 트 가 없 으 면 완전히 실현 되 지 못 할 수도 있 습 니 다.이 따 이 유 를 설명 하 겠 습 니 다.나 는 이 생각 전 체 를 자 바스 크 립 트 라 고 쓰기 로 결정 했다.파일 이름 이 표시 되 지 않 은 업로드 상 자 를 사용 하려 면 순수 CSS 방식 을 사용 하 는 것 도 좋 은 방법 은 아니 지만.
HTML/CSS 구 조 는 아래 의 HTML/CSS 구 조 를 사용 하려 고 합 니 다:
 
div.fileinputs {
    position: relative;
}

div.fakefile {
    position: absolute;
    top: 0px;
    left: 0px;
    z-index: 1;
}

input.file {
    position: relative;
    text-align: right;
    -moz-opacity:0 ;
    filter:alpha(opacity: 0);
    opacity: 0;
    z-index: 2;
}

<div class="fileinputs">
    <input type="file" class="file" />
    <div class="fakefile">
        <input />
        <img src="search.gif" />
    </div>
</div>
의 위 치 는 relative 입 니 다.그러면 우 리 는 안에 절대적 인 위치의 층 을 배치 할 수 있 습 니 다:가짜 입력 상자.
가짜 입력 상자 와 단 추 를 포함 합 니 다.그의 위 치 는 절대적 입 니 다.z-index 값 은 1 입 니 다.그러면 그 는 실제 업로드 상자 아래 에 표시 할 수 있 습 니 다.실제 업로드 상자 에 도 위치 속성 relavtive 가 있 습 니 다.그러면 그의 z-index 값 을 설정 할 수 있 습 니 다.어쨌든 업로드 상자 가 가짜 입력 상자 위 에 표시 되 어야 합 니 다.그런 후에 우 리 는 그의 투명 도 를 0 으로 설정 해서 그 가 보이 지 않도록 했다.text-align:right:Mozilla 는 업로드 상자 의 폭 을 설정 할 수 없 기 때문에 탐색 단 추 는 DIV 의 오른쪽 가장자리 에 있 고 가짜 단추 도 오른쪽 에 있 으 며 진짜 아래 에 있어 야 합 니 다.너비 높이 테 두 리 를 설정 하기 위해 css 코드 가 필요 합 니 다.이 예 에서 저 는 쓰 지 않 았 습 니 다.왜 자 바스 크 립 트 야?자 바스 크 립 트 를 사용 하 는 첫 번 째 이 유 는 파일 경 로 를 가짜 텍스트 상자 에 복사 하 는 것 입 니 다.둘째,자 바스 크 립 트 는 의미 없 는 HTML 코드 를 무시 합 니 다.
코드 를 깨끗하게 유지 합 니 다.마지막 으로 일부 오래된 브 라 우 저 에 대해 서 는 CSS 를 처리 할 수 없고 넷 스 케 이 프 와 IE4 에 파일 입력 을 하면 접근 할 수 없습니다.CSS 가 없 는 브 라 우 저 에 대해 사용 자 는 두 개의 입력 상 자 를 볼 수 있 고 두 번 째 가 무엇 인지 이해 할 수 없다.
질문
넷 스 케 이 프 4 에 서 는 버튼 만 볼 수 있 습 니 다.position:absolute 때 문인 가 봐 요.
image
질문
IE4 에는 이상 한 원래'탐색'버튼 의 그림자 가 있 고 클릭 할 수 없습니다.해결 방법 이 없다
image
질문
CSS 기능 이 없 는 브 라 우 저 에 대해사용 할 수 있 지만 두 입력 상 자 는 사용 자 를 우울 하 게 합 니 다.
image
해결 방법-JavaScript
이 문제 들 의 해결 방법 은 바로 자 바스 크 립 트 입 니 다.자 바스 크 립 트 를 통 해 입력 상자 와 단 추 를 생 성 합 니 다.현재 최 악의 경 우 는 자 바스 크 립 트 가 실행 되 지 않 고,그래도 사용자 가 파일 을 업로드 할 수 있다 는 것 이다.그다지 예 쁘 지 는 않 지만 그래도 일 을 할 수 있다.
그래서 원래 복잡 한 HTML 이:
 
<div class="fileinputs">
    <input type="file" class="file">
</div>
우 리 는 JavaScript 를 통 해 다른 요 소 를 추가 합 니 다.코드
 
var W3CDOM = (document.createElement && document.getElementsByTagName);
function initFileUploads() {
    if (!W3CDOM) return;
    var fakeFileUpload = document.createElement('div');
    fakeFileUpload.className = 'fakefile';
    fakeFileUpload.appendChild(document.createElement('input'));
    var image = document.createElement('img');
    image.src='pix/button_select.gif';
    fakeFileUpload.appendChild(image);
    var x = document.getElementsByTagName('input');
    for (var i=0;i<x.length;i++) {
        if (x[i].type != 'file') continue;
        if (x[i].parentNode.className != 'fileinputs') continue;
        x[i].className = 'file hidden';
        var clone = fakeFileUpload.cloneNode(true);
        x[i].parentNode.appendChild(clone);
        x[i].relatedElement = clone.getElementsByTagName('input')[0];
        x[i].onchange = x[i].onmouseout = function () {
            this.relatedElement.value = this.value;
        }
    }
}
은 브 라 우 저가 W3C DOM 을 지원 하지 않 으 면 아무것도 하지 않 는 다 고 설명 했다.
 
var W3CDOM = (document.createElement && document.getElementsByTagName);
function initFileUploads() {
    if (!W3CDOM) return;

var fakeFileUpload = document.createElement('div');
fakeFileUpload.className = 'fakefile';
fakeFileUpload.appendChild(document.createElement('input'));
var image = document.createElement('img');
image.src='pix/button_select.gif';
fakeFileUpload.appendChild(image);
그리고 페이지 의 모든 input 을 옮 겨 다 니 며
var x = document.getElementsByTagName('input');
for (var i=0;i<x.length;i++) {
    if (x[i].type != 'file') continue;
재 검 측: if (x[i].parentNode.className != 'fileinputs') continue; 에서 스타일 을 추가 해 야 할 업로드 상 자 를 찾 았 습 니 다.우선 hidden 의 클래스 이름 을 추가 합 니 다.
 x[i].className = 'file hidden'; 
가짜 입력 상 자 를 복사 한 다음 var clone = fakeFileUpload.cloneNode(true);
x[i].parentNode.appendChild(clone);
지금 우 리 는 스타일 을 성공 적 으로 추가 했다.그러나 아직 끝나 지 않 았 습 니 다.입력 상자 에서 파일 경 로 를 보 기 를 바 랍 니 다.우선에 속성 을 만 듭 니 다.가짜 입력 상 자 를 가리 키 는 것 입 니 다.
 x[i].relatedElement = clone.getElementsByTagName('input')[0]; 
이렇게 하면 사용자 가 파일 을 업로드 할 때 우 리 는 가짜 입력 상자 에 쉽게 접근 한 다음 경 로 를 복사 할 수 있 습 니 다.여기 서 문제 가 있 습 니 다.우 리 는 어떤 이 벤트 를 사용 합 니까?보통 change 이 벤트 를 사용 합 니 다.파일 을 업로드 할 때 가짜 입력 상자 의 값 도 변 합 니 다.하지만 Mozilla 1.6 은 업로드 상자 에서 이 이벤트(Firefox 지원)를 지원 하지 않 습 니 다.그래서 나 는 여기에 onmouseout 의 사건 을 추가 했다.IE 에서 도 실행 할 수 있 습 니 다.Safari 는 안 됩 니 다.
 x[i].onchange = x[i].onmouseout = function () { 
this.relatedElement.value = this.value; 3 }
문제 와 확장 에 또 하나의 문제 가 있 습 니 다.사용 자 는 파일 을 선택 한 후에 취소 할 수 없습니다.사용자 가 파일 을 선택 했다 고 가정 한 후에 갑자기 업로드 하고 싶 지 않 았 다.보통 파일 경로 만 삭제 하면 됩 니 다.하지만 우리 의 예 에 서 는 어렵 습 니 다.한번 해 보 세 요.지 울 수 있 지만 느낌 과 는 반대 입 니 다.그래서 저 희 는 사용자 가 가짜 입력 상 자 를 수정 함으로써 진정한 업로드 경 로 를 수정 할 수 있 기 를 바 랍 니 다.선택 을 허용 하 는 것 은 가능 하 다.사용자 가 파일 을 올 리 는 모든 부분 을 선택 하면 전체 가짜 입력 상자 의 모든 내용 을 선택 합 니 다.[code] x[i].onselect = function () { 2 this.relatedElement.select(); 3}그러나 자 바스 크 립 트 의 안전성 은 프로그램 이 업로드 경 로 를 수정 하 는 것 을 허용 하지 않 기 때문에 입력 상자 의 내용 을 수정 하여 실제 업로드 경 로 를 수정 할 수 없습니다.그래서 저 는 onselect 사건 을 포기 하기 로 했 습 니 다.가짜 입력 상자 에 명확 한 단 추 를 추가 하고 사용자 가 클릭 하면 원래 업로드 상 자 를 삭제 하고 다시 만 드 는 것 이 가능 한 방법 입 니 다.이것 은 비록 무 겁 지만 사용자 가 업로드 하고 싶 지 않 은 파일 경 로 를 확실히 삭제 할 수 있다.나 는 이것 이 반드시 일 을 할 수 있다 고 생각 하지 않 는 다.나 도 이 부분의 코드 를 쓰 지 않 았 다.이벤트 경 로 를 클릭 하면 복잡 한 CSS 를 제거 하고 업로드 상 자 를 철저히 숨 긴 다음 가짜 입력 상자 의 click 이 벤트 를 실제 업로드 상자 에 연결 하 는 것 이 좋 습 니 다.아주 좋 은 생각 입 니 다.그리고 위의 것 보다 훨씬 간단 합 니 다.code]fakeField.onclick=function(){2 realField.click()3}이 click()방법 은 폼 항목 을 모방 할 수 있 습 니 다.체크 상자 의 클릭,체크 상자 가 선택 되 었 습 니 다.하지만 모 질 라 와 오페라 는 지원 하지 않 는 다.이 방법 을 추가 하 는 가장 큰 안전성 은 파일 을 선택 하 는 대화 상 자 를 팝 업 하 는 데 있 기 때 문 입 니 다.그 러 니까 우리 도 이 간단 한 방법 으로번역 주소:http://www.quirksmode.org/dom/inputfile.html 다음 정 보 를 보관 하 십시오:북 옥(tw:@rehawk)

좋은 웹페이지 즐겨찾기