Изменить текст по умолчанию в input type= "file"?

Я хочу изменить текст по умолчанию на кнопку "Choose File" когда мы используем input="file".

enter image description here

Как я могу это сделать? Также, как вы можете видеть в изображении, кнопка находится в левой части текста. Как я могу поместить его на правой стороне текста?

14 ответов


каждый браузер имеет свое собственное представление элемента управления, и поэтому вы не можете изменить ни текст, ни ориентацию элемента управления.

есть некоторые" своего рода " хаки, которые вы можете попробовать, если хотите HTML-код/в CSS решение, а не Флэш или silverlightрешение.

http://www.quirksmode.org/dom/inputfile.html

http://www.shauninman.com/archive/2007/09/10/styling_file_inputs_with_css_and_the_dom

лично, потому что большинство пользователей придерживаются своего браузера по выбору и поэтому, вероятно, привыкли видеть элемент управления в исполнении по умолчанию, они, вероятно, запутаются, если увидят что-то другое (в зависимости от типов пользователей, которые вы дело с).


использовать на label на input.

<div>
  <label for="files" class="btn">Select Image</label>
  <input id="files" style="visibility:hidden;" type="file">
</div>
Ниже приведен код для получения имени загруженного файла

$("#files").change(function() {
  filename = this.files[0].name
  console.log(filename);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
      <label for="files" class="btn">Select Image</label>
      <input id="files" style="visibility:hidden;" type="file">
    </div>

Это может помочь кому-то в будущем, вы можете стиль метки для ввода, как вам нравится, и поместить все, что вы хотите внутри него, и скрыть вход с отображением none.

он отлично работает на cordova с iOS

<link href="https://cdnjs.cloudflare.com/ajax/libs/ratchet/2.0.2/css/ratchet.css" rel="stylesheet"/>
<label for="imageUpload" class="btn btn-primary btn-block btn-outlined">Seleccionar imagenes</label>
<input type="file" id="imageUpload" accept="image/*" style="display: none">

Я думаю, что это то, что вы хотите:

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>

<body>
  <button style="display:block;width:120px; height:30px;" onclick="document.getElementById('getFile').click()">Your text here</button>
  <input type='file' id="getFile" style="display:none">
</body>

</html>

Это невозможно. В противном случае вам может потребоваться использовать Silverlight или Flash upload control.


вот как вы можете это сделать:

jQuery:

$(function() {
  $("#labelfile").click(function() {
    $("#imageupl").trigger('click');
  });
})

в CSS

.file {
  position: absolute;
  clip: rect(0px, 0px, 0px, 0px);
  display: block;
}
.labelfile {
  color: #333;
  background-color: #fff;
  display: inline-block;
  margin-bottom: 0;
  font-weight: 400;
  text-align: center;
  vertical-align: middle;
  cursor: pointer;
  background-image: none;
  white-space: nowrap;
  padding: 6px 8px;
  font-size: 14px;
  line-height: 1.42857143;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}

HTML-код:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div style="margin-top:4px;">
  <input name="imageupl" type="file" id="imageupl" class="file" />
  <label class="labelfile" id="labelfile"><i class="icon-download-alt"></i> Browse File</label>
</div>

используя Bootstrap, вы можете сделать это, как показано ниже кода.

<!DOCTYPE html>
<html lang="en">
<head>
<style>

.btn-file {
  position: relative;
  overflow: hidden;
}
.btn-file input[type=file] {
    position: absolute;
    top: 0;
    right: 0;
    min-width: 100%;
    min-height: 100%;
    font-size: 100px;
    text-align: right;
    filter: alpha(opacity=0);
    opacity: 0;
    outline: none;
    background: white;
    cursor: inherit;
    display: block;
}
</style>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
  <span class="btn btn-file">Upload image from here<input type="file">
</body>
</html>

Я сделал сценарий и опубликовал его на GitHub: get selectFile.js Простота в использовании, не стесняйтесь клонировать.


HTML-код

<input type=file hidden id=choose name=choose>
<input type=button onClick=getFile.simulate() value=getFile>
<label id=selected>Nothing selected</label>


JS

var getFile = new selectFile;
getFile.targets('choose','selected');


демо

jsfiddle.net/Thielicious/4oxmsy49/


обновление 2017:

Я провел исследование о том, как это может быть достигнуто. И лучшее объяснение/учебник здесь: https://tympanus.net/codrops/2015/09/15/styling-customizing-file-inputs-smart-way/

Я напишу здесь резюме на случай, если оно станет недоступным. Поэтому у вас должен быть HTML:

<input type="file" name="file" id="file" class="inputfile" />
<label for="file">Choose a file</label>

затем скрыть ввод с помощью CSS:

.inputfile {
width: 0.1px;
height: 0.1px;
opacity: 0;
overflow: hidden;
position: absolute;
z-index: -1;}

затем надпись:

.inputfile + label {
font-size: 1.25em;
font-weight: 700;
color: white;
background-color: black;
display: inline-block;
}

затем при желании вы можете добавить JS для отображения имени файла:

var inputs = document.querySelectorAll( '.inputfile' );
Array.prototype.forEach.call( inputs, function( input )
{
var label    = input.nextElementSibling,
    labelVal = label.innerHTML;

input.addEventListener( 'change', function( e )
{
    var fileName = '';
    if( this.files && this.files.length > 1 )
        fileName = ( this.getAttribute( 'data-multiple-caption' ) || '' ).replace( '{count}', this.files.length );
    else
        fileName = e.target.value.split( '\' ).pop();

    if( fileName )
        label.querySelector( 'span' ).innerHTML = fileName;
    else
        label.innerHTML = labelVal;
});
});

но на самом деле просто прочитайте учебник и загрузите демо, это действительно хорошо.


Я бы использовать button, чтобы вызвать input:

<button onclick="document.getElementById('fileUpload').click()">Open from File...</button>
<input type="file" id="fileUpload" name="files" style="display:none" />

быстро и чисто.


Это должно работать:

вход.className:: - webkit-файл-загрузить-кнопка { содержание стиль.. }


позвольте мне добавить хак, который я использовал. Я хотел иметь раздел, который позволял бы перетаскивать файлы, и я хотел, чтобы этот раздел перетаскивания был доступен вместе с оригинальной кнопкой загрузки.

вот как это выглядит когда я закончил (минус способность перетаскивания, есть много учебников о том, как это сделать).

и тогда я действительно создал серия сообщений в блоге это в основном о кнопках загрузки файлов.


Ok так очень простой чистый css способ создания пользовательского входного файла.

используйте метки, но, как вы знаете из предыдущих ответов, label не вызывает onclick функция в firefox может быть ошибкой, но не имеет значения со следующим.

<label for="file"  class="custom-file-input"><input type="file"  name="file" class="custom-file-input"></input></label>

то, что вы делаете, это стиль этикетки, чтобы посмотреть, как вы хотите, чтобы

    .custom-file-input {
        color: transparent;/* This is to take away the browser text for file uploading*/
        /* Carry on with the style you want */
        background: url(../img/doc-o.png);
        background-size: 100%;
        position: absolute;
        width: 200px;
        height: 200px;
        cursor: pointer;
        top: 10%;
        right: 15%;
    }

теперь просто скрыть фактическую кнопку ввода, но вы не можете установить его в visability: hidden

так сделать невидимыми, установив opacity: 0;

input.custom-file-input {
    opacity: 0;
    position: absolute;/*set position to be exactly over your input*/
    left: 0;
    top: 0;
}

теперь, как вы могли заметить, у меня есть тот же класс на моей метке, что и мое поле ввода, то есть потому, что я хочу, чтобы оба имели одинаковый стиль, таким образом, где бы вы ни нажимали на метку, вы фактически нажимаете на невидимое поле ввода.


вы можете использовать этот подход, он работает даже если много файлов входов.

const fileBlocks = document.querySelectorAll('.file-block')
const buttons = document.querySelectorAll('.btn-select-file')

;[...buttons].forEach(function (btn) {
  btn.onclick = function () {
    btn.parentElement.querySelector('input[type="file"]').click()
  }
})

;[...fileBlocks].forEach(function (block) {
  block.querySelector('input[type="file"]').onchange = function () {
    const filename = this.files[0].name

    block.querySelector('.btn-select-file').textContent = 'File selected: ' + filename
  }
})
.btn-select-file {
  border-radius: 20px;
}

input[type="file"] {
  display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="file-block">
  <button class="btn-select-file">Select Image 1</button>
  <input type="file">
</div>
<br>
<div class="file-block">
  <button class="btn-select-file">Select Image 2</button>
  <input type="file">
</div>