Como ocultar automaticamente o texto do espaço reservado no foco usando css ou jquery?

213

Isso é feito automaticamente para todos os navegadores, exceto o Chrome .

Acho que preciso segmentar especificamente o Chrome .

Alguma solução?

Se não estiver com CSS , então com jQuery ?

Atenciosamente.

LondonGuy
fonte
cehck minha edição, em seguida, pode ajudar
Toni Michel Caubet
O Opera também é outro navegador que remove o espaço reservado no foco.
Lucas
O Firefox a partir da versão 15 não remove mais o texto do espaço reservado até você começar a digitar. Acredito que o mesmo possa ser o caso do IE10, mas não tenho como verificar isso.
Rob Fletcher
1
Estou preocupado que ninguém tenha mencionado o fato de que você não deve se preocupar em modificar os comportamentos do navegador nativo. Eu pelo menos prefiro que o espaço reservado permaneça presente. Isso apenas me ajuda como usuário final, e é um recurso que os navegadores estão começando a implementar ... provavelmente porque o comportamento de desaparecer em foco provou ser um problema de usabilidade. Deixe o navegador estar, por favor.
Ryan Wheale
"Isso é feito automaticamente para todos os navegadores, exceto o Chrome." Não mais? Eu apenas tentei isso no OSX no Firefox 37.0.2, Safari 7.1.5 e Chrome 42.0. Nenhum deles remove o texto do espaço reservado até eu começar a digitar e todos o colocam de volta quando eu limpo o campo.
Nathan Long

Respostas:

261
<input 
type="text" 
placeholder="enter your text" 
onfocus="this.placeholder = ''"
onblur="this.placeholder = 'enter your text'" />
MatuDuke
fonte
2
Isso faz com que ele funcione, mas quando clico fora do campo, ele permanece em branco.
LondonGuy
2
@LondonGuy: Acabei de editar meu post, veja se ele funciona como você queria. Mas a solução de Toni Michel Caubet é melhor
MatuDuke 14/03/12
9
O problema aqui é que isso é JavaScript invasivo. A solução de Toni Michel Caubet é melhor.
Silkster
Eu gosto, mas infelizmente não funciona nem o IE nem o Safari.
Mohammed Moustafa
455

Editar: Todos os navegadores são compatíveis agora

input:focus::placeholder {
  color: transparent;
}
<input type="text" placeholder="Type something here!">

O Firefox 15 e o IE 10+ também suportam isso agora. Para expandir a solução CSS de Casey Chu :

input:focus::-webkit-input-placeholder { color:transparent; }
input:focus:-moz-placeholder { color:transparent; } /* FF 4-18 */
input:focus::-moz-placeholder { color:transparent; } /* FF 19+ */
input:focus:-ms-input-placeholder { color:transparent; } /* IE 10+ */
Rob Fletcher
fonte
1
Ótima resposta! Não vejo muito sentido abandonar minha antiga solução jQuery em favor do HTML5 e, em seguida, seguir em frente e adicionar o JavaScript novamente como uma correção. Esta é apenas a solução que eu estava procurando.
Nienn 26/03
@MartinHunt você já tentou isso no FF? input: focus :: - moz-placeholder
Philip
16
Desculpas pela dragagem de um encadeamento antigo, mas apenas para tornar isso mais completo: input: focus: -moz-placeholder é para Firefox 18 e abaixo; para os 19 em diante, você precisa usar: input: focus :: - moz-placeholder (note o cólon duplo). Ref: css-tricks.com/snippets/css/style-placeholder-text
Peter Lewis
este comentário é uma vitória. obras com controles dinâmicos, como kendo também
reflog
1
Ótima resposta também de mim! Para aqueles de nós que também podem exigir essa funcionalidade quando o campo está desativado aqui está o código CSS: / * Ocultando o texto do espaço reservado (se houver), quando o campo de espera estiver desativado * / input: disabled :: - webkit-input- espaço reservado {color: transparent; } input: disabled: -moz-placeholder {color: transparent; } input: disabled :: - moz-placeholder {color: transparent; } input: disabled: -ms-input-placeholder {color: transparent; }
Ramanagom 20/09/19
74

Aqui está uma solução somente CSS (por enquanto, só funciona no WebKit):

input:focus::-webkit-input-placeholder {
    opacity: 0;
}
Casey Chu
fonte
1
Eu gosto desta resposta, mas o suporte ao navegador para isso ainda não está disponível.
Jerry
44

Solução CSS pura (não é necessário JS)

Com base nas respostas de @Hexodus e @Casey Chu, aqui está uma solução atualizada e entre navegadores que aproveita a opacidade e as transições de CSS para diminuir o texto do espaço reservado. Ele funciona para qualquer elemento que possa usar espaços reservados, incluindo textareae inputtags.

::-webkit-input-placeholder { opacity: 1; -webkit-transition: opacity .5s; transition: opacity .5s; }  /* Chrome <=56, Safari < 10 */
:-moz-placeholder { opacity: 1; -moz-transition: opacity .5s; transition: opacity .5s; } /* FF 4-18 */
::-moz-placeholder { opacity: 1; -moz-transition: opacity .5s; transition: opacity .5s; } /* FF 19-51 */
:-ms-input-placeholder { opacity: 1; -ms-transition: opacity .5s; transition: opacity .5s; } /* IE 10+ */
::placeholder { opacity: 1; transition: opacity .5s; } /* Modern Browsers */

*:focus::-webkit-input-placeholder { opacity: 0; } /* Chrome <=56, Safari < 10 */
*:focus:-moz-placeholder { opacity: 0; } /* FF 4-18 */
*:focus::-moz-placeholder { opacity: 0; } /* FF 19-50 */
*:focus:-ms-input-placeholder { opacity: 0; } /* IE 10+ */
*:focus::placeholder { opacity: 0; } /* Modern Browsers */

Editar: atualizado para oferecer suporte a navegadores modernos.

JamesWilson
fonte
6
A melhor solução CSS!
Fatih SARI
Bom e velho CSS ... ótima solução simples! Por que eu não pensei nisso?
JI-Web
40

você já tentou o espaço reservado attr?

<input id ="myID" type="text" placeholder="enter your text " />

-EDITAR-

Entendo, tente isso então:

$(function () {

    $('#myId').data('holder', $('#myId').attr('placeholder'));

    $('#myId').focusin(function () {
        $(this).attr('placeholder', '');
    });
    $('#myId').focusout(function () {
        $(this).attr('placeholder', $(this).data('holder'));
    });


});

Teste: http://jsfiddle.net/mPLFf/4/

-EDITAR-

Na verdade, como o espaço reservado deve ser usado para descrever o valor, não o nome da entrada. Sugiro a seguinte alternativa

html:

<label class="overlabel"> 
    <span>First Name</span>
    <input name="first_name" type="text" />
</label>

javascript:

$('.overlabel').each(function () {
    var $this = $(this);
    var field = $this.find('[type=text], [type=file], [type=email], [type=password], textarea');
    var span = $(this).find('> span');
    var onBlur = function () {
        if ($.trim(field.val()) == '') {
            field.val('');
            span.fadeIn(100);
        } else {
            span.fadeTo(100, 0);
        }
    };
    field.focus(function () {
        span.fadeOut(100);
    }).blur(onBlur);
    onBlur();
});

css:

.overlabel {
  border: 0.1em solid;
  color: #aaa;
  position: relative;
  display: inline-block;
  vertical-align: middle;
  min-height: 2.2em;
}
.overlabel span {
  position: absolute;
  left: 0;
  top: 0;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.overlabel span, .overlabel input {
  text-align: left;
  font-size: 1em;
  line-height: 2em;
  padding: 0 0.5em;
  margin: 0;
  background: transparent;
  -webkit-appearance: none; /* prevent ios styling */
  border-width: 0;
  width: 100%;
  outline: 0;
}

Teste:

http://jsfiddle.net/kwynwrcf/

Toni Michel Caubet
fonte
É bom ver o atributo de dados sendo usado. Mas eu olharia para o equivalente em CSS. Quando armazenado em cache, será uma solução mais rápida e pode ser global. O item acima precisa que o atributo data seja colocado em todos os elementos necessários. (resposta abaixo)
Neil
1
Isso é muito complicado. Pode ser feito com muito menos código.
JGallardo
@JGallardo me mostrar a luz (mas não tenho certeza se você viu que existem 3 soluções diferentes)
Toni Michel Caubet
19

Para aumentar a resposta de @ casey-chu e pirate rob, aqui está uma maneira mais compatível com vários navegadores:

    /* WebKit browsers */
input:focus::-webkit-input-placeholder { color:transparent; }

    /* Mozilla Firefox 4 to 18 */
input:focus:-moz-placeholder { color:transparent; }

    /* Mozilla Firefox 19+ */
input:focus::-moz-placeholder { color:transparent; }

    /* Internet Explorer 10+ */
input:focus:-ms-input-placeholder { color:transparent; }
Adrian Föder
fonte
Exatamente o que escrevi agora (em vez disso, usei opacity:0;)! A única solução CSS neste segmento com todos os suportes de navegador possíveis!
Re
11

A resposta de Toni é boa, mas eu prefiro largar o IDe usar explicitamente input, dessa forma, todas as entradas com placeholdero comportamento:

<input type="text" placeholder="your text" />

Observe que $(function(){ });é a abreviação de $(document).ready(function(){ });:

$(function(){
    $('input').data('holder',$('input').attr('placeholder'));
    $('input').focusin(function(){
        $(this).attr('placeholder','');
    });
    $('input').focusout(function(){
        $(this).attr('placeholder',$(this).data('holder'));
    });
})

Demo.

Wallace Sidhrée
fonte
3
Isso não funciona se você tiver mais de um campo. Aqui está a versão aprimorada do seu código jsfiddle.net/6CzRq/64
svlada
10

Eu gosto de empacotar isso no espaço de nome e executar em elementos com o atributo "placeholder" ...

$("[placeholder]").togglePlaceholder();

$.fn.togglePlaceholder = function() {
    return this.each(function() {
        $(this)
        .data("holder", $(this).attr("placeholder"))
        .focusin(function(){
            $(this).attr('placeholder','');
        })
        .focusout(function(){
            $(this).attr('placeholder',$(this).data('holder'));
        });
    });
};
martinedwards
fonte
5

Às vezes, você precisa de ESPECIFICIDADE para garantir que seus estilos sejam aplicados com o fator mais forte. idAgradecemos a @Rob Fletcher por sua ótima resposta. Em nossa empresa, usamos

Portanto, considere adicionar estilos prefixados com o ID do contêiner do aplicativo

    #app input:focus::-webkit-input-placeholder, #app  textarea:focus::-webkit-input-placeholder {
        color: #FFFFFF;
    }

    #app input:focus:-moz-placeholder, #app textarea:focus:-moz-placeholder {
        color: #FFFFFF;
    }

Mahdi Alkhatib
fonte
5

Com o CSS puro, funcionou para mim. Torne transparente quando Introduzido / Foca na entrada

 input:focus::-webkit-input-placeholder { /* Chrome/Opera/Safari */
    color: transparent !important;
 }
 input:focus::-moz-placeholder { /* Firefox 19+ */
   color: transparent !important;
 }
 input:focus:-ms-input-placeholder { /* IE 10+ */
   color: transparent !important;
 }
 input:focus:-moz-placeholder { /* Firefox 18- */
   color: transparent !important;
  }
Muhammad Bilawal
fonte
4

Para refinar ainda mais o exemplo de código de Wallace Sidhrée :

$(function()
{  
      $('input').focusin(function()
      {
        input = $(this);
        input.data('place-holder-text', input.attr('placeholder'))
        input.attr('placeholder', '');
      });

      $('input').focusout(function()
      {
          input = $(this);
          input.attr('placeholder', input.data('place-holder-text'));
      });
})

Isso garante que cada entrada armazene o texto correto do espaço reservado no atributo de dados.

Veja um exemplo de trabalho aqui em jsFiddle .

tom verdadeiro
fonte
4

Eu gosto da abordagem css temperada com transições. Em Foco, o espaço reservado diminui;) Funciona também para áreas de texto.

Obrigado @Casey Chu pela ótima idéia.

textarea::-webkit-input-placeholder, input::-webkit-input-placeholder { 
    color: #fff;
    opacity: 0.4;
    transition: opacity 0.5s;
    -webkit-transition: opacity 0.5s; 
}

textarea:focus::-webkit-input-placeholder, input:focus::-webkit-input-placeholder  { 
    opacity: 0;
}
Hexodus
fonte
4

Usando o SCSS junto com o http://bourbon.io/ , esta solução é simples, elegante e funciona em todos os navegadores da web:

input:focus {
  @include placeholder() {
    color: transparent;
  }
}

Use Bourbon! É bom para você !

Michael
fonte
3

Este pedaço de CSS funcionou para mim:

input:focus::-webkit-input-placeholder {
        color:transparent;

}
Alex Bondor
fonte
1
Essa é uma boa maneira de fazê-lo sem JQuery :)
tehX
3

Para uma solução pura baseada em CSS:

input:focus::-webkit-input-placeholder  {color:transparent;}
input:focus::-moz-placeholder   {color:transparent;}
input:-moz-placeholder   {color:transparent;}

Nota: Ainda não é suportado por todos os fornecedores de navegadores.

Referência: oculte o texto do espaço reservado em foco com CSS de Ilia Raiskin.

Toran Billups
fonte
2

HTML:

<input type="text" name="name" placeholder="enter your text" id="myInput" />

jQuery:

$('#myInput').focus(function(){
  $(this).attr('placeholder','');
});
$('#myInput').focusout(function(){
  $(this).attr('placeholder','enter your text');
});
Uffo
fonte
1
Isso assume apenas uma entrada.
nym 24/03/2015
2

2018> JQUERY v.3.3 SOLUÇÃO: Trabalhando globalmente para todas as entradas, área de texto com espaço reservado.

 $(function(){
     $('input, textarea').on('focus', function(){
        if($(this).attr('placeholder')){
           window.oldph = $(this).attr('placeholder');
            $(this).attr('placeholder', ' ');
        };
     });

     $('input, textarea').on('blur', function(){
       if($(this).attr('placeholder')){
            $(this).attr('placeholder', window.oldph);
         };
     }); 
});
Karel Sniper Žák
fonte
1

A demonstração está aqui: jsfiddle

Tente o seguinte:

//auto-hide-placeholder-text-upon-focus
if(!$.browser.webkit){
$("input").each(
        function(){
            $(this).data('holder',$(this).attr('placeholder'));
            $(this).focusin(function(){
                $(this).attr('placeholder','');
            });
            $(this).focusout(function(){
                $(this).attr('placeholder',$(this).data('holder'));
            });

        });

}
Suresh Pattu
fonte
use $ ("input [espaço reservado]") para selecionar apenas os campos que possuem um atributo de espaço reservado.
Silkster
Esta é a melhor resposta, simples e desmarca os outros quando fora de foco
JGallardo
1

para entrada

input:focus::-webkit-input-placeholder { color:transparent; }
input:focus:-moz-placeholder { color:transparent; }

para textarea

textarea:focus::-webkit-input-placeholder { color:transparent; }
textarea:focus:-moz-placeholder { color:transparent; }
Wagh
fonte
1
$("input[placeholder]").focusin(function () {
    $(this).data('place-holder-text', $(this).attr('placeholder')).attr('placeholder', '');
})
.focusout(function () {
    $(this).attr('placeholder', $(this).data('place-holder-text'));
});
OsBen
fonte
1
$("input[placeholder]").each(function () {
    $(this).attr("data-placeholder", this.placeholder);

    $(this).bind("focus", function () {
        this.placeholder = '';
    });
    $(this).bind("blur", function () {
        this.placeholder = $(this).attr("data-placeholder");
    });
});
hadi
fonte
0

Além de tudo acima, tenho duas idéias.

Você pode adicionar um elemento que imita o palceholder.Em seguida, usando o javascript, controle o elemento que está sendo exibido e oculto.

Mas é tão complexo que o outro está usando o seletor de cs do irmão.

.placeholder { position: absolute; font-size: 14px; left: 40px; top: 11px; line-height: 1; pointer-events: none; }
.send-message input:focus + .placeholder { display: none; } 

23333, eu tenho um inglês ruim.Espero resolver seu problema.

dufemeng
fonte
Verifique este URL ; será útil melhorar a qualidade do seu conteúdo;
Willie Cheng
0

tente esta função:

+ Esconde o PlaceHolder no foco e retorna de volta no desfoque

+ Esta função depende do seletor de espaço reservado, primeiro ele seleciona os elementos com o atributo de espaço reservado, dispara uma função no foco e outra no desfoque.

em foco: ele adiciona um atributo "data-text" ao elemento que obtém seu valor do atributo placeholder e remove o valor do atributo placeholder.

no desfoque: retorna o valor do espaço reservado e o remove do atributo data-text

<input type="text" placeholder="Username" />
$('[placeholder]').focus(function() {
    $(this).attr('data-text', $(this).attr('placeholder'));
    $(this).attr('placeholder', '');
  }).blur(function() {
      $(this).attr('placeholder', $(this).attr('data-text'));
      $(this).attr('data-text', '');
  });
});

você pode me seguir muito bem se observar o que está acontecendo nos bastidores, inspecionando o elemento de entrada

Wael Assaf
fonte
0

A mesma coisa que apliquei no angular 5.

eu criei uma nova string para armazenar espaço reservado

newPlaceholder:string;

então eu usei as funções de foco e desfoque na caixa de entrada (estou usando o preenchimento automático de prime).

O marcador de posição acima está sendo definido a partir do texto datilografado

Estou usando duas funções -

/* Event fired on focus to textbox*/
Focus(data) {
    this.newPlaceholder = data.target.placeholder;
    this.placeholder = '';
}
/* Event fired on mouse out*/
Blur(data) {
    this.placeholder = this.newPlaceholder;
}
Rohit Grover
fonte
0

Não há necessidade de usar CSS ou JQuery. Você pode fazer isso diretamente da tag de entrada HTML.

Por exemplo , na caixa de email abaixo, o texto do espaço reservado desaparecerá após clicar dentro e o texto aparecerá novamente se clicar fora.

<input type="email" placeholder="Type your email here..." onfocus="this.placeholder=''" onblur="this.placeholder='Type your email here...'">
Saiful Islam
fonte
-1
/* Webkit */
[placeholder]:focus::-webkit-input-placeholder { opacity: 0; }
/* Firefox < 19 */
[placeholder]:focus:-moz-placeholder { opacity: 0; }
/* Firefox > 19 */
[placeholder]:focus::-moz-placeholder { opacity: 0; }
/* Internet Explorer 10 */
[placeholder]:focus:-ms-input-placeholder { opacity: 0; }
maPer77
fonte
Esta resposta é idêntica a uma resposta anterior. Se você tem algo a acrescentar ou melhorar, sugira uma edição da resposta original.
JonathanDavidArndt