输入类型=文件只显示按钮

IT技术 javascript html css
2021-01-22 20:42:20

有没有办法设置样式(或脚本)<input type=file />元素,使其仅在没有文本字段的情况下显示“浏览”按钮?

谢谢

编辑:只是为了澄清为什么我需要这个。我正在使用来自http://www.morningz.com/?p=5 的多文件上传代码,它不需要输入文本字段,因为它永远没有value。脚本只是将新选择的文件添加到页面上的集合中。如果可能的话,没有文本字段会更好看。

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

这肯定会起作用,我在我的项目中使用过它。我希望这会有所帮助:)

这是迄今为止我找到的最好的解决方案。它消除了不同移动浏览器的一些真正古怪的文件输入样式行为。现在,我的文件输入控件在布局的其余部分并不像拇指痛一样突出。非常感谢,希望我能投票超过 1。
2021-03-14 20:42:20
这在 IE8 及以下版本中不起作用,因为在提交表单时,您将收到拒绝访问错误(出于“安全原因”,您无法在 IE8 及以下版本中使用 js 触发文件输入)
2021-03-21 20:42:20
...并添加 onchange="this.form.submit();" 到输入文件元素以在文件选择后开始上传。不要忘记用 Form 标签包装所有元素。
2021-04-01 20:42:20
这个答案非常简单和优雅,适用于所有浏览器。
2021-04-06 20:42:20
@unfuelicuser 正确,出于相同的安全原因无法在 ipad 中工作。:)
2021-04-12 20:42:20

我花了很长时间试图完成这个。我不想使用 Flash 解决方案,而且我查看的 jQuery 库中没有一个在所有浏览器中都是可靠的。

我想出了自己的解决方案,该解决方案完全在 CSS 中实现(除了 onclick 样式更改以使按钮显示为“已单击”)。

您可以在这里尝试一个工作示例: http : //jsfiddle.net/VQJ9V/307/(在 FF 7、IE 9、Safari 5、Opera 11 和 Chrome 14 中测试)

它的工作原理是创建一个大文件输入(字体大小:50px),然后将其包装在一个具有固定大小和溢出:隐藏的 div 中。然后输入只能通过这个“窗口”div 可见。可以为 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)
}

如果有任何问题,请告诉我,我会尝试修复它们。

Twitter 做到了,但与这个相比,它有点令人费解。对我来说很好!
2021-03-14 20:42:20
优秀的,不使用任何脚本
2021-03-21 20:42:20
很好的解决方案!只是一个问题:为什么不给 .fileInput 一个 100% 的宽度并将 .inputWrapper 的宽度设置为 auto?
2021-04-04 20:42:20
这是我遇到的适用于所有浏览器的最佳解决方案
2021-04-07 20:42:20
你就是那个人。我一直在 FF 上为这个问题苦苦挣扎,而您的解决方案是唯一真正有效的解决方案,特别是通过使用“字体大小”增加其活动区域来使用更大的按钮。谢谢!:)
2021-04-07 20:42:20

我今天浪费了我的一天来让它工作。我发现这里没有任何解决方案适用于我的每个场景。

然后我记得我看到了一个没有文本框的 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>
更好的答案如下。使用标签,隐藏输入。效果很好!
2021-03-25 20:42:20
这至少在 IE 和 Chrome 中绝对对我有用。谢谢 :)
2021-03-28 20:42:20
如果我问了最初的问题,我会很体面地将其标记为答案。谢谢。
2021-03-28 20:42:20
边框宽度:0 0 100px 200px;在 IE 和 Chrome 中也为我工作。谢谢。
2021-04-02 20:42:20
重要的部分是容器的溢出设置为隐藏。
2021-04-04 20:42:20

添加带有for 属性的 label 标签,将 for 属性值分配给文件输入按钮。
现在,当您单击标签时,浏览器将自动打开文件浏览对话框弹出窗口。
注意:使用 CSS 隐藏文件输入按钮。

检查下面的现场演示。

$('#imageUpload').change(function() {
  readImgUrlAndPreview(this);

  function readImgUrlAndPreview(input) {
    if (input.files && input.files[0]) {
      var reader = new FileReader();
      reader.onload = function(e) {
        $('#imagePreview').removeClass('hide').attr('src', e.target.result);
      }
    };
    reader.readAsDataURL(input.files[0]);
  }
});
.hide {
  display: none;
}

.btn {
  display: inline-block;
  padding: 4px 12px;
  margin-bottom: 0;
  font-size: 14px;
  line-height: 20px;
  color: #333333;
  text-align: center;
  vertical-align: middle;
  cursor: pointer;
  border: 1px solid #ddd;
  box-shadow: 2px 2px 10px #eee;
  border-radius: 4px;
}

.btn-large {
  padding: 11px 19px;
  font-size: 17.5px;
  -webkit-border-radius: 4px;
  -moz-border-radius: 4px;
  border-radius: 4px;
}

#imagePreview {
  margin: 15px 0 0 0;
  border: 2px solid #ddd;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>

<div clas="file_input_wrap">
  <input type="file" name="imageUpload" id="imageUpload" class="hide" />
  <label for="imageUpload" class="btn btn-large">Select file</label>
</div>
<div class="img_preview_wrap">
  <img src="" id="imagePreview" alt="Preview Image" width="200px" class="hide" />
</div>

这可能是最简单和最好的答案。我还将向 中添加一个onchange处理程序,input以允许一些 JS 代码获取上传的文件信息。
2021-03-28 20:42:20
效果很好,在 React 中也是如此。
2021-04-12 20:42:20

隐藏输入文件元素并创建一个可见按钮,该按钮将触发该输入文件的点击事件。

试试这个:

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();}
    );
});
这在较新版本的 IE 中不起作用。间接点击会导致 IE 翻转并拒绝访问。它很烦人。
2021-04-07 20:42:20
我制作了一个 jQuery 插件,可以为您完成所有工作:github.com/mbitto/jquery.buttonFile
2021-04-12 20:42:20