Style input type file? [duplicate] - html
This question already has answers here:
Styling an input type="file" button
(46 answers)
Closed 7 years ago.
Is it possible to style a input element of type file without worrying about browser compatibility? In my case I need to implement a background image and round border(1px), the button should also be customised if possible.
Follow these steps then you can create custom styles for your file upload form:
1.) This is the simple HTML form(please read the HTML comments I have written here bellow)
<form action="#type your action here" method="POST" enctype="multipart/form-data">
<div id="yourBtn" style="height: 50px; width: 100px;border: 1px dashed #BBB; cursor:pointer;" onclick="getFile()">Click to upload!</div>
<!-- this is your file input tag, so i hide it!-->
<div style='height: 0px;width: 0px; overflow:hidden;'><input id="upfile" type="file" value="upload"/></div>
<!-- here you can have file submit button or you can write a simple script to upload the file automatically-->
<input type="submit" value='submit' >
</form>
2.) Then use this simple script to pass the click event to file input tag.
function getFile(){
document.getElementById("upfile").click();
}
Now you can use any type of a styling without worrying how to change default styles.
I know this very well, because I have been trying to change the default styles for month and a half. believe me it's very hard because different browsers have different upload input tag. So use this one to build your custom file upload forms.Here is the full AUTOMATED UPLOAD code.
<html>
<style>
#yourBtn{
position: relative;
top: 150px;
font-family: calibri;
width: 150px;
padding: 10px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border: 1px dashed #BBB;
text-align: center;
background-color: #DDD;
cursor:pointer;
}
</style>
<script type="text/javascript">
function getFile(){
document.getElementById("upfile").click();
}
function sub(obj){
var file = obj.value;
var fileName = file.split("\\");
document.getElementById("yourBtn").innerHTML = fileName[fileName.length-1];
document.myForm.submit();
event.preventDefault();
}
</script>
<body>
<center>
<form action="#type your action here" method="POST" enctype="multipart/form-data" name="myForm">
<div id="yourBtn" onclick="getFile()">click to upload a file</div>
<!-- this is your file input tag, so i hide it!-->
<!-- i used the onchange event to fire the form submission-->
<div style='height: 0px; width: 0px;overflow:hidden;'><input id="upfile" type="file" value="upload" onchange="sub(this)"/></div>
<!-- here you can have file submit button or you can write a simple script to upload the file automatically-->
<!-- <input type="submit" value='submit' > -->
</form>
</center>
</body>
</html>
Same solution via Jquery. Works if you have more than one file input in the page.
$j(".filebutton").click(function() {
var input = $j(this).next().find('input');
input.click();
});
$j(".fileinput").change(function(){
var file = $j(this).val();
var fileName = file.split("\\");
var pai =$j(this).parent().parent().prev();
pai.html(fileName[fileName.length-1]);
event.preventDefault();
});
After looking around on Google for a long time, trying out several solutions, both CSS, JavaScript and JQuery, i found that most of them were using an Image as the button. Some of them were hard to use, but i did manage to piece together something that ended out working out for me.
The important parts for me was:
The Browse button had to be a Button (not an image).
The button had to have a hover effect (to make it look nice).
The Width of both the Text and the button had to be easy to adjust.
The solution had to work in IE8, FF, Chrome and Safari.
This is the solution i came up with. And hope it can be of use to others as well.
Change the width of .file_input_textbox to change the width of the textbox.
Change the width of both .file_input_div, .file_input_button and .file_input_button_hover to change the width of the button. You might need to tweak a bit on the positions also. I never figured out why...
To test this solution, make a new html file and paste the content into it.
<html>
<head>
<style type="text/css">
.file_input_textbox {height:25px;width:200px;float:left; }
.file_input_div {position: relative;width:80px;height:26px;overflow: hidden; }
.file_input_button {width: 80px;position:absolute;top:0px;
border:1px solid #F0F0EE;padding:2px 8px 2px 8px; font-weight:bold; height:25px; margin:0px; margin-right:5px; }
.file_input_button_hover{width:80px;position:absolute;top:0px;
border:1px solid #0A246A; background-color:#B2BBD0;padding:2px 8px 2px 8px; height:25px; margin:0px; font-weight:bold; margin-right:5px; }
.file_input_hidden {font-size:45px;position:absolute;right:0px;top:0px;cursor:pointer;
opacity:0;filter:alpha(opacity=0);-ms-filter:"alpha(opacity=0)";-khtml-opacity:0;-moz-opacity:0; }
</style>
</head>
<body>
<input type="text" id="fileName" class="file_input_textbox" readonly="readonly">
<div class="file_input_div">
<input id="fileInputButton" type="button" value="Browse" class="file_input_button" />
<input type="file" class="file_input_hidden"
onchange="javascript: document.getElementById('fileName').value = this.value"
onmouseover="document.getElementById('fileInputButton').className='file_input_button_hover';"
onmouseout="document.getElementById('fileInputButton').className='file_input_button';" />
</div>
</body>
</html>
Here's a simple css only solution, that creates a consistent target area, and lets you style your faux elements however you like.
The basic idea is this:
Have two "fake" elements (a text input/link) as siblings to your real file input. Absolutely position them so they're exactly on top of your target area.
Wrap your file input with a div. Set overflow to hidden (so the file input doesn't spill out), and make it exactly the size that you want your target area to be.
Set opacity to 0 on the file input so it's hidden but still clickable. Give it a large font size so the you can click on all portions of the target area.
Here's the jsfiddle: http://jsfiddle.net/gwwar/nFLKU/
<form>
<input id="faux" type="text" placeholder="Upload a file from your computer" />
Browse
<div id="wrapper">
<input id="input" size="100" type="file" />
</div>
</form>
Use the clip property along with opacity, z-index, absolute positioning, and some browser filters to place the file input over the desired button:
http://en.wikibooks.org/wiki/Cascading_Style_Sheets/Clipping
use uniform js plugin to style input of any type, select, textarea.
The URL is
http://uniformjs.com/
Related
Tap on image to get Input file functionality [duplicate]
Like a lot of people, I'd like to customize the ugly input type=file, and I know that it can't be done without some hacks and/or javascript. But, the thing is that in my case the upload file buttons are just for uploading images (jpeg|jpg|png|gif), so I was wondering if I could use a "clickable" image which would act exactly as an input type file (show the dialog box, and same $_FILE on submitted page). I found some workaround here, and this interesting one too (but does not work on Chrome =/). What do you guys do when you want to add some style to your file buttons? If you have any point of view about it, just hit the answer button ;)
This works really well for me: .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> Basically the for attribute of the label makes it so that clicking the label is the same as clicking the specified input. Also, the display property set to none makes it so that the file input isn't rendered at all, hiding it nice and clean. Tested in Chrome but according to the web should work on all major browsers. :) EDIT: Added JSFiddle here: https://jsfiddle.net/c5s42vdz/
Actually it can be done in pure css and it's pretty easy... HTML Code <label class="filebutton"> Browse For File! <span><input type="file" id="myfile" name="myfile"></span> </label> CSS Styles 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; } The idea is to position the input absolutely inside your label. set the font size of the input to something large, which will increase the size of the "browse" button. It then takes some trial and error using the negative left / top properties to position the input browse button behind your label. When positioning the button, set the alpha to 1. When you've finished set it back to 0 (so you can see what you're doing!) Make sure you test across browsers because they'll all render the input button a slightly different size.
Great solution by #hardsetting, But I made some improvements to make it work with Safari(5.1.7) in windows .image-upload > input { visibility:hidden; width:0; height:0 } <div class="image-upload"> <label for="file-input"> <img src="https://via.placeholder.com/300x300.png?text=UPLOAD" style="pointer-events: none"/> </label> <input id="file-input" type="file" /> </div> I have used visibility: hidden, width:0 instead of display: none for safari issue and added pointer-events: none in img tag to make it working if input file type tag is in FORM tag. Seems working for me in all major browsers. Hope it helps someone.
A much better way than writing JS is to use native, and it turns to be lighter than what was suggested: <label> <img src="my-image.png"> <input type="file" name="myfile" style="display:none"> </label> This way the label is automatically connected to the input that is hidden. Clicking on the label is like clicking on the field.
You can replace image automatically with newly selected image. <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>
I would use SWFUpload or Uploadify. They need Flash but do everything you want without troubles. Any <input type="file"> based workaround that tries to trigger the "open file" dialog by means other than clicking on the actual control could be removed from browsers for security reasons at any time. (I think in the current versions of FF and IE, it is not possible any more to trigger that event programmatically.)
This is my method if i got your point 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'" alt="Injaz Msila" 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>
I have had lots of issues with hidden and not visible inputs over the past decade sometimes things are way simpler than we think. I have had a little wish with IE 5,6,7,8 and 9 for not supporting the opacity and thus the file input would cover the upload image however the following css code has resolved the issue. -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: alpha(opacity=0); The following snipped is tested on chrome, IE 5,6,7,8,9,10 the only issue in IE 5 is that it does not support auto margin. Run the snippet simply copy and paste the CSS and HTML modify the size as you like. .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>
its really simple you can try this: $("#image id").click(function(){ $("#input id").click(); });
You can put an image instead, and do it like this: 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'); }); CAVEAT: In IE9 and IE10 if you trigger the onclick in a file input via javascript the form gets flagged as 'dangerous' and cannot be submmited with javascript, no sure if it can be submitted traditionaly.
The input itself is hidden with CSS visibility:hidden. Then you can have whatever element you whish - anchor or image.., when the anchor/image is clicked, trigger a click on the hidden input field - the dialog box for selecting a file will appear. EDIT: Actually it works in Chrome and Safari, I just noticed that is not the case in FF4Beta
Working Code: just hide input part and do like this. <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>
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> RUN SNIPPET or Just copy the above code and execute. You will get what you wanted. Very simple and effective without javascript. Enjoy!!!
<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>
Input type submit won't round
I tried to make button rounded: .btn-rounded { border-radius: 12px; } <input type="submit" value="Posalji" class="btn-rounded"> But it won't make it round!
The code is fine. You should always load the CSS before loading the code. So, put CSS at the top in <head>
Making a Choose file button look like a div
I've got a file submit form and I want to change how the buttons look. Previously, I've done it this way, by wrapping the form inputs into divs and then using CSS to make the divs look a certain way. However, It doesn't seem to work for the file submit button #myFile. It just places the button inside of the div. Whereas the submit button looks how I want it to look. Anyway to fix this? I would like the Choose File button to look like the submit button. Just text, no gray oval. <form id="dataform" action="submit" method="post" enctype="multipart/form-data"> <div id="btn_upload_data"> <input type="file" name="myfile" id="myFile"/> </div> <div id="btn_sub_data"> <input type="submit" id="data_submit" value="Submit File"/> </div> </form> Some CSS: div#btn_upload_data input { cursor:pointer; padding-top:40px; padding-bottom:60px; width:130px; height:0px; background-color:#a6e79b; border: none; text-align:center; display:inline-block; float:left; white-space: pre-wrap; }
Try using #btn_upload_data input[type="file"] { opacity: 0; filter: aplha(opacity=0); } And then place a text inside the div as Choose File. <div id="btn_upload_data" title="No File Chosen"> // if title needed <input type="file" name="myfile" id="myFile"/> Choose File... </div> There is no alternate way of editing it. It is a pre-defined input type file's style. That is set by the OS itself. So you cannot edit that! You need to override it completely.
Manipulating HTML forms with CSS
I've been working on some forms, and I'm not sure how to customize them. This solution seems to work, but in my case the properties are simply applied to the area around the form rather than the form itself. CSS: .Forms{ position:relative; top:100px; background-color:#666; font-family:'Unica One'; font-weight:500; } HTML: <form action="" method="post" class="Forms" id="Form1"> <input type="submit" value="Email Zoltan (Financial Manager, Director)" /> <input type="hidden" name="button_pressed" value="1" /> </form>
The CSS code sets properties on the form element. Apparently you want to apply some of them to the input button instead, so you need to break the rule into two rules: <!doctype html> <link href='http://fonts.googleapis.com/css?family=Unica+One' rel='stylesheet'> <style> .Forms { position: relative; top: 100px; } .Forms input[type=submit] { background-color: #666; font-family: 'Unica One'; } </style> <form action="" method="post" class="Forms" id="Form1"> <input type="submit" value="Email Zoltan (Financial Manager, Director)" /> <input type="hidden" name="button_pressed" value="1" /> </form> I presume Unica One is meant to refer to a Google font with that name. In that case, do not set font-weight, since that font exists as normal (400) typeface only. If you try to set the weight to 500, most browsers ignore it but some may apply algorithmic bolding, which produces questionable results. Note that setting the background color changes the basic rendering too: the default button, usually with rounded corners in modern browsers, turns to a rectangular box with a bit odd border. You can change this by setting various border properties (including border-radius) on the input element. The point is that buttons have built-in rendering in browsers, but if you set certain crucial CSS properties, this rendering changes to something different, and you should consider setting different other properties as well, when relevant. P.S. The button becomes almost illegible, due to insufficient color contrast mostly, and Unica One isn’t really suitable for use like this.
try this give css to the form input submit button as said by scott form.Forms input[type="submit"]{ position:relative; top:100px; background-color:#666; font-family:'Unica One'; font-weight:500; }
how to add space between textbox and browse button for input file type
Can we add space between the browse button and textbox for input type file ?Is that possible? Aslo can i add border color for the same textbox ? thanks, michaeld
Increasing spacing is not possible. Generally speaking, styling an input type="file" is extremely difficult. If you check cross-browser, you can see that different browsers render it differently. The only way to style it is to fake another element as input type="file" Example: http://www.quirksmode.org/dom/inputfile.html
You should use css to do this: Your html: <input type="text" class="yourclass" name="yourname" /> <input type="submit" /> your css: <style> input.yourclass { border:1px solid red; margin-right: 10px;} </style> Hope this puts you in the right direction
It is working for me in Chrome. input.file { text-indent: initial; }