用图像替换输入类型=文件

Posted

技术标签:

【中文标题】用图像替换输入类型=文件【英文标题】:Replace input type=file by an image 【发布时间】:2011-02-20 18:51:52 【问题描述】:

像很多人一样,我想定制丑陋的input type=file,而且我知道如果没有一些技巧和/或javascript,这是无法做到的。但是,在我的情况下,上传文件按钮仅用于上传图片 (jpeg|jpg|png|gif),所以我想知道是否可以使用“clickable”图片这将完全充当输入类型文件(显示对话框,并在提交的页面上显示相同的 $_FILE)。 我也找到了一些解决方法 here 和 this interesting one(但不适用于 Chrome =/)。

当您想为文件按钮添加一些样式时,你们会怎么做?如果您对此有任何看法,请点击回答按钮;)

【问题讨论】:

对于登陆这里的每个人来说,tympanus.net/codrops/2015/09/15/… 可能也值得一看。 (不以任何方式、形式或形式隶属于该网站。) 您可以查看How to make photo to work as input type file? 【参考方案1】:

我会使用SWFUpload 或Uploadify。他们需要 Flash,但可以轻松完成您想做的一切。

出于安全原因,任何基于<input type="file"> 的解决方法如果尝试通过单击实际控件以外的方式触发“打开文件”对话框,则可以随时从浏览器中删除。 (我认为在当前版本的 FF 和 IE 中,不可能再以编程方式触发该事件。)

【讨论】:

谢谢,我也见过他们,但我认为他们都需要一个 Flash 播放器才能工作,我不想为用户添加另一个强制层。另外,您确定他们会发送与输入文件完全相同类型的数据吗?我不想重新测试我在提交页面中完成的所有 php。干杯。 @niko 不,它们的工作方式不同,它们不是表单元素,而是自行将文件发送到接收脚本,因此您可能必须更改脚本的工作流程。如果这不是一个选项,我认为你不能比 Shaun Inman 在链接到的帖子中做得更好...... 恐怕那真是太可惜了。在未来的 CSS 实现中没有任何关于它的内容吗?无论如何感谢您的回复:) @niko 不客气。关于 CSS 的好问题 - 实际上我不知道,但 html 5 很可能会在这里带来新的东西。以appelsiini.net/2009/10/html5-drag-and-drop-multiple-file-upload 为例。 是的,即使演示 appelsiini.net/demo/html5_upload/demo.html 没有与我的 FF 3.6.3 一起显示,但它说我确实需要 FF 3.6.x,这似乎很有希望无论如何,回到我的问题,目前是 HTML/ CSS/Javscript(但没有 Flash)只允许我做什么?一些字体和“颜色”定制?那我说对了吗?干杯。【参考方案2】:

其实可以用纯css来完成,而且很简单...

HTML 代码

<label class="filebutton">
Browse For File!
<span><input type="file" id="myfile" name="myfile"></span>
</label>

CSS 样式

label.filebutton 
    width:120px;
    height:40px;
    overflow:hidden;
    position:relative;
    background-color:#ccc;


label span input 
    z-index: 999;
    line-height: 0;
    font-size: 50px;
    position: absolute;
    top: -2px;
    left: -700px;
    opacity: 0;
    filter: alpha(opacity = 0);
    -ms-filter: "alpha(opacity=0)";
    cursor: pointer;
    _cursor: hand;
    margin: 0;
    padding:0;

我们的想法是将输入绝对定位在标签内。将输入的字体大小设置为较大的值,这将增加“浏览”按钮的大小。然后使用负左/上属性进行一些试验和错误来将输入浏览按钮定位在标签后面。

定位按钮时,将 alpha 设置为 1。完成后将其设置回 0(这样您就可以看到自己在做什么!)

确保跨浏览器进行测试,因为它们都会使输入按钮的大小略有不同。

【讨论】:

谢谢托比,为什么会有'left: -700px;' ?在 Firefox 中,文件输入字段实际上浮动在页面的左侧......它不会粘在标签跨度上......如果我删除 'left: -700px;'它工作正常 +1 谢谢,@Sloin left:-700px 因为他想让浏览按钮位于按钮上方,这样光标将是指针而不是文本光标。【参考方案3】:

输入本身通过 CSS 可见性隐藏:隐藏。

然后你可以拥有任何你想要的元素 - 锚点或图像..,当单击锚点/图像时,触发对隐藏输入字段的单击 - 将出现选择文件的对话框。

编辑:实际上它适用于 Chrome 和 Safari,我只是注意到在 FF4Beta 中不是这样

【讨论】:

【参考方案4】:

这对我来说非常有效:

.image-upload>input 
  display: none;
<div class="image-upload">
  <label for="file-input">
    <img src="https://icons.iconarchive.com/icons/dtafalonso/android-lollipop/128/Downloads-icon.png"/>
  </label>

  <input id="file-input" type="file" />
</div>

基本上标签的for属性使得点击标签与点击指定的输入是一样的

此外,将 display 属性设置为 none 使得文件输入根本不呈现,将其隐藏得很好且干净。

在 Chrome 中测试,但根据网络应该适用于所有主要浏览器。 :)

编辑: 在此处添加 JSFiddle:https://jsfiddle.net/c5s42vdz/

【讨论】:

我不确定人们是否仍然认为它是“主流浏览器”,但这似乎在 IE7 中不起作用 @Chet 它似乎正在使用最新版本的 Safari (7+) 你使用的是哪个版本? @Toto 对我来说它在 IE11 中工作,我添加了一个 JSFiddle,所以你也可以检查它。 @hardsetting 你是对的!抱歉(也许我使用了不同的文档模式,ie8 或更低) 抱歉,但我认为必须使用文件名更新此代码,或者至少使用文件已成功选择的消息进行更新。用户在选择文件后对发生的事情没有视觉输入。请问这样可以吗?选择文件时,可能会更改为不同的图像?【参考方案5】:

你可以放一张图片,像这样:

HTML:

<img src="/images/uploadButton.png" id="upfile1" style="cursor:pointer" />
<input type="file" id="file1"  name="file1" style="display:none" />

JQuery:

$("#upfile1").click(function () 
    $("#file1").trigger('click');
);

警告: 在 IE9 和 IE10 中,如果您通过 javascript 在文件输入中触发 onclick,则表单会被标记为“危险”并且无法使用 javascript 提交,不确定是否可以传统方式提交。

【讨论】:

【参考方案6】:

工作代码:

只需隐藏输入部分并这样做。

<div class="ImageUpload">
   <label for="FileInput">
      <img src="../../img/Upload_Panel.png" style="width: 18px; margin-top: -316px; margin-left: 900px;"/>
   </label>

  <input id="FileInput" type="file" onchange="readURL(this,'Picture')" style="cursor: pointer;  display: none"/>
</div>

【讨论】:

【参考方案7】:

如果我明白你的意思,这是我的方法

HTML

<label for="FileInput">
    <img src="tools/img/upload2.png" style="cursor:pointer" onmouseover="this.src='tools/img/upload.png'" onmouseout="this.src='tools/img/upload2.png'"  style="float:right;margin:7px" />
</label>
<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>

【讨论】:

【参考方案8】:

        form input[type="file"] 
          display: none;
        
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>

<head>
  <title>Simple File Upload</title>
  <meta name="" content="">
</head>

<body>
  <form action="upload.php" method="post" enctype="multipart/form-data">
    Select image to upload:
    <label for="fileToUpload">
      <img src="http://s3.postimg.org/mjzvuzi5b/uploader_image.png" />
    </label>
    <input type="File" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload Image" name="submit">
  </form>
</body>

</html>

运行 SNIPPET 或复制上面的代码并执行。你会得到你想要的。非常简单有效,无需 javascript。享受!!!

【讨论】:

遗憾的是这些方法对我来说在 Safari 中不起作用:(【参考方案9】:

真的很简单,你可以试试这个:

$("#image id").click(function()
    $("#input id").click();
);

【讨论】:

【参考方案10】:

@hardsetting 提供的出色解决方案, 但我做了一些改进,使其与 Windows 中的 Safari(5.1.7) 一起使用

.image-upload > input 
  visibility:hidden;
  width:0;
  height:0
<div class="image-upload">
  <label for="file-input">
    <img src="https://placehold.it/100/000000/ffffff?text=UPLOAD" style="pointer-events: none"/>
  </label>

  <input id="file-input" type="file" />
</div>

我使用visibility: hidden, width:0 而不是display: none 来解决safari 问题,并在img 标记中添加了pointer-events: none 以使其在输入文件类型标记在FORM 标记中时工作。

似乎在所有主流浏览器中都适合我。

希望它可以帮助某人。

【讨论】:

没有必要添加 style="pointer-events: none" 它会创建问题以打开浏览文件。【参考方案11】:

在过去十年中,我遇到了很多隐藏和不可见输入的问题,有时事情比我们想象的要简单得多。

我有点希望 IE 5、6、7、8 和 9 不支持不透明度,因此文件输入会覆盖上传图像,但是下面的 css 代码已经解决了这个问题。

-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
filter: alpha(opacity=0);  

以下截图是在 chrome 上测试的,IE 5,6,7,8,9,10 IE 5 中唯一的问题是它不支持自动边距。

运行 sn -p 只需复制和粘贴 CSS 和 HTML 修改你喜欢的大小。

.file-upload
	height:100px;
	width:100px;
	margin:40px auto;
	border:1px solid #f0c0d0;
	border-radius:100px;
	overflow:hidden;
	position:relative;

.file-upload input
	position:absolute;
	height:400px;
	width:400px;
	left:-200px;
	top:-200px;
	background:transparent;
	opacity:0;
	-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
	filter: alpha(opacity=0);  

.file-upload img
	height:70px;
	width:70px;
	margin:15px;
<div class="file-upload">
<!--place upload image/icon first !-->
<img src="https://i.stack.imgur.com/dy62M.png" />
<!--place input file last !-->
<input type="file" name="somename" />
</div>

【讨论】:

【参考方案12】:

比写 JS 更好的方法是使用原生, 它变得比建议的要轻:

<label>
  <img src="my-image.png">
  <input type="file" name="myfile" style="display:none">
</label>

这样label 会自动连接到隐藏的输入。 点击标签就像点击字段一样。

【讨论】:

【参考方案13】:

您可以用新选择的图像自动替换图像。

<div class="image-upload">
      <label for="file-input">
        <img id="previewImg" src="https://icon-library.net/images/upload-photo-icon/upload-photo-icon-21.jpg" style="width: 100px; height: 100px;" />
      </label>

      <input id="file-input" type="file" onchange="previewFile(this);" style="display: none;" />
    </div>




<script>
        function previewFile(input)
            var file = $("input[type=file]").get(0).files[0];

            if(file)
              var reader = new FileReader();

              reader.onload = function()
                  $("#previewImg").attr("src", reader.result);
              

              reader.readAsDataURL(file);
            
        
    </script>

【讨论】:

可能是最完整的答案。【参考方案14】:
<script type="text/javascript">
function upl() 
    var fileSelector = document.createElement('input');
    fileSelector.setAttribute('type', 'file');
    fileSelector.setAttribute('name', 'uploimg');
    fileSelector.setAttribute('accept', 'image/*');
    fileSelector.click();
    fileSelector.style.display = "none";

    fileSelector.onchange = function() 
        document.getElementById("indicator").innerHTML = "Uploaded";
    ;

    document.getElementById("par_form").appendChild(fileSelector);


</script>

<form id="par_form">
    <img src="image_url" onclick="upl()"><br>
    <span id="indicator"></span><br>
    <input type="submit">
</form>

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于用图像替换输入类型=文件的主要内容,如果未能解决你的问题,请参考以下文章

用图像替换正常的文件上传输入

用不同的通道替换预训练模型的输入层?

文件输入接受所有类型的文件,但不接受视频和图像

如何在reactJS中显示从输入类型=文件中选择的图像

如何将图像从 url 沿侧输入类型文件加载到 html5 画布?

替换文件里的相关单词之文件类型为txt