тип вводу = кнопка показує лише файл


154

Чи існує спосіб, щоб <input type=file />елемент стилю (або сценарію) бачив лише кнопку "Огляд" без текстового поля?

Дякую

Редагувати : Просто для уточнення, чому мені це потрібно. Я використовую код для завантаження кількох файлів з http://www.morningz.com/?p=5, і йому не потрібно текстового поля для введення, оскільки він ніколи не має значення. Сценарій просто додає щойно вибраний файл до колекції на сторінці. Це було б набагато краще без текстового поля, якщо це можливо.

Відповіді:


169
<input type="file" id="selectedFile" style="display: none;" />
<input type="button" value="Browse..." onclick="document.getElementById('selectedFile').click();" />

Це, безумовно, спрацює, я використовував це у своїх проектах. Сподіваюся, це допоможе :)


1
Ця відповідь настільки проста і елегантна і працює для всіх браузерів.
Mike.C.Ford

Це, безумовно, найкраще рішення, яке я знайшов. Це виключає деякі реальні химерні стилі введення файлів у різних мобільних браузерах. Тепер управління моїм вводом файлів не виділяється, як біль у великому пальці з рештою моєї компонування. Велике спасибі, бажаю, щоб я міг проголосувати більше, ніж 1.
Highdown

... і додайте onchange = "this.form.submit ();" до елемента Вхідний файл, щоб розпочати завантаження після вибору файлу. Не забудьте обернути всі елементи тегом Form.
Томаш

1
Це не буде працювати в IE8 і нижче, оскільки при надсиланні форми ви отримаєте помилку з відхиленням доступу (ви не можете запускати файлові введення з js в IE8 і нижче з "міркувань безпеки")
unenthusiasticuser

3
@unenthusiasticuser правильний і не працюватиме в ipad з тієї ж причини безпеки. :)
Махі

80

У мене був чорт часу, намагаючись досягти цього. Я не хотів використовувати рішення Flash, і жодна з бібліотек jQuery, на яку я дивився, не була надійною для всіх браузерів.

Я придумав власне рішення, яке повністю реалізовано в CSS (за винятком зміни стилю onclick, щоб кнопка виглядала "натиснутою").

Можна спробувати робочий приклад тут: http://jsfiddle.net/VQJ9V/307/ (перевірено у FF 7, IE 9, Safari 5, Opera 11 та Chrome 14)

Він працює, створюючи великий вхід файлу (з розміром шрифту: 50 пікселів), потім обертаючи його в div, який має фіксований розмір і переповнення: приховано. Потім вхід буде видно лише через цей "віконний" розділ. Диві можна надати фонове зображення або колір, текст можна додати, а введення можна зробити прозорим, щоб розкрити фон div:

HTML:

<div class="inputWrapper">
    <input class="fileInput" type="file" name="file1"/>
</div>

CSS:

.inputWrapper {
    height: 32px;
    width: 64px;
    overflow: hidden;
    position: relative;
    cursor: pointer;
    /*Using a background color, but you can use a background image to represent a button*/
    background-color: #DDF;
}
.fileInput {
    cursor: pointer;
    height: 100%;
    position:absolute;
    top: 0;
    right: 0;
    z-index: 99;
    /*This makes the button huge. If you want a bigger button, increase the font size*/
    font-size:50px;
    /*Opacity settings for all browsers*/
    opacity: 0;
    -moz-opacity: 0;
    filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0)
}

Повідомте мене, чи є з цим якісь проблеми, і я спробую їх виправити.


4
це було найкращим рішенням, яке я натрапив на роботу з усіма браузерами
Fatal

2
Ти людина. Я боровся з цією проблемою на FF, і ваше рішення єдине, що справді працює, особливо з більшими кнопками, збільшуючи його активну площу за допомогою "розміру шрифту". Дякую! :)
jpincheira

2
Відмінний, без використання будь-якого сценарію
Bujji

1
Twitter це робить, але він був дещо заплутаним у порівнянні з цим. Добре працює для мене!
том 1,

гарне рішення! Лише одне питання: чому б вам не дати .fileInput шириною 100% і встановити .inputWrapper ширину на автоматичну?
луїн

52

Сьогодні я витратив день на роботу. Я не знайшов жодного з рішень, що працювали в кожному з моїх сценаріїв.

Потім я згадав, що побачив приклад завантаження файлу JQuery без текстового поля. Тож, що я зробив, це те, що я взяв їхній приклад і позбавив його відповідної частини.

Це рішення принаймні працює для IE та FF і може бути повністю стильовим. У наведеному нижче прикладі введення файлу приховано під фантазійною кнопкою "Додати файли".

<html>

<head>
    <title>jQuery File Upload Example</title>
    <style type="text/css">
        .myfileupload-buttonbar input
        {
            position: absolute;
            top: 0;
            right: 0;
            margin: 0;
            border: solid transparent;
            border-width: 0 0 100px 200px;
            opacity: 0.0;
            filter: alpha(opacity=0);
            -o-transform: translate(250px, -50px) scale(1);
            -moz-transform: translate(-300px, 0) scale(4);
            direction: ltr;
            cursor: pointer;
        }
        .myui-button
        {
            position: relative;
            cursor: pointer;
            text-align: center;
            overflow: visible;
            background-color: red;
            overflow: hidden;
        }
    </style>
</head>
<body>
    <div id="fileupload" >
        <div class="myfileupload-buttonbar ">
            <label class="myui-button">
                <span >Add Files</span>
                <input id="file" type="file" name="files[]" />
            </label>
        </div>
    </div>
</body>
</html>

4
Важливою частиною є те, що переповнення контейнера встановлено на прихований.
Павлов Максим Вікторович

1
Це абсолютно працювало для мене в IE та Chrome принаймні. Дякую :)
Кевін Темний

1
ширина межі: 0 0 100px 200px; працював і для мене в IE та Chrome. Дякую.
Павло

2
Якби я задав оригінальне запитання, я мав би пристойність позначити це як відповідь. Дякую.
Марк Rendle

Краща відповідь нижче. Скористайтеся міткою, прихойте введення. Чудово працює!
gman

25

Сховати елемент вхідного файлу та створити видиму кнопку, яка спровокує подію натискання цього вхідного файлу.

Спробуйте це:

CSS

#file { width:0; height:0; } 

HTML:

<input type='file' id='file' name='file' />
<button id='btn-upload'>Upload</button>

JAVASCRIPT (jQuery):

$(function(){
    $('#btn-upload').click(function(e){
        e.preventDefault();
        $('#file').click();}
    );
});

Я створив плагін jQuery, який працює для вас: github.com/mbitto/jquery.buttonFile
Мануель Бітто,

У нових версіях IE це не працює. Непряме клацання призводить до того, що IE вискочить і заборонить доступ. Це дратує.
Андрій

20

Сховати тег вхідного файлу за допомогою css, додати мітку та призначити її кнопці введення. мітку можна натискати, і при натисканні вона відкриє діалогове вікно файлу.

<input type="file" name="imageUpload" id="imageUpload" class="hide"/> 
<label for="imageUpload" class="button-style">Select file</label>

Додайте стиль до мітки як кнопку.
Демонстраційна демонстрація


1
Сьогодні працює чудово в Safari 4 лютого 2015 р.
gman

Це може бути найпростіша і найкраща відповідь. Я також додам onchangeобробник до, inputщоб дозволити деякий код JS зібрати інформацію про завантажений файл.
David R Tribble

16

Це буде дуже важко. Проблема типу введення файлу полягає в тому, що він, як правило, складається з двох візуальних елементів, при цьому трактується як єдиний DOM-елемент. Додайте до цього, що кілька браузерів мають свій власний вигляд та вклад у файл, і ви налаштовані на кошмар. Дивіться цю статтю на quirksmode.org про примхи у файлі. Я гарантую вам, що це не зробить вас щасливим (я кажу з досвіду).

[EDIT]

Насправді, я думаю, ви можете уникнути, помістивши свій вклад у елемент контейнера (наприклад, div) та додавши до елемента негативний запас. Ефективно приховує частину текстового поля поза екраном. Іншим варіантом було б використовувати техніку в статті, яку я пов’язував, щоб спробувати її стиль, як кнопку.


4
Ця стаття про quirksmode чудова. Хоча вкладення файлових вводів все ще болить. : P
MitMaro

Я не думаю, що вміщений нетагін-маржа буде добре працювати, коли ви враховуєте різні стилі браузера та мінімальний розмір шрифту, який відрізняється від користувача до користувача.
joebert

1
joebert: Я погоджуюсь, я вважаю, що найкращим варіантом все ж є техніка, що відображається в статті про химерні речі, як болісно рубати ...
Ерік ван Бракель

14

Виправити роботу у всіх переглядачах:

      <input type = "button" value = "Choose image" 
       onclick ="javascript:document.getElementById('imagefile').click();">
      <input id = "imagefile" type="file" style='visibility: hidden;' name="img"/>

Я пройшов тестування на FF, Chrome і IE - добре працював, також застосовував стилі: D


6
Я майже впевнений, що він не працює на цілій кількості браузерів (включаючи FF та IE, коли я востаннє тестував) - єдиним браузером, який я пам’ятаю, він працював, був Chrome.
Герман Шааф

Це працює лише з jQuery, але це не окреме рішення.
Соленоїд

3
Це, здається, працює (воно відкриває меню вибору файлів), але коли форма подається, файл не надсилається в FireFox та IE з міркувань безпеки.
ampersandre

13

Я спробував реалізувати два найкращих рішення, і це виявилося для мене ВЕЛИЧЕЗНОЮ тратою часу. Зрештою, застосування цього .css класу вирішило проблему ...

input[type='file'] {
  color: transparent;
}

Готово! супер чисто і супер просто ...


1
Це чудовий метод!
Гаув

9

Ще один простий спосіб зробити це. Створіть тег "файл типу введення" в html та прихойте його. Потім натисніть кнопку та відформатуйте її відповідно до потреби. Після цього використовуйте javascript / jquery для програмного натискання тегу введення при натисканні кнопки.

HTML: -

<input id="file" type="file" style="display: none;">
<button id="button">Add file</button>

JavaScript: -

document.getElementById('button').addEventListener("click", function() {
    document.getElementById('file').click();
});

jQuery: -

$('#button').click(function(){
    $('#file').click();
});

CSS: -

#button
{
    background-color: blue;
    color: white;
}

Ось робоча загадка JS для того ж: - http://jsfiddle.net/32na3/


2
Це чітке рішення, але я не можу змусити його працювати в Chrome. Мабуть, інші теж не можуть. Opera та Chrome не дозволяють клацнути файл типу вводу з міркувань безпеки. Тут ви можете знайти більше про це , і рішення , яке працює для мене: stackoverflow.com/a/3030174/2650732
wojjas

Ще коли я писав цю відповідь, вона працювала на хромі. Дякуємо за те, що повідомили мене,
оновлю

7

Я використав частину рекомендованого вище коду, і після багатьох годин відмови від свого часу я врешті-решт дійшов до безкоштовного рішення з пакетом css.

Ви можете запустити його тут - http://jsfiddle.net/WqGph/

але тоді знайшлося краще рішення - http://jsfiddle.net/XMMc4/5/

 <input type = "button" value = "Choose image #2" 
   onclick ="javascript:document.getElementById('imagefile').click();">
       <input id = "imagefile" type="file" style='display:none;' name="img" value="none"/>see jsfiddle code for examples<br/>

Проблема полягає в тому, що onchangeподія не спрацьовує для прихованого inputелемента.
David R Tribble

6

Ось мій добрий засіб:

<input type="file" id="myFile" style="display:none;" />
<button type="button" onclick="document.getElementById('myFile').click();">Browse</button>

Принаймні, це працювало в Safari.

Простий і простий.


4

Ви можете позначити зображення так, що при натисканні на нього спрацює подія натискання кнопки. Ви можете просто зробити звичайну кнопку невидимою:

<form>
    <label for="fileButton"><img src="YourSource"></label>    <!--You don't have to put an image here, it can be anything you like-->
    <input type="file" id="fileButton" style="display:none;"/>
</form>

Він працював на мене на всіх браузерах і дуже простий у використанні.


4

Ви можете відправити подію натискання на прихований вхід файлу, як це:

<form action="#type your action here" method="POST" enctype="multipart/form-data">
   		<div id="yourBtn" style="height: 50px; width: 100px;border: 1px dashed #BBB; cursor:pointer;" >Click to upload!</div>
    	<!-- hide input[type=file]!-->
    	<div style='height: 0px;width:0px; overflow:hidden;'><input id="upfile" type="file" value="upload"/></div>
    	<input type="submit" value='submit' >
    </form>

    <script type="text/javascript">
    	var btn = document.getElementById("yourBtn");
    	var upfile = document.getElementById("upfile"); 
    	btn.addEventListener('click',function(){
    		if(document.createEvent){
    			var ev = document.createEvent('MouseEvents');
    			ev.initEvent('click',true,false);
    			upfile.dispatchEvent(ev);
    		}else{
        		upfile.click();
    		}
    	});
    
    </script>


var ev = document.createEvent('HTMLEvents'); змінити HTMLEvents на MouseEventsvar ev = document.createEvent('MouseEvents');
jiang min

Приємно, дякую! Я перетворив вашу публікацію в фрагмент коду, який можна виконати, і змінив HtmlEvents на MouseEvents
Fabian Schmengler,

4

HTML:

<input type="file" name="upload" id="upload" style="display:none"></input>
    <button  id="browse">Upload</button>

ПІДКЛЮЧЕННЯ

 $(document).ready(function(){
        $("#browse").click(function(){
        $("#upload").click();
        });
 });

Сподіваюся, це працює :)


4

Ви можете надати вхідному елементу непрозорість шрифту 0. Це дозволить приховати текстове поле, не приховуючи кнопку "Вибрати файли".

Не потрібен JavaScript, очистіть перехресний браузер аж до IE 9

Наприклад,

input {color: rgba(0, 0, 0, 0);}

3

Ive дійсно hacky рішення з цим ...

<style type="text/css"> 
    input[type="file"]
    { 
        width: 80px;        
    } 
</style>

<input id="File1" type="file" />

Проблема полягає в атрибуті ширини, який приховує текстове поле, різко змінюватиметься між браузерами, змінюватись між темами Windows XP тощо. Можливо, це щось, з чим ви можете працювати? ...


Навіть цей не працює на IE6, браузер не розуміє селектори атрибутів.
Адріан Годонг

3

Я знаю, що це стара публікація, але простий спосіб зникнення тексту - це просто встановити колір тексту відповідно до твого фону.

наприклад, якщо фон для введення тексту білий, то:

input[type="file"]{
color:#fff;
}

Це не вплине на текст вибору файлу, який все ще буде чорним через браузер.


1
У випадку, якщо користувач натисне цю частину, відкриється спливаюче вікно для завантаження.
Praveen


2

моє рішення полягає лише в тому, щоб встановити його в div, як сказав "druveen", проте я оголошу свій стиль кнопки діві (зробіть це схожим на кнопку з: наведення курсора), і я просто встановив стиль "непрозорість: 0;" на вхід. Діє принадність для мене, сподіваюся, що це робить те саме.


2

Я просто стилізував вхідний файл шириною: 85 пікселів, а текстове поле зовсім зникло


Так текстове поле зникло чи ні? "зовсім" мігр передбачає заперечення там, але ваша граматика є хибною (і, таким чином, неоднозначною).
Кірк Волл

2

Цей HTML-код відображається лише кнопкою "Завантажити файл"

<form action="/action_page.php">
    <input type="button" id="id" value="Upload File"  onclick="document.getElementById('file').click();" />
    <input type="file" style="display:none;" id="file" name="file" onchange="this.form.submit()"/>  
</form>

1
Подумайте про те, як додати у відповідь деяку контекстуальну інформацію, яка описує те, що робить фрагмент коду.
Clijsters


1

Для мене найпростіший спосіб - використовувати такий колір шрифту, як колір фону. Простий, не елегантний, але корисний.

<div style="color:#FFFFFF">   <!-- if background page is white, of course -->
<input class="fileInput" type="file" name="file1"/></div>

1

Тож ось найкращий спосіб це зробити для ВСІХ БРОЗЕРІВ:

Забудьте про CSS!

<p>Append Image:</p> 
<input type="button" id="clickImage" value="Add Image" />
<input type="file" name="images[]" id="images" multiple />

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" charset="utf-8"></script>

<script>
$('#images').hide();        
$('#clickImage').click( function() {    
    $('#images').trigger('click');  
});
</script>

ЦЕ НЕ ПРАЦЮЄ В САФАРІ ... оскільки це не дозволить .trigger ("натиснути") з міркувань безпеки:? щоб змусити його працювати в сафарі, динамічно створюйте кнопку файлу та додайте її знову, коли вона знову завантажується
user1965301

1

Усі ці відповіді милі, але CSS не працюватиме, оскільки він не однаковий у всіх браузерах та пристроях, перша відповідь, яку я написав, буде працювати у всьому, крім Safari. Щоб він працював у всіх браузерах весь час, його потрібно створювати динамічно та відтворювати кожен раз, коли потрібно очистити вхідний текст:

    var imageDiv = document.createElement("div");   
    imageDiv.setAttribute("id", "imagediv");
    imageDiv.style.cssText = 'position:relative; vertical-align: bottom;';  
    var imageText = document.createTextNode("Append Image:");
    var newLine = document.createElement("br"); 
    var image = document.createElement("input");    
    image.setAttribute("type", "file");
    image.setAttribute("id", "images");
    image.setAttribute("name", "images[]");     
    image.setAttribute("multiple", "multiple");
    imageDiv.appendChild(imageText); 
    imageDiv.appendChild(newLine); 
    imageDiv.appendChild(image); 
    questionParagraph.appendChild(imageDiv);

1

Відповідь tmanthey досить хороша, за винятком того, що ви не можете грати з шириною кордону у Firefox v20. Якщо ви бачите посилання (демонстраційне, тут не можна реально показувати), вони вирішили проблему, використовуючи шрифт-розмір = 23px, перетворення: перекладіть (-300px, 0px) шкалу (4) для Firefox, щоб збільшити кнопку.

Інші рішення, що використовують .click () для іншого діва, марні, якщо ви хочете зробити це полем для введення drag'n'drop.


1

Тут є кілька дійсних варіантів, але я думав, що я б дав те, що я придумав, намагаючись виправити подібну проблему. http://jsfiddle.net/5RyrG/1/

<span class="btn fileinput-button">
    <span>Import Field(s)</span>
    <input id="fileupload" type="file" name="files[]" onchange="handleFiles(this.files)" multiple>
</span>
<div id="txt"></div>

function handleFiles(files){
    $('#txt').text(files[0].name);  
}

1

Розв’язано із наступним кодом:

<div style="overflow: hidden;width:83px;"> <input style='float:right;' name="userfile" id="userfile" type="file"/> </div>


1

Я написав це:

<form action='' method='POST' name='form-upload-image' id='form-upload-image' enctype='multipart/form-data'>

    <div style="width: 0; height: 0; overflow: hidden;">
        <input type="file" name="input-file" id="input-file" onchange="this.files.length > 0 ? document.getElementById('form-upload-image').submit():null;" />
    </div>
    
</form>

<img src="image.jpg" style="cursor: pointer;" onclick="document.getElementById('input-file').click();" />

Працюйте чудово у всіх браузерах, без jQuery, без CSS.


1

Ось спрощена версія популярного рішення @ ampersandre, яка працює у всіх основних браузерах. Розмітка Asp.NET

<asp:TextBox runat="server" ID="FilePath" CssClass="form-control"
    style="float:left; display:inline; margin-right:5px; width:300px"
    ReadOnly="True" ClientIDMode="Static" />
<div class="inputWrapper">
    <div id="UploadFile" style="height:38px; font-size:16px; 
      text-align:center">Upload File</div>
    <div>
      <input name="FileUpload" id="FileInput" runat="server" 
             type="File" />
    </div>
  </div>
  <asp:Button ID="UploadButton" runat="server" 
    style="display:none" OnClick="UploadButton_Click" />
</div>
<asp:HiddenField ID="hdnFileName" runat="server" ClientIDMode="Static" />

Код JQuery

$(document).ready(function () {

   $('#UploadFile').click(function () {
       alert('UploadFile clicked');
       $('[id$="FileInput"]').trigger('click');
   });

   $('[id$="FileInput"]').change(function (event) {
       var target = event.target;
       var tmpFile = target.files[0].name;
       alert('FileInput changed:' + tmpFile);
       if (tmpFile.length > 0) {
          $('#hdnFileName').val(tmpFile);
       }
       $('[id$="UploadButton"]').trigger('click');
   });
});

код css

.inputWrapper {
height: 38px;
width: 102px;
overflow: hidden;
position: relative;
padding: 6px 6px;
cursor: pointer;
white-space:nowrap;
/*Using a background color, but you can use a background image to represent
 a button*/
background-color: #DEDEDE;
border: 1px solid gray;
border-radius: 4px;
-moz-user-select: none;
-ms-user-select: none;
-webkit-user-select: none;
user-select: none;
}

Використовується прихований тригер клацання "UploadButton" для післягарантійного серверного сервера зі стандартним. Текст "Завантажити файл" витісняє елемент керування введенням із поля перегляду в розділ обгортки, коли він переповнюється, тому немає необхідності застосовувати будь-які стилі для контрольного діва "введення файлу". Селектор $ ([id $ = "FileInput"]) дозволяє розділити ідентифікатори із застосованими стандартними префіксами ASP.NET. Значення текстового поля FilePath, встановлене з коду сервера позаду від hdnFileName.Value після завантаження файлу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.