Vou acrescentar a minha própria resposta para fazê-lo da maneira que eu fiz ... mas aqui está um exemplo baseado em inicialização que podem ajudar .. geniuscarrier.com/...
Vishnu Narang
Respostas:
235
As entradas de arquivo de estilo são notoriamente difíceis, pois a maioria dos navegadores não altera a aparência de CSS ou javascript.
Mesmo o tamanho da entrada não responderá aos gostos de:
<inputtype="file"style="width:200px">
Em vez disso, você precisará usar o atributo size:
<inputtype="file"size="60"/>
Para qualquer estilo mais sofisticado do que isso (por exemplo, alterando a aparência do botão de navegação), será necessário observar a abordagem complicada de sobrepor um botão estilizado e uma caixa de entrada sobre a entrada do arquivo nativo. O artigo já mencionado por rm em www.quirksmode.org/dom/inputfile.html é o melhor que eu já vi.
ATUALIZAR
Embora seja difícil estilizar uma <input>tag diretamente, isso é facilmente possível com a ajuda de uma <label>tag. Veja a resposta abaixo de @JoshCrozier: https://stackoverflow.com/a/25825731/10128619
A resposta de @TLK Ryan não funcionará no IE ao tentar fazer uploads de iframe. Isso fornece um erro de acesso negado. Para envios normais, eu concordo que é o mais fácil!
Frostymarvelous
3
Uma solução muito mais simples que a do modo quirks é explicada aqui . Basta colocar esse link aqui, já que essa resposta é basicamente uma resposta apenas de link.
Joeytje50
10
Para qualquer pessoa interessada em uma abordagem moderna, sugiro olhar para esta resposta . Também não requer JavaScript, como algumas das outras respostas.
Josh Crozier
3
A @JoshCrozier postou uma solução incrivelmente melhor. Mesmo bate soluções de mouseclicking falsos :)
Lodewijk
1018
Você não precisa de JavaScript para isso! Aqui está uma solução para vários navegadores:
A melhor abordagem seria ter um elemento de rótulo personalizado com um foratributo anexado a um elemento de entrada de arquivo oculto . (O foratributo do rótulo deve corresponder ao elemento do arquivo idpara que isso funcione).
1 - Vale a pena notar que, se você ocultar o elemento display: none, ele não funcionará no IE8 e abaixo. Também esteja ciente do fato de que o jQuery validate não valida campos ocultos por padrão. Se um desses problemas for um problema para você, aqui estão dois métodos diferentes para ocultar a entrada ( 1 , 2 ) que funciona nessas circunstâncias.
Porém, eu tenho uma pergunta com essa, ao selecionar um arquivo, como exibiríamos o nome do arquivo?
precisa saber é o seguinte
17
Como exibir o nome do arquivo selecionado se display: noneestiver definido para input[type=file]?
Sarthak Singhal
38
Ótima solução, mas você realmente precisa de javascript. Se você deseja exibir o nome do arquivo, como outras pessoas perguntam, é necessário adicionar um intervalo entre o rótulo e a entrada oculta: <span id = "file-selected"> </span>. Atualize o período no evento de alteração: $ ('# file-upload'). Bind ('change', function () {var fileName = ''; fileName = $ (this) .val (); $ ('# selecionado-file ') html (fileName);}).
Sam
9
Você deve usar em position: absolute; left: -99999remvez de display: nonepor motivos de acessibilidade. Na maioria das vezes, os leitores de tela não lêem elementos se estiverem ocultos usando o display: nonemétodo
Capsule
10
Estou muito surpreso ao descobrir que ninguém parece ter considerado a acessibilidade do teclado. labelelementos não são acessíveis pelo teclado, ao contrário de buttons e inputs. A adição tabindexnão é uma solução, porque labelainda não será acionada quando tiver o foco e o usuário pressionar enter. I resolvido por esta visualmente escondendo a entrada, para que ainda possa ser centrada, e, em seguida, utilizando :focus-withinno labelpai: jsbin.com/fokexoc/2/edit?html,css,output
Oliver Joseph Ash
195
siga estas etapas e crie estilos personalizados para o formulário de upload de arquivos:
este é o formulário HTML simples (leia os comentários em HTML que escrevi aqui abaixo)
<formaction="#type your action here"method="POST"enctype="multipart/form-data"><divid="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!--><divstyle='height:0px;width:0px;overflow:hidden;'><inputid="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--><inputtype="submit"value='submit'></form>
use esse script simples para passar o evento click para a tag de entrada do arquivo.
function getFile(){
document.getElementById("upfile").click();}
Agora você pode usar qualquer tipo de estilo sem se preocupar em alterar os estilos padrão.
Sei muito bem disso, porque tenho tentado alterar os estilos padrão há um mês e meio. acredite, é muito difícil porque navegadores diferentes têm tags de entrada de upload diferentes. Portanto, use este para criar seus formulários de upload de arquivos personalizados. Aqui está o código completo do UPLOAD AUTOMATIZADO.
<formaction="#type your action here"method="POST"enctype="multipart/form-data"name="myForm"><divid="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--><divstyle='height:0px;width:0px;overflow:hidden;'><inputid="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>
@ user1053263 -> Obrigado pela recomendação .. aqui eu usei um script java muito simples, não há necessidade de usar estruturas como Jquery ou PrototypeJS.
teshguru
7
Estou com problemas para enviar o formulário no IE9. Estou recebendo um erro "Acesso negado" que tenta enviar o formulário via javascript. Se eu clicar no botão enviar pela interface do usuário, ele funcionará. Existe uma solução alternativa para isso?
Kevin
1
@kevin -> Por favor, tente event.preventDefault () após document.myForm.submit (), fiz a alteração no código acima.
teshguru
1
Funciona bem no Chrome, Firefox, Safari e Opera - mas não no IE9. No IE9, recebo o mesmo erro 'Acesso negado' que o @ Kevin - e, às vezes, apenas uma falha silenciosa sem erro.
Davidwc
10
No IE10 (e possivelmente no IE9, etc.), você receberá "Acesso negado" (ou nenhuma resposta do jQuery) se tentar enviar automaticamente o formulário após clicar no botão de entrada do arquivo através de javascript. Portanto, esse método funciona para estilizar o botão de entrada do arquivo, desde que o usuário ainda esteja enviando o formulário. Demorei um pouco para descobrir isso e vejo que outros também têm o mesmo problema. Consulte isso para obter mais informações: stackoverflow.com/a/4335390/21579 .
precisa
76
Oculte-o com css e use um botão personalizado com $ (seletor) .click () para ativar o botão de navegação. em seguida, defina um intervalo para verificar o valor do tipo de entrada do arquivo. o intervalo pode exibir o valor para o usuário, para que ele possa ver o que está sendo carregado. o intervalo será limpo quando o formulário for enviado [EDIT] Desculpe, eu tenho estado muito ocupado tentando atualizar esta postagem, aqui está um exemplo
<formaction="uploadScript.php"method="post"enctype="multipart/form-data"><div><!-- filename to display to the user --><pid="file-name"class="margin-10 bold-10"></p><!-- Hide this from the users view with css display:none; --><inputclass="display-none"id="file-type"type="file"size="4"name="file"/><!-- Style this button with type image or css whatever you wish --><inputid="browse-click"type="button"class="button"value="Browse for files"/><!-- submit button --><inputtype="submit"class="button"value="Change"/></div>
$(window).load(function(){var intervalFunc =function(){
$('#file-name').html($('#file-type').val());};
$('#browse-click').on('click',function(){// use .live() for older versions of jQuery
$('#file-type').click();
setInterval(intervalFunc,1);returnfalse;});});
Apenas curioso, ele funciona em todos os navegadores de nova geração, como Firefox, IE, Opera, Safari, Chrome, etc?
Wh1T3h4Ck5 04/10/12
Esta é a solução mais simples para mim! Pelo menos no IE 9, Chrome 23 e FF 16 com jQuery 1.7.2, portanto, com versões atualizadas, ele deve funcionar.
Dani Bishop
Alguém sabe como alterar o .new_Btn, caso o usuário tenha escolhido uma imagem. Agora, apenas mostra a mesma classe. Alguém sabe como rastrear isso? Obrigado
Ando
2
@MehdiKaramosly ele funciona mesmo no IE 6 - mas isso é verdade apenas até jQuery 1.x , jQuery 2.x + não suporta IEs velhos
jave.web
1
@Ando via JavaScript / jQuery => o valor da entrada de arquivo está vazio ou contém locais caminho do arquivo => uso onchange evento e teste para val () :) ver jsfiddle.net/ZrBPF
jave.web
55
Todos os mecanismos de renderização geram automaticamente um botão quando um <input type="file">é criado. Historicamente, esse botão não tem estilo. No entanto, Trident e WebKit adicionaram ganchos através de pseudo-elementos.
Tridente
No IE10, o botão de entrada do arquivo pode ser estilizado usando o ::-ms-browsepseudoelemento. Basicamente, qualquer regra CSS aplicada a um botão regular pode ser aplicada ao pseudoelemento. Por exemplo:
Isso é exibido da seguinte maneira no IE10 no Windows 8:
WebKit
O WebKit fornece um gancho para o botão de entrada de arquivo com o ::-webkit-file-upload-buttonpseudoelemento. Novamente, praticamente qualquer regra CSS pode ser aplicada; portanto, o exemplo Trident também funcionará aqui:
Ao estilizar uma entrada de arquivo, você não deve interromper nenhuma interação nativa fornecida pela entrada .
A display: noneabordagem quebra o suporte nativo de arrastar e soltar.
Para não quebrar nada, você deve usar o opacity: 0 abordagem da entrada e posicioná-la usando o padrão relativo / absoluto em um wrapper.
Usando essa técnica, você pode facilmente estilizar uma zona de clique / soltar para o usuário e adicionar classe personalizada em javascript no dragenterevento para atualizar estilos e fornecer um feedback ao usuário para permitir que ele veja que ele pode soltar um arquivo.
HTML:
<labelfor="test"><div>Click or drop something here</div><inputtype="file"id="test"></label>
obrigado pelo post, como isso funciona se o atributo multiple = "multiple" for adicionado? Eu arrastei duas imagens e vi o caminho apenas para a primeira.
PirateApp
Você perdeu o código aqui. Há mais sobre o violino. Qual biblioteca?
ctrl-alt-delor
Há apenas algum javascript no violino do jQuery para mostrar os arquivos que foram descartados. Isso é tudo
kevcha
Depois de implementar essa solução e testá-la mais, ela não parece funcionar no Edge.
precisa saber é o seguinte
1
Ah, ok, eu perdi o invólucro com a posição relativa em sua resposta - Meu mal. Se a entrada estiver abaixo das dimensões da tela, o navegador tentará rolar até ela e, ao fazer isso, moverá o contêiner de rolagem para cima da página. Aqui está uma demonstração: stackblitz.com/edit/input-file-overflow?file=style.css (apenas não exatamente demonstrando como posição absoluta é a causa do comportamento)
Tom
23
Eu sou capaz de fazê-lo com CSS puro usando o código abaixo. Eu usei bootstrap e fonte-awesome.
Você pode agrupar seu input type = "file" dentro de um rótulo para a entrada. Estilize o rótulo da maneira que desejar e oculte a entrada com display: none;
Aqui está uma solução que realmente não estiliza o <input type="file" />elemento, mas usa um <input type="file" />elemento em cima de outros elementos (que podem ser estilizados). O <input type="file" />elemento não é realmente visível, portanto, a ilusão geral é de um controle de upload de arquivo com estilo.
Me deparei com esse problema recentemente e, apesar da infinidade de respostas no Stack Overflow, nenhuma parecia realmente se encaixar. No final, acabei personalizando isso para ter uma solução simples e elegante.
Também testei isso no Firefox, IE (11, 10 e 9), Chrome e Opera, iPad e alguns dispositivos Android.
$('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");}});
Certifique-se de definir o estilo na entrada quando estiver pronto: opacity: 0
você não pode definir display: noneporque precisa ser clicável. Mas você pode posicioná-lo sob o botão "novo" ou dobrá-lo sob outra coisa com o z-index, se preferir.
Configure algum jquery para clicar na entrada real quando você clicar na imagem.
isso falhará com o FF11 - motivo: como você não pode influenciar com precisão o tamanho do campo de entrada (apenas usando tamanho html) e o botão (você pode definir a altura usando css), se o seu campo de entrada visível for maior que o FF original nos fornece, você é deixado com uma área muito big blind - ponto de vista do usuário: na maioria dos casos ele vai reclamar que upload não trabalho, quando clicado
Jeffz
2
Boa ideia, mas isso não funcionará no IE. $ ('# the_real_file_input'). click () ativará a caixa de diálogo aberta, mas o arquivo não será selecionado em um formulário e o upload falhará.
Tomas
11
Coloque o botão de upload de arquivo sobre seu botão ou elemento legal e oculte-o.
você não pode usar o método click () para disparar um evento para o arquivo do tipo de entrada. a maior parte do navegador não permite por razões de segurança
Mahi
mesmo usando jquery? isso está correto? como você faria isso?
style="visibility:hidden"é muito longo, basta usar hidden. Além disso, click()funciona para qualquer navegador e não há nenhuma razão de segurança veryfiable a partir de agora e em qualquer dispositivo é a maneira legal e @Gianluca para uso clássico jQuerytrigger()
Thielicious
1
Esta é precisamente a solução que eu adicionaria a isso! Funciona e você pode exibi-lo exatamente como deseja. Funciona com o Chrome, tentará outros.
markthewizard1234
7
a única maneira de pensar é encontrar o botão com javascript depois que ele é renderizado e atribuir um estilo a ele
Eu normalmente usaria javascript simples para personalizar a tag de entrada do arquivo. Um campo de entrada oculto, ao clicar no botão, o javascript chama o campo oculto, solução simples sem qualquer css ou monte de jquery.
você não pode usar o click()método para disparar evento para o arquivo de tipo de entrada. a maior parte do navegador não permite por motivos de segurança.
Mahi
6
Aqui usamos um período para acionar a entrada do tipo de arquivo e simplesmente personalizamos esse período , para que possamos adicionar qualquer estilo dessa maneira.
Observe que usamos a tag de entrada com a opção visibilidade: oculta e a acionamos no período.
Isso funciona muito bem em 2+ angulares. Não sei por que foi votado para baixo. Se você estiver usando angular, esta é a solução mais simples disponível.
precisa saber é o seguinte
4
SOMENTE CSS
Use isso muito simples e fácil
Html:
<label>Attach your screenshort</label><inputtype="file"multipleclass="choose">
Não se deixe enganar por "ótimas" soluções somente CSS que são realmente muito específicas do navegador ou que sobrepõem o botão estilizado na parte superior do botão real ou que o forçam a usar um em <label>vez de um<button> ou qualquer outro tipo de hack . É necessário JavaScript para fazê-lo funcionar para uso geral. Por favor, estude como o Gmail e o DropZone fazem isso, se você não acredita em mim.
Apenas estilize um botão normal como desejar e, em seguida, chame uma função JS simples para criar e vincular um elemento de entrada oculto ao seu botão estilizado.
Observe como o código acima o vincula novamente após cada vez que o usuário escolhe um arquivo. Isso é importante porque "onchange" é chamado apenas se o usuário alterar o nome do arquivo. Mas você provavelmente deseja obter o arquivo sempre que o usuário o fornecer.
Para ser exato, a labelabordagem funciona, exceto que não pode mostrar o nome ou o caminho do arquivo selecionado. Então, necessariamente falando, esse é o único problema que um JS precisa resolver.
Hassan Baig
4
Solução de vários arquivos com nome de arquivo convertido
Como exibir apenas o nome do arquivo, e não o fakepathcaminho?
Hassan Baig
3
Nesta semana, eu também precisei personalizar o botão e exibir o nome do arquivo selecionado ao lado, então, depois de ler algumas das respostas acima (Obrigado, BTW), criei a seguinte implementação:
Basicamente, estou trabalhando com a lib ng-file-upload, no sentido angular, vinculo o nome do arquivo ao meu $ scope e fornecendo o valor inicial de 'Nenhum arquivo escolhido', também vinculo a função onFileSelect () a meu escopo; assim, quando um arquivo é selecionado, estou obtendo o nome do arquivo usando a API ng-upload e atribuindo-o ao $ scope.filename.
Simplesmente simule um clique <input>usando a trigger()função ao clicar em um estilo <div>. Criei meu próprio botão a partir de um <div>e, em seguida, iniciei um clique no inputquando clico em meu <div>. Isso permite que você crie seu botão da maneira que desejar, porque é um <div>e simula um clique no seu arquivo <input>. Então use display: noneno seu <input>.
// div styled as my load file button<div id="simClick">Loadfrom backup</div><input type="file" id="readFile"/>// Click function for input
$("#readFile").click(function(){
readFile();});// Simulate click on the input when clicking div
$("#simClick").click(function(){
$("#readFile").trigger("click");});
A melhor maneira é usar o pseudo-elemento: after ou: before como um elemento visível na entrada de. Em seguida, estilize esse pseudo elemento como desejar. Eu recomendo que você faça como um estilo geral para todos os arquivos de entrada da seguinte maneira:
A melhor maneira que eu encontrei é tendo uma input type: fileconfiguração para display: none. Dê um id. Crie um botão ou qualquer outro elemento que você deseja abrir a entrada do arquivo.
Em seguida, adicione um ouvinte de evento (botão) que, quando clicado, simula um clique na entrada do arquivo original. Como clicar em um botão chamado hello, mas abre uma janela de arquivo.
Código de exemplo
//i am using semantic ui<button class="ui circular icon button purple send-button" id="send-btn"><i class="paper plane icon"></i></button><input type="file" id="file"class="input-file"/>
javascript
var attachButton=document.querySelector('.attach-button');
attachButton.addEventListener('click', e=>{
$('#file').trigger("click")})
o CSS pode fazer muito aqui ... com um pouco de truque ...
<divid='wrapper'><inputtype='file'id='browse'></div>
#wrapper {
width: 93px; /*play with this value */
height: 28px; /*play with this value */
background: url('browseBtn.png') 0 0 no-repeat;
border:none;
overflow:hidden;
}
#browse{
margin-left:-145px; /*play with this value */
opacity:0; /* set to .5 or something so you can better position it as an overlay then back to zero again after you're done */
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
}
Encontrei um método muito fácil de alternar o botão de arquivo para uma imagem. Você apenas rotula uma imagem e a coloca em cima do botão de arquivo.
<html><divid="File button"><divstyle="position:absolute;"><!--This is your labeled image--><labelfor="fileButton"><imgsrc="ImageURL"></label></div><div><inputtype="file"id="fileButton"/></div></div></html>
Ao clicar na imagem rotulada, você seleciona o botão do arquivo.
Isso oculta o botão do arquivo de entrada, mas, sob o capô, ele clica em outro botão normal, que você pode obviamente usar como qualquer outro botão. Esta é a única solução sem desvantagens além de um nó DOM inútil. Graças a display:none;, o botão de entrada não reserva nenhum espaço visível no DOM.
(Não sei mais a quem dar suporte para isso. Mas recebi essa ideia de algum lugar aqui no Stackoverflow.)
Respostas:
As entradas de arquivo de estilo são notoriamente difíceis, pois a maioria dos navegadores não altera a aparência de CSS ou javascript.
Mesmo o tamanho da entrada não responderá aos gostos de:
Em vez disso, você precisará usar o atributo size:
Para qualquer estilo mais sofisticado do que isso (por exemplo, alterando a aparência do botão de navegação), será necessário observar a abordagem complicada de sobrepor um botão estilizado e uma caixa de entrada sobre a entrada do arquivo nativo. O artigo já mencionado por rm em www.quirksmode.org/dom/inputfile.html é o melhor que eu já vi.
ATUALIZAR
Embora seja difícil estilizar uma
<input>
tag diretamente, isso é facilmente possível com a ajuda de uma<label>
tag. Veja a resposta abaixo de @JoshCrozier: https://stackoverflow.com/a/25825731/10128619fonte
Você não precisa de JavaScript para isso! Aqui está uma solução para vários navegadores:
Veja este exemplo! - Funciona no Chrome / FF / IE - (IE10 / 9/8/7)
A melhor abordagem seria ter um elemento de rótulo personalizado com um
for
atributo anexado a um elemento de entrada de arquivo oculto . (Ofor
atributo do rótulo deve corresponder ao elemento do arquivoid
para que isso funcione).Como alternativa, você também pode envolver o elemento de entrada do arquivo diretamente com um rótulo: (exemplo)
Em termos de estilo, oculte 1 o elemento de entrada usando o seletor de atributos .
Então, tudo que você precisa fazer é estilizar o
label
elemento personalizado . (exemplo) .1 - Vale a pena notar que, se você ocultar o elemento
display: none
, ele não funcionará no IE8 e abaixo. Também esteja ciente do fato de que o jQuery validate não valida campos ocultos por padrão. Se um desses problemas for um problema para você, aqui estão dois métodos diferentes para ocultar a entrada ( 1 , 2 ) que funciona nessas circunstâncias.fonte
display: none
estiver definido parainput[type=file]
?position: absolute; left: -99999rem
vez dedisplay: none
por motivos de acessibilidade. Na maioria das vezes, os leitores de tela não lêem elementos se estiverem ocultos usando odisplay: none
métodolabel
elementos não são acessíveis pelo teclado, ao contrário debutton
s einput
s. A adiçãotabindex
não é uma solução, porquelabel
ainda não será acionada quando tiver o foco e o usuário pressionar enter. I resolvido por esta visualmente escondendo a entrada, para que ainda possa ser centrada, e, em seguida, utilizando:focus-within
nolabel
pai: jsbin.com/fokexoc/2/edit?html,css,outputsiga estas etapas e crie estilos personalizados para o formulário de upload de arquivos:
este é o formulário HTML simples (leia os comentários em HTML que escrevi aqui abaixo)
use esse script simples para passar o evento click para a tag de entrada do arquivo.
Agora você pode usar qualquer tipo de estilo sem se preocupar em alterar os estilos padrão.
Sei muito bem disso, porque tenho tentado alterar os estilos padrão há um mês e meio. acredite, é muito difícil porque navegadores diferentes têm tags de entrada de upload diferentes. Portanto, use este para criar seus formulários de upload de arquivos personalizados. Aqui está o código completo do UPLOAD AUTOMATIZADO.
fonte
Oculte-o com css e use um botão personalizado com $ (seletor) .click () para ativar o botão de navegação. em seguida, defina um intervalo para verificar o valor do tipo de entrada do arquivo. o intervalo pode exibir o valor para o usuário, para que ele possa ver o que está sendo carregado. o intervalo será limpo quando o formulário for enviado [EDIT] Desculpe, eu tenho estado muito ocupado tentando atualizar esta postagem, aqui está um exemplo
fonte
HTML
CSS
jQuery
Violino : http://jsfiddle.net/M7BXC/
Você também pode alcançar seus objetivos sem o jQuery com JavaScript normal.
Agora o newBtn está vinculado ao html_btn e você pode estilizar seu novo btn como quiser: D
fonte
Todos os mecanismos de renderização geram automaticamente um botão quando um
<input type="file">
é criado. Historicamente, esse botão não tem estilo. No entanto, Trident e WebKit adicionaram ganchos através de pseudo-elementos.Tridente
No IE10, o botão de entrada do arquivo pode ser estilizado usando o
::-ms-browse
pseudoelemento. Basicamente, qualquer regra CSS aplicada a um botão regular pode ser aplicada ao pseudoelemento. Por exemplo:Isso é exibido da seguinte maneira no IE10 no Windows 8:
WebKit
O WebKit fornece um gancho para o botão de entrada de arquivo com o
::-webkit-file-upload-button
pseudoelemento. Novamente, praticamente qualquer regra CSS pode ser aplicada; portanto, o exemplo Trident também funcionará aqui:Isso é exibido da seguinte maneira no Chrome 26 no OS X:
fonte
Se você estiver usando o Bootstrap 3, isso funcionou para mim:
Consulte http://www.abeautifulsite.net/whipping-file-inputs-into-shape-with-bootstrap-3/
Que produz o seguinte botão de entrada de arquivo:
Sério, confira http://www.abeautifulsite.net/whipping-file-inputs-into-shape-with-bootstrap-3/
fonte
Exemplo de trabalho aqui com suporte nativo ao arrastar e soltar: https://jsfiddle.net/j40xvkb3/
Ao estilizar uma entrada de arquivo, você não deve interromper nenhuma interação nativa fornecida pela entrada .
A
display: none
abordagem quebra o suporte nativo de arrastar e soltar.Para não quebrar nada, você deve usar o
opacity: 0
abordagem da entrada e posicioná-la usando o padrão relativo / absoluto em um wrapper.Usando essa técnica, você pode facilmente estilizar uma zona de clique / soltar para o usuário e adicionar classe personalizada em javascript no
dragenter
evento para atualizar estilos e fornecer um feedback ao usuário para permitir que ele veja que ele pode soltar um arquivo.HTML:
CSS:
Aqui está um exemplo prático (com JS adicional para manipular
dragover
arquivos de eventos e descartados)https://jsfiddle.net/j40xvkb3/
Espero que isso tenha ajudado!
fonte
Eu sou capaz de fazê-lo com CSS puro usando o código abaixo. Eu usei bootstrap e fonte-awesome.
fonte
Você pode agrupar seu input type = "file" dentro de um rótulo para a entrada. Estilize o rótulo da maneira que desejar e oculte a entrada com display: none;
fonte
Aqui está uma solução que realmente não estiliza o
<input type="file" />
elemento, mas usa um<input type="file" />
elemento em cima de outros elementos (que podem ser estilizados). O<input type="file" />
elemento não é realmente visível, portanto, a ilusão geral é de um controle de upload de arquivo com estilo.Me deparei com esse problema recentemente e, apesar da infinidade de respostas no Stack Overflow, nenhuma parecia realmente se encaixar. No final, acabei personalizando isso para ter uma solução simples e elegante.
Também testei isso no Firefox, IE (11, 10 e 9), Chrome e Opera, iPad e alguns dispositivos Android.
Aqui está o link do JSFiddle -> http://jsfiddle.net/umhva747/
Espero que isto ajude!!!
fonte
Isso é simples com o jquery. Para dar um exemplo de código da sugestão de Ryan com uma pequena modificação.
HTML básico:
Certifique-se de definir o estilo na entrada quando estiver pronto:
opacity: 0
você não pode definirdisplay: none
porque precisa ser clicável. Mas você pode posicioná-lo sob o botão "novo" ou dobrá-lo sob outra coisa com o z-index, se preferir.Configure algum jquery para clicar na entrada real quando você clicar na imagem.
Agora seu botão está funcionando. Basta cortar e colar o valor quando alterado.
Tah dah! Pode ser necessário analisar o val () para algo mais significativo, mas você deve estar pronto.
fonte
Coloque o botão de upload de arquivo sobre seu botão ou elemento legal e oculte-o.
Muito simples e funcionará em qualquer navegador
Estilos
fonte
VISIBILIDADE: truque oculto
Eu costumo seguir o
visibility:hidden
truqueeste é o meu botão estilizado
este é o tipo de entrada = botão de arquivo. Observe a
visibility:hidden
regraeste é o bit JavaScript para colá-los juntos. Funciona
fonte
style="visibility:hidden"
é muito longo, basta usarhidden
. Além disso,click()
funciona para qualquer navegador e não há nenhuma razão de segurança veryfiable a partir de agora e em qualquer dispositivo é a maneira legal e @Gianluca para uso clássico jQuerytrigger()
a única maneira de pensar é encontrar o botão com javascript depois que ele é renderizado e atribuir um estilo a ele
você também pode olhar para este artigo
fonte
Eu normalmente usaria javascript simples para personalizar a tag de entrada do arquivo. Um campo de entrada oculto, ao clicar no botão, o javascript chama o campo oculto, solução simples sem qualquer css ou monte de jquery.
fonte
click()
método para disparar evento para o arquivo de tipo de entrada. a maior parte do navegador não permite por motivos de segurança.Aqui usamos um período para acionar a entrada do tipo de arquivo e simplesmente personalizamos esse período , para que possamos adicionar qualquer estilo dessa maneira.
Observe que usamos a tag de entrada com a opção visibilidade: oculta e a acionamos no período.
Referência
fonte
É uma ótima maneira de fazer isso com o upload de material / arquivo angular. Você pode fazer o mesmo com um botão de inicialização.
Observe que eu usei, em
<a>
vez<button>
disso, permite que os eventos de clique borbulhem.fonte
SOMENTE CSS
Use isso muito simples e fácil
Html:
Css:
fonte
Talvez muitos awnsers. Mas eu gosto disso em CSS puro com botões fa:
Fiddle: https://jsfiddle.net/zoutepopcorn/v2zkbpay/1/
fonte
Não se deixe enganar por "ótimas" soluções somente CSS que são realmente muito específicas do navegador ou que sobrepõem o botão estilizado na parte superior do botão real ou que o forçam a usar um em
<label>
vez de um<button>
ou qualquer outro tipo de hack . É necessário JavaScript para fazê-lo funcionar para uso geral. Por favor, estude como o Gmail e o DropZone fazem isso, se você não acredita em mim.Apenas estilize um botão normal como desejar e, em seguida, chame uma função JS simples para criar e vincular um elemento de entrada oculto ao seu botão estilizado.
Observe como o código acima o vincula novamente após cada vez que o usuário escolhe um arquivo. Isso é importante porque "onchange" é chamado apenas se o usuário alterar o nome do arquivo. Mas você provavelmente deseja obter o arquivo sempre que o usuário o fornecer.
fonte
label
abordagem funciona, exceto que não pode mostrar o nome ou o caminho do arquivo selecionado. Então, necessariamente falando, esse é o único problema que um JS precisa resolver.Solução de vários arquivos com nome de arquivo convertido
EXEMPLO de inicialização
HTML:
1. JS com jQuery:
2. JS sem jQuery
fonte
Aqui está uma solução que também mostra o nome do arquivo escolhido: http://jsfiddle.net/raft9pg0/1/
HTML:
JS:
CSS:
fonte
fakepath
caminho?Nesta semana, eu também precisei personalizar o botão e exibir o nome do arquivo selecionado ao lado, então, depois de ler algumas das respostas acima (Obrigado, BTW), criei a seguinte implementação:
HTML:
CSS
Javascript (Angular)
Basicamente, estou trabalhando com a lib ng-file-upload, no sentido angular, vinculo o nome do arquivo ao meu $ scope e fornecendo o valor inicial de 'Nenhum arquivo escolhido', também vinculo a função onFileSelect () a meu escopo; assim, quando um arquivo é selecionado, estou obtendo o nome do arquivo usando a API ng-upload e atribuindo-o ao $ scope.filename.
fonte
Simplesmente simule um clique
<input>
usando atrigger()
função ao clicar em um estilo<div>
. Criei meu próprio botão a partir de um<div>
e, em seguida, iniciei um clique noinput
quando clico em meu<div>
. Isso permite que você crie seu botão da maneira que desejar, porque é um<div>
e simula um clique no seu arquivo<input>
. Então usedisplay: none
no seu<input>
.fonte
A melhor maneira é usar o pseudo-elemento: after ou: before como um elemento visível na entrada de. Em seguida, estilize esse pseudo elemento como desejar. Eu recomendo que você faça como um estilo geral para todos os arquivos de entrada da seguinte maneira:
fonte
A melhor maneira que eu encontrei é tendo uma
input type: file
configuração paradisplay: none
. Dê umid
. Crie um botão ou qualquer outro elemento que você deseja abrir a entrada do arquivo.Em seguida, adicione um ouvinte de evento (botão) que, quando clicado, simula um clique na entrada do arquivo original. Como clicar em um botão chamado hello, mas abre uma janela de arquivo.
Código de exemplo
javascript
fonte
o CSS pode fazer muito aqui ... com um pouco de truque ...
:: referência :: http://site-o-matic.net/?viewpost=19
-Mosteiro
fonte
Encontrei um método muito fácil de alternar o botão de arquivo para uma imagem. Você apenas rotula uma imagem e a coloca em cima do botão de arquivo.
Ao clicar na imagem rotulada, você seleciona o botão do arquivo.
fonte
Somente essa abordagem oferece toda a flexibilidade! ES6 / VanillaJS!
html:
javascript:
Isso oculta o botão do arquivo de entrada, mas, sob o capô, ele clica em outro botão normal, que você pode obviamente usar como qualquer outro botão. Esta é a única solução sem desvantagens além de um nó DOM inútil. Graças a
display:none;
, o botão de entrada não reserva nenhum espaço visível no DOM.(Não sei mais a quem dar suporte para isso. Mas recebi essa ideia de algum lugar aqui no Stackoverflow.)
fonte