283 votes

Insérer un retour à la ligne dans l'attribut placeholder d'un textarea ?

J'ai essayé plusieurs approches mais aucune n'a fonctionné. Quelqu'un connaît-il un truc astucieux pour contourner ce problème ?

<textarea placeholder='This is a line \n this should be a new line'></textarea>

<textarea placeholder='This is a line     
should this be a new line?'></textarea> <!-- this works in chrome apparently -->

MISE À JOUR : Il ne fonctionne pas dans chrome. C'était juste la largeur de la zone de texte.

Voir : http://jsfiddle.net/pdXRx/

2 votes

Si vous utilisez PHP, vous pouvez mettre <?="\n"?> comme une nouvelle ligne

78 votes

Il suffit d'ajouter &#10; dans l'attribut placeholder, comme <textarea placeholder="This is a line&#10;This is another one"></textarea> . La réponse se trouve ci-dessous.

4 votes

@lu1s cela fonctionne dans Chrome, IE mais pas dans Firefox et Safari.

469voto

lu1s Points 551

Vous pouvez insérer une nouvelle ligne de l'entité html &#10; dans l'attribut de l'espace réservé :

<textarea name="foo" placeholder="hello you&#10;Second line&#10;Third line"></textarea>

Fonctionne sur : Chrome 62, IE10, Firefox 60

Ne fonctionne pas sur : Safari 11

https://jsfiddle.net/lu1s/bxkjLpag/2/

9 votes

Il fait exactement ce que la question originale demandait. pourquoi n'est-il pas voté plus haut ? ne fonctionne-t-il pas dans tous les navigateurs ?

10 votes

@DaveAlger - En effet, il ne l'est pas. Je viens de l'essayer dans FF et il imprime le message suivant &#10; littéralement, sans produire de caractère d'espacement. Voir developer.mozilla.org/fr/HTML/HTML5/

0 votes

@MerlynMorgan-Graham @DaveAlger vous avez raison. S'il n'y a pas de cross-browser, ce n'est peut-être pas une bonne idée de le mettre en œuvre. Mais il est certain que vous pouvez ajouter un petit javascript pour remplacer la balise &#10; de l'espace réservé et les convertir en \n et les passer à l'attribut value de l'élément textarea. Enfin, remplacez l'espace réservé par une chaîne vide.

73voto

Patrick Points 1531

MISE À JOUR (janvier 2016) : Cette petite astuce ne fonctionne peut-être plus sur tous les navigateurs. J'ai donc une nouvelle solution avec un petit bout de javascript ci-dessous.


Un petit truc sympa

Ce n'est pas agréable, mais vous pouvez simplement mettre les nouvelles lignes dans le html. Comme ceci :

<textarea rows="6" id="myAddress" type="text" placeholder="My Awesome House,
1 Long St
London
Postcode
UK"></textarea>

Remarquez que chaque ligne est sur une nouvelle ligne (non enveloppée) et que chaque retrait de " tabulation " est de 4 espaces. Je reconnais que ce n'est pas une méthode très agréable, mais elle semble fonctionner :

http://jsfiddle.net/01taylop/HDfju/

  • Il est probable que le niveau de retrait de chaque ligne varie en fonction de la largeur de votre zone de texte.
  • Il est important d'avoir resize: none; dans le css pour que la taille de la zone de texte soit fixe (voir jsfiddle).

Ou bien Lorsque vous voulez une nouvelle ligne, appuyez deux fois sur la touche retour (pour qu'il y ait une ligne vide entre vos "nouvelles lignes"). Cette "ligne vide" doit comporter suffisamment de tabulations/espaces pour correspondre à la largeur de votre zone de texte. Le fait d'en avoir beaucoup trop n'a pas d'importance, il faut juste en avoir assez. Mais c'est tellement sale et probablement pas compatible avec les navigateurs. J'aimerais qu'il y ait un moyen plus simple !


Une meilleure solution

Consultez le JSFiddle .

  • Cette solution permet de positionner un div derrière la zone de texte.
  • Un certain javascript est utilisé pour modifier la couleur d'arrière-plan de la zone de texte, ce qui permet de masquer ou de révéler l'espace réservé de manière appropriée.
  • Les entrées et les espaces réservés doivent avoir la même taille de police, d'où les deux mixins.
  • El box-sizing y display: block Les propriétés du textarea sont importantes, sinon le div qui se trouve derrière n'aura pas la même taille.
  • Réglage de resize: vertical et un min-height sur la zone de texte sont également importants - remarquez comment le texte de l'espace réservé s'enroule et comment l'expansion de la zone de texte conserve le fond blanc. Cependant, la mise en commentaire de l'élément resize causera des problèmes lors de l'expansion horizontale de la zone de texte.
  • Assurez-vous simplement que la hauteur minimale de la zone de texte est suffisante pour couvrir l'ensemble de votre espace réservé dans sa plus petite largeur.

JSFiddle Screenshot

HTML :

<form>
  <input type='text' placeholder='First Name' />
  <input type='text' placeholder='Last Name' />
  <div class='textarea-placeholder'>
    <textarea></textarea>
    <div>
      First Line
      <br /> Second Line
      <br /> Third Line
    </div>
  </div>
</form>

SCSS :

$input-padding: 4px;

@mixin input-font() {
  font-family: 'HelveticaNeue-Light', 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;
  font-size: 12px;
  font-weight: 300;
  line-height: 16px;
}

@mixin placeholder-style() {
  color: #999;
  @include input-font();
}

* {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
}

form {
  width: 250px;
}

input,textarea {
  display: block;
  width: 100%;
  padding: $input-padding;
  border: 1px solid #ccc;
}

input {
  margin-bottom: 10px;
  background-color: #fff;

  @include input-font();
}

textarea {
  min-height: 80px;
  resize: vertical;
  background-color: transparent;
  &.data-edits {
    background-color: #fff;
  }
}

.textarea-placeholder {
  position: relative;
  > div {
    position: absolute;
    z-index: -1;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    padding: $input-padding;
    background-color: #fff;
    @include placeholder-style();
  }
}

::-webkit-input-placeholder {
  @include placeholder-style();
}
:-moz-placeholder {
  @include placeholder-style();
}
::-moz-placeholder {
  @include placeholder-style();
}
:-ms-input-placeholder {
  @include placeholder-style();
}

Javascript :

$("textarea").on('change keyup paste', function() {
  var length = $(this).val().length;
  if (length > 0) {
    $(this).addClass('data-edits');
  } else {
    $(this).removeClass('data-edits');
  }
});

0 votes

Un hack très mignon. Cela fonctionne définitivement dans Chrome. Pouvons-nous confirmer qu'il fonctionne de la même manière dans les autres principaux navigateurs ?

2 votes

J'aimerais que quelqu'un le teste dans IE. Je peux confirmer qu'il fonctionne sur les versions les plus récentes de Safari et Chrome mais certainement pas sur Firefox. J'utilise maintenant du texte au lieu d'un espace réservé et j'ai une classe css pour que le texte ressemble à un espace réservé. Puis une petite fonction jQuery pour effacer le texte lorsqu'il a le focus - ou le remettre si vide !

2 votes

Fonctionne bien dans Chrome et IE 11. Mais ne fonctionne pas dans Firefox et le navigateur par défaut d'Android.

65voto

Tieson T. Points 8972

Je ne pense pas que vous ayez le droit de faire ça : http://www.w3.org/TR/html5/forms.html#the-placeholder-attribute

Le contenu pertinent (c'est moi qui souligne) :

L'attribut placeholder représente un court un indice (un mot ou une courte phrase) destiné à aider l'utilisateur à saisir des données lorsque le contrôle n'a pas de valeur. aucune valeur. Il peut s'agir d'un exemple de valeur ou d'une brève description du format attendu. format attendu. L'attribut, s'il est spécifié, doit avoir une valeur qui ne doit pas contenir de caractères U+000A LINE FEED (LF) ou U+000D CARRIAGE RETURN (CR). de caractères.

0 votes

@amosrivera Hmm. Eh bien, les vendeurs sont autorisés à interpréter les spécifications de la manière qu'ils jugent la plus appropriée.

10 votes

Im a tool, cela ressemblait à une rupture de ligne mais en fait c'était juste le placeholder qui s'enroulait autour de la largeur du textarea

3 votes

@amosrivera LOL, au moins tu peux en rire, non ? Rien de perdu à essayer... :]

59voto

Jason Gennaro Points 20848

Ce que vous pourriez faire, c'est ajouter le texte comme value qui respecte le saut de ligne \n .

$('textarea').attr('value', 'This is a line \nthis should be a new line');

Ensuite, vous pourriez l'enlever sur focus et le réappliquer (s'il est vide) sur blur . Quelque chose comme ceci

var placeholder = 'This is a line \nthis should be a new line';
$('textarea').attr('value', placeholder);

$('textarea').focus(function(){
    if($(this).val() === placeholder){
        $(this).attr('value', '');
    }
});

$('textarea').blur(function(){
    if($(this).val() ===''){
        $(this).attr('value', placeholder);
    }    
});

Exemple : http://jsfiddle.net/airandfingers/pdXRx/247/

Pas de CSS pur et pas de nettoyer mais fait l'affaire.

6 votes

Je pourrais certainement simuler l'effet placeholder en utilisant javascript, mais j'espérais quelque chose de plus simple

2 votes

Malheureusement, @amosrivera, il ne semble pas y avoir de méthode standard : developer.mozilla.org/fr/HTML/HTML5/ autre qu'un script de contournement.

3 votes

Bonne solution, mais j'ajouterais if($(this).val() == 'This is...') au focus sinon, si vous ajoutez du texte, puis perdez le focus, puis cliquez à nouveau sur la zone de texte, votre texte disparaît.

15voto

zvona Points 4154

Que diriez-vous d'une solution CSS ? http://cssdeck.com/labs/07fwgrso

::-webkit-input-placeholder::before {
  content: "FIRST\000ASECOND\000ATHIRD";
}

::-moz-placeholder::before {
  content: "FIRST\000ASECOND\000ATHIRD";
}

:-ms-input-placeholder::before {
  content: "FIRST\000ASECOND\000ATHIRD";
}

2 votes

C'est la meilleure solution de toutes celles qui sont énumérées ici, selon moi.

0 votes

Cette solution ne fonctionne pas dans Firefox (testé sur 22.0-28.0b9).

0 votes

@Hartwig J'ai en fait remarqué la même chose. Pour une raison quelconque, Firefox ne gère pas cela correctement. En fait, cela ne fonctionne pas non plus sur IE ==> malheureusement, c'est uniquement WebKit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X