如何使用 CSS3 / Javascript 设置“输入文件”的样式?

IT技术 javascript jquery html css file-io
2021-02-06 19:49:53

我想<input type="file" />使用 CSS3进行样式设置

或者,我希望用户按下一个div(我将设置样式),这将打开浏览窗口。

是否可以仅使用 HTML、CSS3 和 Javascript/jQuery 来做到这一点?

6个回答

我有一个粗略的例子,你可能想了解一下......

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();

演示

​​​​​​​​​​​​​​

@Reigel 你说得对,我以为我很久以前就检查过了……谢谢!
2021-03-16 19:49:53
在 IE 中,当您单击提交时,这将清空所选文件并取消提交(安全功能?),因为用户实际上并没有点击文件输入,有什么办法可以解决这个问题?不过 FF4 工作正常。
2021-03-20 19:49:53
这可能是一个很好的解决方案,但它在 Firefox 中不起作用!fileInput.click();不打开对话框。
2021-03-23 19:49:53
对于多个文件,同样的想法。仅在 ff 上测试。jsfiddle.net/2ezhd
2021-04-04 19:49:53
@Juan“粗略的例子”...
2021-04-10 19:49:53

在检查了 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,只需更改innerHTMLvalue

<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>
将文件选择元素的宽度和高度设置为其父容器区域的 100%,并且无论浏览器如何呈现原生 gui 元素,它的大小都应适当。至少,这在最新的 FF、Chrome、Safari 和 IE9/10 中对我有用。
2021-03-19 19:49:53
这种技术的缺点是文件输入仍然呈现为可点击的目标(您看不到)。如果您将“文件”div 的样式设置为小于隐藏的 <input type='file'>,那么您就会在它或其他表单元素周围留下透明的点击目标。只要您将 div 的样式设置为大于任何浏览器的本机文件元素,它就可以正常工作。
2021-03-26 19:49:53

我也为此做了一个自定义样式。看看这个

JS Fiddle Demo - 自定义输入类型="文件"

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;
}

查询

$("#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

以下是使用 HTML、CSS 和 Javascript(不使用任何框架)的方法:

这个想法是<input type='file'>隐藏按钮并使用<div>您设计为文件上传按钮的虚拟对象单击此按钮后<div>,我们将其称为 hidden <input type='file'>

演示:

// 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 -->

真棒,真棒,真棒,真棒,真棒,真棒,真棒,真棒,真棒,真棒,真棒,真棒,真棒,真棒,真棒,真棒,真棒。
2021-04-03 19:49:53

除了雷格尔,

这是更简单的实现。您也可以在多个文件输入字段上使用此解决方案。希望这可以帮助一些人;-)

HTML(单一输入)

<input type="file" name="file" />

HTML(多输入)

<!-- div is important to separate correctly or work with jQuery's .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());
});