Làm cách nào để tùy chỉnh <kiểu nhập = tập tin trên mạng >>?


164

Có thể thay đổi sự xuất hiện của <input type="file">?


Lý do trường văn bản là vì nó hiển thị cho người dùng đường dẫn tệp sau khi họ duyệt và chọn tệp của họ.
k đến z

Oooppss .. có vẻ như đó là cách Firefox xử lý nó ...
Newbie Coder

Để chúng tôi rõ ràng, ngay cả sau khi họ duyệt tệp, họ vẫn phải gửi biểu mẫu bằng nút gửi biểu mẫu.
k đến z

2
Xin vui lòng xem giải pháp này cho một cách đơn giản hơn nhiều để làm điều đó.
Joeytje50

1
Có một chút kỳ lạ khi đánh dấu một câu hỏi trong tương lai là một bản sao của một câu hỏi cũ. Nó sẽ đặt ưu tiên rằng đặt lại câu hỏi và sau đó đóng những câu hỏi ban đầu có ổn không? Các bản sao đã là một vấn đề lớn ở đây. Tôi thấy giá trị của việc hỏi lại một câu hỏi trong đó các câu trả lời hiện tại đã , nhưng luôn có thể chỉnh sửa câu hỏi và thêm / chỉnh sửa câu trả lời mới.
alex

Câu trả lời:


235

Bạn không thể sửa đổi nhiều về input[type=file]bản thân điều khiển.

Vì việc nhấp vào một labelyếu tố được ghép nối chính xác với đầu vào sẽ kích hoạt / tập trung vào nó, chúng tôi có thể sử dụng mộtlabel để kích hoạt hộp thoại duyệt OS.

Đây là cách bạn có thể làm điều đó…

label {
   cursor: pointer;
   /* Style as you please, it will become the visible UI component. */
}

#upload-photo {
   opacity: 0;
   position: absolute;
   z-index: -1;
}
<label for="upload-photo">Browse...</label>
<input type="file" name="photo" id="upload-photo" />

CSS cho điều khiển biểu mẫu sẽ làm cho nó xuất hiện ở chế độ ẩn và không chiếm dung lượng trong bố cục tài liệu, nhưng vẫn sẽ tồn tại để có thể được kích hoạt thông qua label.

Nếu bạn muốn hiển thị đường dẫn đã chọn của người dùng sau khi chọn, bạn có thể nghe changesự kiện bằng JavaScript và sau đó đọc đường dẫn mà trình duyệt cung cấp cho bạn (vì lý do bảo mật, nó có thể nói dối bạn về đường dẫn chính xác). Một cách để làm cho nó đẹp cho người dùng cuối là chỉ cần sử dụng tên cơ sở của đường dẫn được trả về (để người dùng chỉ cần nhìn thấy tên tệp đã chọn).

Có một hướng dẫn tuyệt vời của Tympanus để tạo kiểu này.


2
Tôi tin rằng, đây là những kiểu tốt hơn, vì chúng tôi nhắm đến việc mở hộp thoại chọn tệp bằng cách nhấp vào bất kỳ vị trí nào trên vùng chứa:#container { position: relative; width: ...px; height: ...px; overflow: hidden; } #input { position: absolute; right: 0; font-size: <many a>px; opacity: 0; margin: 0; padding: 0; border: none; }
x-yuri

1
Sử dụng <label>(như được hiển thị bởi Tympanus) là ngữ nghĩa hơn và ít hack hơn. Ngoài ra, câu hỏi này đã được hỏi lại một vài năm sau đó và có câu trả lời tốt hơn nhiều: kiểu tùy chỉnh trình duyệt chéo cho nút tải lên tệp .
Dan Dascalescu

1
@DanDascalescu Tôi đồng ý, nếu tôi có thể nhớ chính xác (hồi năm 2011) thì nó có vấn đề với IE, có lẽ là 6 hoặc 7. Tôi sẽ chỉnh sửa câu trả lời này để đưa nó vào tương lai ngay bây giờ.
alex

Tại sao nó sẽ tốt hơn để sử dụng nhãn? Bạn không thể gắn nhãn nhãn, ngoài ra, một nút có ý nghĩa với tôi hơn là nhãn để kích hoạt hộp thoại.
Louis-Marie Matthews

1
@alex, Nó không hiển thị tên tệp.
Naren Verma

33

Một cái gì đó như thế có thể?

<form>
  <input id="fileinput" type="file" style="display:none;"/>
</form>
<button id="falseinput">El Cucaratcha, for example</button>
<span id="selected_filename">No file selected</span>

<script>
$(document).ready( function() {
  $('#falseinput').click(function(){
    $("#fileinput").click();
  });
});
$('#fileinput').change(function() {
  $('#selected_filename').text($('#fileinput')[0].files[0].name);
});

</script>

1
Trong trường hợp này, tức là 9 sẽ không cho phép gửi biểu mẫu tới iframe.
x-yuri

@ x-yuri nghĩa là gì?
Micaël Félix

2
Theo như tôi nhớ, tức là 9 (và có thể là những người khác) sẽ không cho phép gửi biểu mẫu tới iframe, vì người dùng không nhấp vào tệp đầu vào.
x-yuri

display: nonesẽ loại bỏ đầu vào từ thứ tự tab, làm cho trang ít truy cập hơn. Sử dụng <label>(như được hiển thị bởi Tympanus) là ngữ nghĩa hơn và ít hack hơn. Ngoài ra, câu hỏi này đã được hỏi lại một vài năm sau đó và có câu trả lời tốt hơn nhiều: kiểu tùy chỉnh trình duyệt chéo cho nút tải lên tệp .
Dan Dascalescu

Đã sửa lỗi chính tả đóng dấu ngoặc vuông trong bộ chọn để làm cho mã thực sự hoạt động
Constantin Groß

23
  <label for="fusk">dsfdsfsd</label>
  <input id="fusk" type="file" name="photo" style="display: none;">

tại sao không? ^ _ ^

Xem ví dụ ở đây


4
@InakiIbarrolaAtxa bạn có thể cung cấp dữ liệu để hỗ trợ việc này không?
Ben Leggiero

1
Không tạo kiểu gì trong Chrome 51. Sử dụng <label>(như được hiển thị bởi Tympanus) là một giải pháp chính xác về mặt ngữ nghĩa. Ngoài ra, câu hỏi này đã được hỏi lại một vài năm sau đó và có câu trả lời tốt hơn nhiều: kiểu tùy chỉnh trình duyệt chéo cho nút tải lên tệp .
Dan Dascalescu

12

Nếu bạn đang sử dụng bootstrap ở đây là một giải pháp tốt hơn:

<label class="btn btn-default btn-file">
    Browse <input type="file" style="display: none;">
</label>

Dành cho IE8 trở xuống http://www.abeautitablesite.net/whipping-file-inputs-into-shape-with-bootstrap-3/

Nguồn: https://stackoverflow.com/a/18164555/625952


Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi. - Từ đánh giá
Tom

Xong, tôi vừa đưa vào một ví dụ
Ouadie

10

Cách dễ nhất ..

<label>
     Upload
    <input type="file" style="visibility: hidden;"/>
</label>

Làm thế nào mà không ai nhận thấy điều này.
rootExplorr

1
Tôi đến trễ trò chơi
caden311

6

Trong webkit, bạn có thể thử điều này ...

input[type="file"]::-webkit-file-upload-button{
   /* style goes here */
}

Bạn có biết bất kỳ giải pháp tương tự cho firefox? Nó tồn tại ? )
Artem Z.

5

trước hết đó là một container:

<div class="upload_file_container">
    Select file!
    <input type="file" name="photo" />
</div>

Thứ hai, đó là một phong cách CSS, nếu bạn muốn thực sự tùy biến nhiều hơn, chỉ cần giữ cho đôi mắt của bạn được mở :)

.upload_file_container{
   width:100px;
   height:40px;
   position:relative;
   background(your img);
}

.upload_file_container input{
   width:100px;
   height:40px;
   position:absolute;
   left:0;
   top:0;
   cursor:pointer;
}

Ví dụ này không có kiểu cho văn bản bên trong nút, nó phụ thuộc vào kích thước phông chữ, chỉ cần sửa các giá trị chiều cao và phần đệm cho vùng chứa


Tôi tự hỏi tại sao bạn không làm nó right: 0, thay vì left: 0? Bằng cách đó, bạn sẽ có hộp văn bản tức là ra khỏi container. Nhấp vào hộp văn bản không mở hộp thoại chọn tệp. Ngoài ra, tôi tin rằng làm cho tập tin đầu vào lớn với font-sizeý tưởng tốt hơn nhiều, sau đó sử dụng widthheight.
x-yuri

5

Thủ thuật là ẩn đầu vào và tùy chỉnh nhãn.

nhập mô tả hình ảnh ở đây

HTML:

<div class="inputfile-box">
  <input type="file" id="file" class="inputfile" onchange='uploadFile(this)'>
  <label for="file">
    <span id="file-name" class="file-box"></span>
    <span class="file-button">
      <i class="fa fa-upload" aria-hidden="true"></i>
      Select File
    </span>
  </label>
</div>

CSS:

.inputfile-box {
  position: relative;
}

.inputfile {
  display: none;
}

.container {
  display: inline-block;
  width: 100%;
}

.file-box {
  display: inline-block;
  width: 100%;
  border: 1px solid;
  padding: 5px 0px 5px 5px;
  box-sizing: border-box;
  height: calc(2rem - 2px);
}

.file-button {
  background: red;
  padding: 5px;
  position: absolute;
  border: 1px solid;
  top: 0px;
  right: 0px;
}

JS:

function uploadFile(target) {
    document.getElementById("file-name").innerHTML = target.files[0].name;
}

Bạn có thể kiểm tra ví dụ này: https://jsfiddle.net/rjurado/hnf0zhy1/4/


Tôi thích cách bạn sử dụng biểu tượng Font Awesome, không giống bất kỳ biểu tượng nào khác.
Max Voisard

4

Sẽ tốt hơn nhiều nếu bạn chỉ sử dụng một <label>, ẩn <input>và tùy chỉnh nhãn.

HTML:

<input type="file" id="input">
<label for="input" id="label">Choose File</label>

CSS:

input#input{
    display: none;
}
label#label{
    /* Customize your label here */
}

display: nonesẽ loại bỏ phần tử khỏi thứ tự tab. Sử dụng <label>(như được hiển thị bởi Tympanus) là cách chính xác về mặt ngữ nghĩa, nhưng cần một số tinh chỉnh. Ngoài ra, câu hỏi này đã được hỏi lại một vài năm sau đó và có câu trả lời tốt hơn nhiều: kiểu tùy chỉnh trình duyệt chéo cho nút tải lên tệp .
Dan Dascalescu

2

để hiển thị đường dẫn của tệp đã chọn, bạn có thể thử điều này trên html:

<div class="fileinputs">
    <input type="file" class="file">
</div>

và trong javascript:

        var fakeFileUpload = document.createElement('div');
        fakeFileUpload.className = 'fakefile';
        var image = document.createElement('div');
        image.className='fakebtn';
        image.innerHTML = 'browse';
        fakeFileUpload.appendChild(image);
        fakeFileUpload.appendChild(document.createElement('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;
            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;
            }
        }

và phong cách:

div.fileinputs {
    position: relative;
    height: 30px;
    width: 370px;
}
input.file.hidden {
    position: relative;
    text-align: right;
    -moz-opacity: 0;
    filter: alpha(opacity: 0);
    opacity: 0;
    z-index: 2;
}
div.fakefile {
    position: absolute;
    top: 0px;
    left: 0px;
    right: 0;
    width: 370px;
    padding: 0;
    margin: 0;
    z-index: 1;
    line-height: 90%;
}
div.fakefile input {
    margin-bottom: 5px;
    margin-left: 0;
    border: none;
    box-shadow: 0px 0px 2px 1px #ccc;
    padding: 4px;
    width: 241px;
    height: 20px;
}
div.fakefile .fakebtn{
    width: 150px;
    background: #eb5a41;
    z-index: 10;
    font-family: roya-bold;
    border: none;
    padding: 5px 15px;
    font-size: 18px;
    text-align: center;
    cursor: pointer;
    -webkit-transition: all 0.4s ease;
    -moz-transition: all 0.4s ease;
    -o-transition: all 0.4s ease;
    -ms-transition: all 0.4s ease;
    transition: all 0.4s ease;
    display: inline;
    margin-left: 3px;
}
div.fileinputs input[type="file"]:hover + div .fakebtn{
    background: #DA472E;
}

div.fileinputs input[type="file"] {
    opacity: 0;
    position: absolute;
    top: -6px;
    right: 0px;
    z-index: 20;
    width: 102px;
    height: 40px;
    cursor: pointer;
}

Salam saghar, Đây là câu trả lời tốt nhất cho tôi, cảm ơn
ucMedia

2

Ví dụ về Bootstrap

<label className="btn btn-info btn-lg">
  Upload
  <input type="file" style="display: none" />
</label>

1

Tôi đã chọn tùy chọn này để làm rõ cách tùy chỉnh hoàn toàn nút duyệt bằng cách bao gồm một trình xử lý tên tệp đã tải lên, cũng được tùy chỉnh. Nó thêm các trường bổ sung và các điều khiển phía máy khách vào chúng chỉ để hiển thị cách bao gồm trình duyệt ở dạng "thực", không chỉ độc lập.

Đây là codepen: http://codepen.io/emiemi/pen/zxNXWR

JS:

//click on our custom btn triggers a click on the hidden actual file input 
$("#btnup").click(function(){
   $("#fileup").click();    
});


//changes on the three fields (input, tit,and name) trigger a control which checks if the 3 fields are all filled and if file field is valid (an image is uploaded)
$('#fileup').change(function(){
    var formDOMObj = document.upload;
//here we assign tu our text field #fileup the name of the selected file  
    var res=$('#fileup').val();
    var arr = res.split("\\");
//if file is not valid we show the error icon and the red alert
    if (formDOMObj.fileup.value.indexOf(".jpg") == -1 && formDOMObj.fileup.value.indexOf(".png") == -1 &&  formDOMObj.fileup.value.indexOf(".jpeg") == -1 && formDOMObj.fileup.value.indexOf(".bmp") == -1 && formDOMObj.fileup.value.indexOf(".JPG") == -1 && formDOMObj.fileup.value.indexOf(".PNG") == -1 &&  formDOMObj.fileup.value.indexOf(".JPEG") == -1 && formDOMObj.fileup.value.indexOf(".BMP") == -1){
        $( ".imgupload" ).hide("slow"); 
        $( ".imguploadok" ).hide("slow");   
        $( ".imguploadstop" ).show("slow");
        $('#nomefile').css({"color":"red","font-weight":700});
        $('#nomefile').html("The file "+arr.slice(-1)[0]+" is not an image!");
        $( "#bottone" ).hide();
        $( "#fakebtn" ).show();
    }else{
 //if file is valid we show the green alert
    $( ".imgupload" ).hide("slow");
    $( ".imguploadstop" ).hide("slow");
    $( ".imguploadok" ).show("slow");
    $('#nomefile').html(arr.slice(-1)[0]);
    $('#nomefile').css({"color":"green","font-weight":700});
    if (formDOMObj.nome.value!=""&&formDOMObj.tit.value!=""&&formDOMObj.fileup.value!=""){
  //if all three fields are valid the fake input btn is hidden and the actual one i s finally hown
        $( "#fakebtn" ).hide();
        $( "#bottone" ).show();
    }
    }
});


$('#nome').change(function(){
//same as file change but on name field
    var formDOMObj = document.upload;
    if (formDOMObj.nome.value!=""&&formDOMObj.tit.value!=""&&formDOMObj.fileup.value!=""){
        $( "#fakebtn" ).hide();
        $( "#bottone" ).show();
    }else{
        $( "#bottone" ).hide();
        $( "#fakebtn" ).show();
    }
});
$('#tit').change(function(){
 //same as file change but on tit field
    var formDOMObj = document.upload;
    if (formDOMObj.nome.value!=""&&formDOMObj.tit.value!=""&&formDOMObj.fileup.value!=""){
        $( "#fakebtn" ).hide();
        $( "#bottone" ).show();
    }else{
        $( "#bottone" ).hide();
        $( "#fakebtn" ).show();
    }
});

HTML:

<form name="upload" method="post" action="/" enctype="multipart/form-data" accept-charset="utf-8">
<div class="row">
  <div class="col-md-6 center">
<!--this is the actual file input, s hidden beacause we wanna use our custom one-->
    <input type="file" value="" class="hidden" name="fileup" id="fileup">
    <div class="btn-container">
<!--the three icons: default, ok file (img), error file (not an img)-->
      <h1 class="imgupload"><i class="fa fa-file-image-o"></i></h1>
      <h1 class="imguploadok"><i class="fa fa-check"></i></h1>
      <h1 class="imguploadstop"><i class="fa fa-times"></i></h1>
<!--this field changes dinamically displaying the filename we are trying to upload-->
      <p id="nomefile">Only pics allowed! (jpg,jpeg,bmp,png)</p>
<!--our custom btn which triggers the actual hidden one-->
      <button type="button" id="btnup" class="btn btn-primary btn-lg">Browse for your pic!</button>
    </div>
  </div>
<!--additional fields-->
  <div class="col-md-6">
    <div class="row">
      <div class="form-group" id="top">
        <div class="col-md-12">
          <input type="text" maxlength="100" class="form-control" name="nome" id="nome" placeholder="Your Name">
        </div>
      </div>
    </div>
    <div class="row">
      <div class="form-group">
        <div class="col-md-12">
          <input type="text" maxlength="50" class="form-control" name="tit" id="tit" placeholder="I am rubber, you are glue">
        </div>
      </div>
    </div>

    <div class="row">
      <div class="col-md-8">
        <p class="white">All fields are mandatory</p>
      </div>
      <div class="col-md-4">
<!--the defauld disabled btn and the actual one shown only if the three fields are valid-->
        <input type="submit" value="Submit!" class="btn btn-primary" id="bottone" style="padding-left:50px; padding-right:50px; display:none;">
        <button type="button" class="btn btn-default" disabled="disabled" id="fakebtn"  style="padding-left:40px; padding-right:40px;">Submit! <i class="fa fa-minus-circle"></i></button>
      </div>
    </div>
  </div>
</div>


0

Đây là một cách mà tôi thích bởi vì nó làm cho đầu vào điền vào toàn bộ container. Thủ thuật là "cỡ chữ: 100px" và nó cần phải đi với "tràn: ẩn" và vị trí tương đối.

<div id="upload-file-container" >
   <input type="file" />
</div>

#upload-file-container {
   width: 200px;
   height: 50px;
   position: relative;
   border: dashed 1px black;
   overflow: hidden;
}

#upload-file-container input[type="file"]
{
   margin: 0;
   opacity: 0;   
   font-size: 100px;
}

Thật ý nghĩa khi làm điều đóposition: absolute; right: 0; font-size: <many>px;
x-yuri

0

Bạn có thể tạo kiểu cho chúng, nhưng bạn không thể loại bỏ các yếu tố đã có. Nếu bạn sáng tạo, bạn có thể làm việc với điều đó và làm một cái gì đó như thế này:

input[type=file] {
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    background: #EEE;
    background: linear-gradient(to top, #FFF, #DDD);
    border: thin solid rgba(0,0,0, .5);
    border-radius: .25em;
    box-shadow: inset .25em .25em .25em rgba(255,255,255, .5), inset -.1em -.1em .1em rgba(0,0,0, 0.1);
    cursor: text;
    padding: .25em;
}

http://jsfiddle.net/zr1x1m2b/1/

Tôi đề nghị bạn chơi xung quanh với mã này, xóa các dòng, thêm dòng của riêng bạn, làm bất cứ điều gì cho đến khi bạn nhận được một cái gì đó trông như bạn muốn!


1
Không tạo kiểu cho các từ "Chọn tệp". Sử dụng <label>(như được hiển thị bởi Tympanus) là ngữ nghĩa và cung cấp khả năng tùy chỉnh hoàn toàn. Ngoài ra, câu hỏi này đã được hỏi lại một vài năm sau đó và có câu trả lời tốt hơn nhiều: kiểu tùy chỉnh trình duyệt chéo cho nút tải lên tệp .
Dan Dascalescu

1
@DanDascalescu Bạn nói đúng! Tôi chỉ cung cấp một giải pháp CSS thuần túy, trong trường hợp bạn không thể thay đổi HTML bằng thiết lập của mình.
Ben Leggiero

0

Chỉ cần tạo kiểu cho một nút bình thường theo cách bạn muốn, sử dụng CSS yêu thích của bạn.

Sau đó gọi một hàm JS đơn giản để tạo và liên kết một phần tử đầu vào ẩn với nút được tạo kiểu của bạn. Đừng thêm CSS dành riêng cho trình duyệt để thực hiện phần ẩn.

<!DOCTYPE html>
<meta charset="utf-8">

<style>
    button {
        width            : 160px;
        height           : 30px;
        font-size        : 13px;
        border           : none;
        text-align       : center;
        background-color : #444;
        color            : #6f0;
    }
    button:active {
        background-color : #779;
    }
</style>

<button id="upload">Styled upload button!</button>

<script>

function Upload_On_Click(id, handler) {
    var hidden_input = null;
    document.getElementById(id).onclick = function() {hidden_input.click();}
    function setup_hidden_input() {
        hidden_input && hidden_input.parentNode.removeChild(hidden_input);
        hidden_input = document.createElement("input");
        hidden_input.setAttribute("type", "file");
        hidden_input.style.visibility = "hidden";
        document.querySelector("body").appendChild(hidden_input);
        hidden_input.onchange = function() {
            handler(hidden_input.files[0]);
            setup_hidden_input();
        };
    }
    setup_hidden_input();
}

Upload_On_Click("upload", function(file) {
    console.log("GOT FILE: " + file.name);
});

</script>

Lưu ý cách mã trên liên kết lại nó sau mỗi lần người dùng chọn một tệp. Điều này rất quan trọng vì "onchange" chỉ được gọi nếu người dùng thay đổi tên tệp. Nhưng bạn có thể muốn nhận tệp mỗi khi người dùng cung cấp.

Để biết thêm chi tiết, nghiên cứu DropZone và tải lên gmail.


0

 $(document).ready(function () {
        $(document).mousemove(function () {
        $('#myList').css('display', 'block');
        $("#seebtn").css('display', 'none');
        $("#hidebtn").css('display', 'none');
        $('#displayFileNames').html('');
        $("#myList").html('');
        var fileArray1 = document.getElementsByClassName('file-input');
        for (var i = 0; i < fileArray1.length; i++) {
            var files = fileArray1[i].files;
            for (var j = 0; j < files.length; j++) {
                $("#myList").append("<li style='color:black'>" + files[j].name + "</li>");
            }
        };

        if (($("#myList").html()) != '') {
            $('#unselect').css('display', 'block');
            $('#divforfile').css('color', 'green');
            $('#attach').css('color', 'green');
            $('#displayFileNames').html($("#myList").children().length + ' ' + 'files selezionato');

        };

        if (($("#myList").html()) == '') {
            $('#divforfile').css('color', 'black');
            $('#attach').css('color', 'black');
            $('#displayFileNames').append('Nessun File Selezionato');
        };
    });

  });

  function choosefiles(obj) {
        $(obj).hide();
        $('#myList').css('display', 'none');
        $('#hidebtn').css('display', 'none');
        $("#seebtn").css('display', 'none');
        $('#unselect').css('display', 'none');
        $("#upload-form").append("<input class='file-input inputs' type='file' onclick='choosefiles(this)' name='file[]' multiple='multiple' />");
        $('#displayFileNames').html('');
    }

  $(document).ready(function () {
        $('#unselect').click(function () {
            $('#hidebtn').css('display', 'none');
            $("#seebtn").css('display', 'none');
            $('#displayFileNames').html('');
            $("#myList").html('');
            $('#myFileInput').val('');
            document.getElementById('upload-form').reset();         
            $('#unselect').css('display', 'none');
            $('#divforfile').css('color', 'black');
            $('#attach').css('color', 'black');

        });
    });
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<style>
  .divs {
        position: absolute;
        display: inline-block;
        background-color: #fff;
    }

    .inputs {
        position: absolute;
        left: 0px;
        height: 2%;
        width: 15%;
        opacity: 0;
        background: #00f;
        z-index: 100;
    }

    .icons {
        position: absolute;
    }

 </style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
            <div>
                <form id='upload-form' action='' method='post' enctype='multipart/form-data'>
                   
                    <div class="divs" id="divforfile" style="color:black">
                        <input id='myFileInput' class='file-input inputs' type='file' name='file[]' onclick="choosefiles(this)" multiple='multiple' />
                        <i class="material-icons" id="attach" style="font-size:21px;color:black">attach_file</i><label>Allegati</label>
                    </div>
                </form>
                <br />
            </div>
            <br />  
            <div>
                <button style="border:none; background-color:white; color:black; display:none" id="seebtn"><p>Files &#9660;</p></button>
                <button style="border:none; background-color:white; color:black; display:none" id="hidebtn"><p>Files &#9650;</p></button>
                <button type="button" class="close" aria-label="Close" id="unselect" style="display:none;float:left">
                    <span style="color:red">&times;</span>
                </button>
                <div id="displayFileNames">
                </div>
                <ul id="myList"></ul>
            </div>

Đây là tệp / tệp đính kèm được khách hàng hóa đầy đủ chức năng của tôi bằng cách sử dụng jquery & javascript (Visual studio). Điều này sẽ hữu ích!

Mã sẽ có sẵn ở phần bình luận!

Liên kết: https://youtu.be/It38OzMAeig

Thưởng thức :)

 $(document).ready(function () {
        $(document).mousemove(function () {
        $('#myList').css('display', 'block');
        $("#seebtn").css('display', 'none');
        $("#hidebtn").css('display', 'none');
        $('#displayFileNames').html('');
        $("#myList").html('');
        var fileArray1 = document.getElementsByClassName('file-input');
        for (var i = 0; i < fileArray1.length; i++) {
            var files = fileArray1[i].files;
            for (var j = 0; j < files.length; j++) {
                $("#myList").append("<li style='color:black'>" + files[j].name + "</li>");
            }
        };

        if (($("#myList").html()) != '') {
            $('#unselect').css('display', 'block');
            $('#divforfile').css('color', 'green');
            $('#attach').css('color', 'green');
            $('#displayFileNames').html($("#myList").children().length + ' ' + 'files selezionato');

        };

        if (($("#myList").html()) == '') {
            $('#divforfile').css('color', 'black');
            $('#attach').css('color', 'black');
            $('#displayFileNames').append('Nessun File Selezionato');
        };
    });

  });

  function choosefiles(obj) {
        $(obj).hide();
        $('#myList').css('display', 'none');
        $('#hidebtn').css('display', 'none');
        $("#seebtn").css('display', 'none');
        $('#unselect').css('display', 'none');
        $("#upload-form").append("<input class='file-input inputs' type='file' onclick='choosefiles(this)' name='file[]' multiple='multiple' />");
        $('#displayFileNames').html('');
    }

  $(document).ready(function () {
        $('#unselect').click(function () {
            $('#hidebtn').css('display', 'none');
            $("#seebtn").css('display', 'none');
            $('#displayFileNames').html('');
            $("#myList").html('');
            $('#myFileInput').val('');
            document.getElementById('upload-form').reset();         
            $('#unselect').css('display', 'none');
            $('#divforfile').css('color', 'black');
            $('#attach').css('color', 'black');

        });
    });
<style>
  .divs {
        position: absolute;
        display: inline-block;
        background-color: #fff;
    }

    .inputs {
        position: absolute;
        left: 0px;
        height: 2%;
        width: 15%;
        opacity: 0;
        background: #00f;
        z-index: 100;
    }

    .icons {
        position: absolute;
    }

 </style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
   <div>
                <form id='upload-form' action='' method='post' enctype='multipart/form-data'>
                   
                    <div class="divs" id="divforfile" style="color:black">
                        <input id='myFileInput' class='file-input inputs' type='file' name='file[]' onclick="choosefiles(this)" multiple='multiple' />
                        <i class="material-icons" id="attach" style="font-size:21px;color:black">attach_file</i><label>Allegati</label>
                    </div>
                </form>
                <br />
            </div>
            <br />  
            <div>
                <button style="border:none; background-color:white; color:black; display:none" id="seebtn"><p>Files &#9660;</p></button>
                <button style="border:none; background-color:white; color:black; display:none" id="hidebtn"><p>Files &#9650;</p></button>
                <button type="button" class="close" aria-label="Close" id="unselect" style="display:none;float:left">
                    <span style="color:red">&times;</span>
                </button>
                <div id="displayFileNames">
                </div>
                <ul id="myList"></ul>
            </div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
 $(document).ready(function () {
        $(document).mousemove(function () {
        $('#myList').css('display', 'block');
        $("#seebtn").css('display', 'none');
        $("#hidebtn").css('display', 'none');
        $('#displayFileNames').html('');
        $("#myList").html('');
        var fileArray1 = document.getElementsByClassName('file-input');
        for (var i = 0; i < fileArray1.length; i++) {
            var files = fileArray1[i].files;
            for (var j = 0; j < files.length; j++) {
                $("#myList").append("<li style='color:black'>" + files[j].name + "</li>");
            }
        };

        if (($("#myList").html()) != '') {
            $('#unselect').css('display', 'block');
            $('#divforfile').css('color', 'green');
            $('#attach').css('color', 'green');
            $('#displayFileNames').html($("#myList").children().length + ' ' + 'files selezionato');

        };

        if (($("#myList").html()) == '') {
            $('#divforfile').css('color', 'black');
            $('#attach').css('color', 'black');
            $('#displayFileNames').append('Nessun File Selezionato');
        };
    });

  });

  function choosefiles(obj) {
        $(obj).hide();
        $('#myList').css('display', 'none');
        $('#hidebtn').css('display', 'none');
        $("#seebtn").css('display', 'none');
        $('#unselect').css('display', 'none');
        $("#upload-form").append("<input class='file-input inputs' type='file' onclick='choosefiles(this)' name='file[]' multiple='multiple' />");
        $('#displayFileNames').html('');
    }

  $(document).ready(function () {
        $('#unselect').click(function () {
            $('#hidebtn').css('display', 'none');
            $("#seebtn").css('display', 'none');
            $('#displayFileNames').html('');
            $("#myList").html('');
            $('#myFileInput').val('');
            document.getElementById('upload-form').reset();         
            $('#unselect').css('display', 'none');
            $('#divforfile').css('color', 'black');
            $('#attach').css('color', 'black');

        });
    });
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<style>
  .divs {
        position: absolute;
        display: inline-block;
        background-color: #fff;
    }

    .inputs {
        position: absolute;
        left: 0px;
        height: 2%;
        width: 15%;
        opacity: 0;
        background: #00f;
        z-index: 100;
    }

    .icons {
        position: absolute;
    }

 </style>
 <div>
                <form id='upload-form' action='' method='post' enctype='multipart/form-data'>
                   
                    <div class="divs" id="divforfile" style="color:black">
                        <input id='myFileInput' class='file-input inputs' type='file' name='file[]' onclick="choosefiles(this)" multiple='multiple' />
                        <i class="material-icons" id="attach" style="font-size:21px;color:black">attach_file</i><label>Allegati</label>
                    </div>
                </form>
                <br />
            </div>
            <br />  
            <div>
                <button style="border:none; background-color:white; color:black; display:none" id="seebtn"><p>Files &#9660;</p></button>
                <button style="border:none; background-color:white; color:black; display:none" id="hidebtn"><p>Files &#9650;</p></button>
                <button type="button" class="close" aria-label="Close" id="unselect" style="display:none;float:left">
                    <span style="color:red">&times;</span>
                </button>
                <div id="displayFileNames">
                </div>
                <ul id="myList"></ul>
            </div>


0

Đây là một cách giải quyết CSS thuần túy nhanh chóng (hoạt động trên chrome và có dự phòng FireFox đi kèm), bao gồm tên tệp, nhãn và nút tải lên tùy chỉnh, thực hiện những gì cần - không cần JavaScript! 🎉

Lưu ý: Điều này hoạt động trên Chrome và có dự phòng FireFox - dù sao, tôi sẽ không sử dụng nó trên trang web trong thế giới thực - nếu khả năng tương thích của trình duyệt là một điều với bạn (nó nên như vậy). Vì vậy, nó là loại thử nghiệm nhiều hơn.

.fileUploadInput {
  display: grid;
  grid-gap: 10px;
  position: relative;
  z-index: 1; }
  
  .fileUploadInput label {
    display: flex;
    align-items: center;
    color: setColor(primary, 0.5);
    background: setColor(white);
    transition: .4s ease;
    font-family: arial, sans-serif;
    font-size: .75em;
    font-weight: regular; }
    
  .fileUploadInput input {
    position: relative;
    z-index: 1;
    padding: 0 gap(m);
    width: 100%;
    height: 50px;
    border: 1px solid #323262;
    border-radius: 3px;
    font-family: arial, sans-serif;
    font-size: 1rem;
    font-weight: regular; }
    .fileUploadInput input[type="file"] {
      padding: 0 gap(m); }
      .fileUploadInput input[type="file"]::-webkit-file-upload-button {
        visibility: hidden;
        margin-left: 10px;
        padding: 0;
        height: 50px;
        width: 0; }
        
  .fileUploadInput button {
    position: absolute;
    right: 0;
    bottom: 0;
    width: 50px;
    height: 50px;
    line-height: 0;
    user-select: none;
    color: white;
    background-color: #323262;
    border-radius: 0 3px 3px 0;
    font-family: arial, sans-serif;
    font-size: 1rem;
    font-weight: 800; }
    .fileUploadInput button svg {
      width: auto;
      height: 50%; }

* {
  margin: 0px;
  padding: 0px;
  box-sizing: border-box;
  border: 0px;
  outline: 0;
  background-repeat: no-repeat;
  appearance: none;
  border-radius: 0;
  vertical-align: middle;
  font-weight: inherit;
  font-style: inherit;
  font-family: inherit;
  text-decoration: none;
  list-style: none;
  user-select: text;
  line-height: 1.333em; }

body {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100vh;
  background: rgba(66, 50, 98, 0.05); }

.container {
  padding: 25px;
  box-shadow: 0 0 20px rgba(66, 50, 98, 0.35);
  border: 1px solid #eaeaea;
  border-radius: 3px;
  background: white; }

@-moz-document url-prefix() {
.fileUploadInput button{
    display: none
}
}
<!-- Author: Ali Soueidan-->
<!-- Author URI: https//: www.alisoueidan.com-->

<div class="container">
    <div class="fileUploadInput">
    <label>✨ Upload File</label>
    <input type="file" />
    <button>+</button></div>
</div>


-2

Đây là một cách tôi mới phát hiện ra, với một chút jQuery

Mã HTML:

<form action="">
    <input type="file" name="file_upload" style="display:none" id="myFile">

    <a onclick="fileUpload()"> Upload a file </a>
</form>

Đối với phần javascript / jQuery:

<script>
function fileUpload() {
    $("#myFile").click();
}
</script>

Trong ví dụ này, tôi đã đặt thẻ "neo" để kích hoạt tải lên tệp. Bạn có thể thay thế bằng bất cứ thứ gì bạn muốn, chỉ cần nhớ đặt thuộc tính "onclick" với chức năng phù hợp.

Hi vọng điêu nay co ich!

PS: Đừng quên bao gồm jQuery từ CDN hoặc bất kỳ nguồn nào khác


display: nonesẽ loại bỏ đầu vào từ thứ tự tab. Sử dụng <label>(như được hiển thị bởi Tympanus) là ngữ nghĩa hơn và ít hack hơn. Ngoài ra, câu hỏi này đã được hỏi lại một vài năm sau đó và có câu trả lời tốt hơn nhiều: kiểu tùy chỉnh trình duyệt chéo cho nút tải lên tệp .
Dan Dascalescu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.