Как создать "входной файл" с помощью CSS3/Javascript?
Я хотел бы стиль <input type="file" />
с помощью CSS3.
В качестве альтернативы, я хотел бы, чтобы пользователь нажимал на div
(который я буду стилизовать), и это откроет окно "Обзор".
Возможно ли это сделать только с помощью HTML, CSS3 и Javascript/jQuery?
Ответы
Ответ 1
У меня есть такой пример, что вам может понадобиться идея...
HTML
<div id="file">Chose file</div>
<input type="file" name="file" />
CSS
#file {
display:none;
}
JQuery
var wrapper = $('<div/>').css({height:0,width:0,'overflow':'hidden'});
var fileInput = $(':file').wrap(wrapper);
fileInput.change(function(){
$this = $(this);
$('#file').text($this.val());
})
$('#file').click(function(){
fileInput.click();
}).show();
Ответ 2
После проверки идеи Reigels и этот, я написал это простое решение общей проблемы стилизации поля ввода type="file"
(< протестировал его на Firefox, Safari и Chrome).
<div style="position:relative;">
<div id="file" style="position:absolute;">Click here to select a file</div>
<input type="file" name="file" style="opacity:0; z-index:1;" onchange="document.getElementById('file').innerHTML = this.value;">
</div>
Тогда вы можете, конечно, создать "файл" div, как хотите.
И если вы хотите использовать ввод type="text"
вместо div, просто измените innerHTML
на value
:
<div style="position:relative;">
<input type="text" id="file" style="position:absolute;" placeholder="Click here to select a file">
<input type="file" name="file" style="opacity:0; z-index:1;" onchange="document.getElementById('file').value = this.value;">
</div>
Вот мой оригинальный ответ с помощью jQuery:
<div style="position:relative;">
<div id="file" style="position:absolute;">Click here to select a file</div>
<input type="file" name="file" style="opacity:0; z-index:1;" onchange="$('#file').text($(this).val());">
</div>
Ответ 3
Я тоже сделал для этого особый стиль. Проверьте это
JS Fiddle Demo - Пользовательский Input type= "file"
HTML
<input type="file" id="test">
<div class="button-group">
<a href="#" id="browse" class="button primary">Browse</a>
<a href="#" id="save" class="button">Save</a>
<a href="#" id="clear" class="button danger">Clear</a>
</div>
<input type="text" id="testfile"></input>
CSS
body {
padding:100px;
}
input[type="file"] {
position:absolute;
display:none;
}
#testfile {
height: 26px;
text-decoration: none;
background-color: #eee;
border:1px solid #ccc;
border-radius:3px;
float:left;
margin-right:5px;
overflow:hidden;
text-overflow:ellipsis;
color:#aaa;
text-indent:5px;
}
#actionbtnBrowse, #actionbtnSave {
margin:0 !important;
width:60px;
}
JQuery
$("#browse").click(function () {
$("#test").click();
})
$("#save").click(function () {
alert('Run a save function');
})
$("#clear").click(function () {
$('#testfile').val('');
})
$('#test').change(function () {
$('#testfile').val($(this).val());
})
Также добавьте вкладку внешних ресурсов:
https://github.com/necolas/css3-github-buttons/blob/master/gh-buttons.css
Ответ 4
В дополнение к Рейгелю,
здесь более простая реализация. Вы также можете использовать это решение для нескольких полей ввода файлов. Надеюсь, это поможет некоторым людям; -)
HTML (один вход)
<input type="file" name="file" />
HTML (несколько ввода)
<!-- div is important to separate correctly or work with jQuery .closest() -->
<div>
<input type="file" name="file[]" />
</div>
<div>
<input type="file" name="file[]" />
</div>
<div>
<input type="file" name="file[]" />
</div>
JavaScript
// make all input fields with type 'file' invisible
$(':file').css({
'visibility': 'hidden',
'display': 'none'
});
// add a textbox after *each* file input
$(':file').after('<input type="text" readonly="readonly" value="" class="fileChooserText" /> <input type="button" value="Choose file ..." class="fileChooserButton" />');
// add *click* event to *each* pseudo file button
// to link the click to the *closest* original file input
$('.fileChooserButton').click(function() {
$(this).parent().find(':file').click();
}).show();
// add *change* event to *each* file input
// to copy the name of the file in the read-only text input field
$(':file').change(function() {
$(this).parent().find('.fileChooserText').val($(this).val());
});
Ответ 5
Вот как это сделать, используя HTML, CSS и Javascript (без каких-либо фреймворков):
Идея состоит в том, чтобы скрывать кнопку <input type='file'>
и использовать фиктивный <div>
, который вы создаете в качестве кнопки загрузки файла. По щелчку этого <div>
, мы вызываем скрытый <input type='file'>
.
Demo:
// comments inline
document.getElementById("customButton").addEventListener("click", function(){
document.getElementById("fileUpload").click(); // trigger the click of actual file upload button
});
document.getElementById("fileUpload").addEventListener("change", function(){
var fullPath = document.getElementById('fileUpload').value;
var fileName = fullPath.split(/(\\|\/)/g).pop(); // fetch the file name
document.getElementById("fileName").innerHTML = fileName; // display the file name
}, false);
body{
font-family: Arial;
}
#fileUpload{
display: none; /* do not display the actual file upload button */
}
#customButton{ /* style the dummy upload button */
background: yellow;
border: 1px solid red;
border-radius: 5px;
padding: 5px;
display: inline-block;
cursor: pointer;
color: red;
}
<input type="file" id="fileUpload"> <!-- actual file upload button -->
<div id="customButton">Browse</div> <!-- dummy file upload button which can be used for styling ;) -->
<span id="fileName"></span> <!-- the file name of the selected file will be shown here -->
Ответ 6
Поддельный div не нужен! Нет Js no extra html. Использование только css возможно.
Лучший способ - использовать псевдоэлемент: after или: before в качестве элемента, превышающего ввод. Затем создайте псевдоэлемент, как хотите. Я рекомендую вам сделать общий стиль для всех входных файлов следующим образом:
input[type="file"]:before {
content: 'Browse';
background: #FFF;
width: 100%;
height: 35px;
display: block;
text-align: left;
position: relative;
margin: 0;
margin: 0 5px;
left: -6px;
border: 1px solid #E0E0E0;
top: -1px;
line-height: 35px;
color: #B6B6B6;
padding-left: 5px;
display: block;
}
→ DEMO
Ответ 7
Вот пример, который я использую, который использует jQuery, я протестировал против Firefox 11 и Chrome 18, а также IE9. Так что он довольно совместим с браузерами в моей книге, хотя я только работаю с этими тремя.
HTML
Вот базовая "настраиваемая" структура HTML.
<span>
File to Upload<br />
<label class="smallInput" style="float:left;">
<input type="file" name="file" class="smallInput" />
</label>
<input type="button" class="upload" value="Upload" style="float:left;margin-top:6px;margin-left:10px;" />
</span>
CSS
Вот пример моего CSS
label.smallInput {
background:url(images/bg_s_input.gif) no-repeat;
width:168px;
}
JavaScript
Это тяжелый атлет.
/* File upload magic form?? */
$("input.smallInput[type=file]").each(function(i){
var id = "__d_file_upload_"+i;
var d_wrap = $('<div/>').attr('id',id).css({'position':'relative','cursor':'text'});
$(this).wrap(d_wrap).bind('change blur focus keyup click',function(){
$("#"+id+" input[type=text]").val($(this).val());
}).css({'opacity':0,'zIndex':9999,'position':'absolute'}).removeClass('smallInput');
obj = $(this);
$("#"+id).append($("<input/>").addClass('smallInput').attr('type','text').css({'zIndex':9998,'position':'absolute'}).bind('click',function(e){obj.trigger('click');$(this).blur();}));
obj.closest('span').children('input.upload[type=button]').bind('click',function(e){
obj.trigger('click');
$(this).blur();
});
});
/* ************************ */
Описание
HTML довольно прямолинейный, простой элемент, я включаю кнопку, поэтому ее можно назвать независимо от остальных, конечно, это можно было бы включить в JavaScript, но просто поставить, я немного на ленивом боковая сторона. Код ищет все входы с классом smallInput, который имеет тип файла, который позволяет определить стандартную HTML-форму и структуру обратной структуры в когда браузер решает стать болью.
Этот метод использует JavaScript только для обеспечения доставки, он не изменяет поведение браузера в отношении ввода файла.
Вы можете изменить HTML и JavaScript, чтобы сделать его очень надежным, этот код достаточен для моего текущего проекта, поэтому я сомневаюсь, что внеся в него какие-либо изменения.
Предостережения
- Различные браузеры обрабатывают значение ввода файла по-разному, что в хроме приводит к c:\fakeroot\на машинах Windows.
- Использует анонимные функции (из-за отсутствия лучшего слова), что означает, что если у вас слишком много входных файлов, вы можете заставить браузер вести себя медленно при обработке.
Ответ 8
В эту же проблему встает сегодня, но кажется, что есть простой способ иметь свои собственные стили - скрыть ввод и создать соответствующую метку:
<div class="upload">
<label for="my-input"> Upload stuff </label>
<input type="file" id="my-input" name="files[]" />
</div>
CSS
.upload input{
display: none;
}
.upload label{
background: DarkSlateBlue;
color: white;
padding: 5px 10px;
}
Работает в последних версиях Chrome, Firefox и IE 10. Не тестировал других.
Ответ 9
В то время как ответ Рейгеля передает идею, у него на самом деле нет никакого стиля. Недавно я столкнулся с этой проблемой и, несмотря на множество ответов на "Переполнение стека", никто, похоже, не соответствовал законопроекту. В конце концов, я закончил настройку, чтобы иметь простое и элегантное решение.
Я также тестировал это на Firefox, IE (11, 10 и 9), Chrome и Opera, iPad и нескольких устройствах Android.
Здесь ссылка JSFiddle → http://jsfiddle.net/umhva747/
$('input[type=file]').change(function(e) {
$in = $(this);
$in.next().html($in.val());
});
$('.uploadButton').click(function() {
var fileName = $("#fileUpload").val();
if (fileName) {
alert(fileName + " can be uploaded.");
}
else {
alert("Please select a file to upload");
}
});
body {
background-color:Black;
}
div.upload {
background-color:#fff;
border: 1px solid #ddd;
border-radius:5px;
display:inline-block;
height: 30px;
padding:3px 40px 3px 3px;
position:relative;
width: auto;
}
div.upload:hover {
opacity:0.95;
}
div.upload input[type="file"] {
display: input-block;
width: 100%;
height: 30px;
opacity: 0;
cursor:pointer;
position:absolute;
left:0;
}
.uploadButton {
background-color: #425F9C;
border: none;
border-radius: 3px;
color: #FFF;
cursor:pointer;
display: inline-block;
height: 30px;
margin-right:15px;
width: auto;
padding:0 20px;
box-sizing: content-box;
}
.fileName {
font-family: Arial;
font-size:14px;
}
.upload + .uploadButton {
height:38px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<form action="" method="post" enctype="multipart/form-data">
<div class="upload">
<input type="button" class="uploadButton" value="Browse" />
<input type="file" name="upload" accept="image/*" id="fileUpload" />
<span class="fileName">Select file..</span>
</div>
<input type="button" class="uploadButton" value="Upload File" />
</form>
Ответ 10
Вот решение с текстовым полем, в котором пользователь вводит (относительный) путь к копии файла на сервере (если разрешен) и кнопку отправки, чтобы просмотреть локальную систему для файла и отправить форму:
<form enctype="multipart/form-data" action="" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
<p><input type="file" name="upload_file" id="upload_file" size="40"/></p>
<p><input type="text" id="upload_filename" name="upload_filename" size="30" maxlength="100" value="<?php echo htmlspecialchars($filename, ENT_COMPAT, 'UTF-8'); ?>"/>
<input type="submit" class="submit submit_upload" id="upload_upload" name="upload_upload" value="Upload"/></p>
</form>
Сценарий скрывает ввод файла, щелкает его, если пользователь нажимает кнопку отправки, представляет форму, если пользователь взял файл. Если пользователь пытается загрузить файл без ввода имени файла, фокус сначала перемещается в текстовое поле для имени файла.
<script type="text/javascript">
var file=$('#upload_file');
var filename=$('#upload_filename');
var upload=$('#upload_upload');
file.hide().change(function() {if (file.val()) {upload.unbind('click').click();}});
upload.click(function(event) {event.preventDefault();if (!filename.val()) {filename.focus();} else {file.click();}});
</script>
Просто введите кнопку отправки для идеального результата:
.submit {padding:0;margin:0;border:none;vertical-align:middle;text-indent:-1000em;cursor:pointer;}
.submit_upload {width:100px;height:30px;background:transparent url(../images/theme/upload.png) no-repeat;}
Ответ 11
Это мой метод, если я получил вашу точку
HTML
<form action="upload.php">
<input type="file" id="FileInput" style="cursor: pointer; display: none"/>
<input type="submit" id="Up" style="display: none;" />
</form>
JQuery
<script type="text/javascript">
$( "#FileInput" ).change(function() {
$( "#Up" ).click();
});
</script>
Ответ 12
Когда вы возвращаете значение поля ввода, браузер вернет поддельный путь (буквально C:\fakepath [имя файла] в Chrome). Поэтому я бы добавил следующие решения Javascript:
val=$('#file').val(); //File field value
val=val.replace('/','\\'); //Haven't tested it on Unix, but convert / to \ just in case
val=val.substring(val.lastIndexOf('\\')+1);
$('#textbox').val(val);
Ofc, это можно сделать в одной строке.