Forme inhabituelle d'une zone de texte?


273

Habituellement, les zones de texte sont rectangulaires ou carrées, comme ceci:

Zone de texte habituelle

Mais je veux une zone de texte personnalisée, comme celle-ci, par exemple:

Zone de texte personnalisée

Comment est-ce possible?


45
Bienvenue sur le trope web le plus utilisé au cours des trois prochaines années!
l0b0

24
Complètement sans rapport: Puis-je vous demander dans quel contexte vous prévoyez d'utiliser cela? Je veux dire, je ne peux pas vraiment imaginer un scénario dans lequel cela serait utile, alors j'aimerais avoir de l'inspiration à ce sujet.
user98085

23
Tout le monde manque un problème critique . Utiliser un <div>pour stocker du texte n'est pas une bonne solution. Cela peut aider à la conception et peut même être acceptable pour le texte en lecture seule (ce qui va complètement à l'encontre du but de contenteditable), mais ce n'est pas bon pour la saisie de texte d'un utilisateur. Un div (même un contenu modifiable) n'est pas un élément d'entrée standard comme un élément de formulaire normal, par conséquent, il ne sera pas traité comme tel, et donc son contenu ne sera pas enregistré par les navigateurs en cas de plantage. L'utilisation d'un div entraîne une perte de données . Voir cet exemple .
Synetech

3
En fait, cela devrait être clos car "Démontré une compréhension minimale du problème résolu"
M. Alien

9
Alors, où voulez-vous voir la barre de défilement verticale?
Rob W

Réponses:


262

introduction

Premièrement, il existe de nombreuses solutions, proposées dans d'autres articles. Je pense que celui-ci est actuellement (en 2013) celui qui peut être compatible avec le plus grand nombre de navigateurs, car il n'a pas besoin de propriétés CSS3. Cependant, la méthode ne fonctionnera pas sur les navigateurs qui ne prennent pas en charge contentdeditable , soyez prudent.

Solution avec un div contenteditable

Comme proposé par @Getz , vous pouvez utiliser un div avec contenteditablepuis le façonner avec un peu de div dessus. Voici un exemple, avec deux blocs qui flottent en haut à gauche et en haut à droite de la div principale:

Le résultat avec Firefox 28

Comme vous pouvez le voir, vous devez jouer un peu avec les bordures si vous voulez le même résultat que celui demandé dans votre post. Le div principal a la bordure bleue de chaque côté. Ensuite, les blocs rouges doivent être collés pour masquer les bordures supérieures de la division principale, et vous devez leur appliquer une bordure uniquement sur des côtés particuliers (en bas et à gauche pour le bloc de droite, en bas et à droite pour la gauche).

Après cela, vous pouvez obtenir le contenu via Javascript, lorsque le bouton " Soumettre " est déclenché par exemple. Et je pense que vous pouvez également gérer le reste du CSS ( font-size, color, etc.) :)

Exemple de code complet

.block_left {
  background-color: red;
  height: 70px;
  width: 100px;
  float: left;
  border-right: 2px solid blue;
  border-bottom: 2px solid blue;
}

.block_right {
  background-color: red;
  height: 70px;
  width: 100px;
  float: right;
  border-left: 2px solid blue;
  border-bottom: 2px solid blue;
}

.div2 {
  background-color: white;
  font-size: 1.5em;
  border: 2px solid blue;
}

.parent {
  height: 300px;
  width: 500px;
}
<div class="parent">
  <div class="block_left"></div>
  <div class="block_right"></div>
  <div class="div2" contenteditable="true">
    "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut..."
  </div>
</div>


1
Excellente solution , mais avec un bug: You can't apply a border color for the editable section keeping the two corner div's background-color:white. N'est-ce pas? Pourtant, cela va gagner. +1
Rajesh Paul

3
Je ne vois pas le problème. Il est possible de définir une couleur d'arrière-plan: blanc sur ceci: jsfiddle.net/qgfP6/6 . Mais, vous devez définir un arrière-plan, sinon de mauvaises choses se sont produites: jsfiddle.net/qgfP6/7 (vous pouvez voir la bordure du conteneur parent ...)
Maxime Lorant

1
Il existe cependant une solution de contournement nécessitant plus de divs. L'élément parrent qui est transparent et sans bordure, rempli de divisions se chevauchant avec des bordures et des arrière-plans ET avec des divisions de remplissage pour créer l'effet souhaité.
Qwerty

@MaximeLorant Je ne parlais que de ceux- bad thingslà. Ce seraient les effets secondaires de la situation que je viens de poser et de ce que vous avez fait au violon. Mais c'est certainement une très bonne solution. Merci pour la clarification.
Rajesh Paul

1
Réponse brillante! Et ici, j'allais suggérer quelque chose dans le sens de l'utilisation de deux zones de texte rapprochées avec un contenu divisé entre les deux.
Zarathuztra

115

Dans un avenir proche, nous pouvons utiliser ce qu'on appelle css-shapespour y parvenir. Un div avec l' contenteditableattribut défini sur truecombiné avec css-shapespeut créer une zone de texte de n'importe quel type de forme.

Actuellement, Chrome Canary est déjà compatible css-shapes . Un exemple de ce qui est possible avec les formes css est:

entrez la description de l'image ici

Ici, ils utilisent une forme de polygone pour définir le flux de texte. Il devrait être possible de créer deux polygones pour correspondre à la forme souhaitée pour votre zone de texte.

Plus d'informations css-shapesont été écrites sur: http://sarasoueidan.com/blog/css-shapes/

Pour activer les formes CSS dans Chrome Canary:

  1. Copiez et collez chrome: // flags / # enable-experimental-web-platform-features dans la barre d'adresse, puis appuyez sur entrée.
  2. Cliquez sur le lien «Activer» dans cette section.
  3. Cliquez sur le bouton «Relancer maintenant» au bas de la fenêtre du navigateur.

    à partir de: http://html.adobe.com/webplatform/enable/

.container {
  overflow: hidden;
  shape-inside: polygon(200.67px 198.00px, 35.33px 198.47px, 34.67px 362.47px, 537.00px 362.74px, 535.67px 196.87px, 388.33px 197.00px, 386.67px 53.53px, 201.33px 53.53px);
  font-size: 0.8em;
}
/** for red border **/

.container:before {
  content: '';
  position: absolute;
  top: 8px;
  left: 8px;
  width: 190px;
  height: 190px;
  background-color: white;
  border-right: 1px solid red;
  border-bottom: 1px solid red;
}
.container:after {
  content: '';
  position: absolute;
  top: 8px;
  right: 8px;
  width: 190px;
  height: 190px;
  background-color: white;
  border-left: 1px solid red;
  border-bottom: 1px solid red;
}
<div class="container" contenteditable="true">
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque convallis diam lacus, id lacinia quam interdum quis. Ut vitae dignissim lorem, nec lobortis turpis. Fusce non fringilla nulla, eu blandit urna. Nulla facilisi. Nunc tristique, mauris vitae
  tincidunt egestas, eros metus dapibus sapien, quis tincidunt sem dui ac purus. Morbi lobortis, quam sit amet consequat aliquam, elit mi rutrum erat, id tempus turpis turpis et sem. Vivamus tempor mollis porttitor. Sed elementum nisl sit amet sapien
  auctor imperdiet. Sed suscipit convallis nisi, in dignissim risus placerat suscipit. Sed vel lorem eu massa vulputate pretium. Nulla eget dolor sed elit gravida condimentum non vel lorem. Vivamus pretium, augue sed aliquet ultricies, neque nibh porttitor
  libero, a tristique elit mi eu nibh. Vestibulum erat arcu, condimentum eleifend adipiscing ut, euismod eu libero. In pharetra iaculis lorem, at consectetur nisi faucibus eu.

</div>

Polygone créé avec: http://betravis.github.io/shape-tools/polygon-drawing/

Résultat

entrez la description de l'image ici

http://jsfiddle.net/A8cPj/1/


Le violon et l'exemple n'ont pas fonctionné pour moi. Le texte passe sous le polygone et reste caché en dessous. J'ai testé avec Chromium 49, Firefox 44
deathangel908

Je viens de voir cela, ce sera un cauchemar pour le rendre réactif.
damiano celent

62

Peut-être que c'est possible avec Content Editable ?

Ce n'est pas une zone de texte, mais si vous réussissez à créer un div avec cette forme, cela pourrait fonctionner.

Je pense que ce n'est pas possible avec juste une zone de texte ...

Un petit exemple: http://jsfiddle.net/qgfP6/5/

<div contenteditable="true">
</div>

23

Vous pouvez travailler avec un div contentable, avec deux div coins:

<div style="border:1px blue solid ; width: 200px; height: 200px;" contenteditable="true">
  <div style="float:left; width:50px; height: 50px; border: 1px solid blue" contenteditable="false"></div>
  <div style="float:right; width:50px; height: 50px;  border: 1px solid blue" contenteditable="false"></div>
  hello world, hello worldsdf asdf asdf sdf asdf asdf
</div>

Il a besoin de plus de travail JS pour prendre en charge tous les différents cas d'utilisation. Mais la base est là.
Gidon

20

Vous pouvez également le faire avec les régions CSS

Avec les régions, vous pouvez utiliser les propriétés CSS pour transférer le contenu dans des conteneurs stylisés existants, en spécifiant l'ordre des conteneurs que vous choisissez, quelle que soit leur position sur la page.

(Plateforme Web)

entrez la description de l'image ici

[Actuellement pris en charge dans WebKit Nightly, Safari 6.1+ et iOS7 et déjà utilisable dans Chrome et Opera après avoir activé l'indicateur: enable-experimental-web-platform-features - caniuse , Web Platform ]

VIOLON

Vous pouvez donc créer cette forme de zone de texte en faisant passer le texte à travers 2 régions et en le modifiant en ajoutant contenteditable sur le contenu.

Marquage

<div id="box-a" class="region"></div>
<div id="box-b" class="region"></div>
<div id="content" contenteditable>text here</div>

(Pertinent) CSS

#content {
     -ms-flow-into: article;
    -webkit-flow-into: article;
}

.region {
    -ms-flow-from: article;
    -webkit-flow-from: article;
    box-sizing: border-box;
    position: absolute;
    width: 200px;
    height: 200px;
    padding: 0 1px;
    margin: auto;
    left:0;right:0;
    border: 2px solid lightBlue;
}

#box-a {
    top: 10px;
    background: #fff;
    z-index: 1;
    border-bottom: none;
}

#box-b {
    top: 210px;
    width: 400px;
    overflow: auto;
    margin-top: -2px;
}

Le résultat:

entrez la description de l'image ici

Pour plus d'informations sur les régions - voici un bon article: régions CSS3: mise en page riche avec HTML et CSS3


1
Agréable! Bien qu'il soit à peine pris en charge (la plupart des utilisateurs ne veulent pas avoir à obtenir Chrome Canary et activer des drapeaux expérimentaux pour utiliser un site Web), c'est certainement la façon dont cela «devrait» être fait
Markasoftware

En effet ... Malheureusement, cela ne fonctionne pas encore sur Firefox (même sur Alpha) et autres, et a une mauvaise odeur de préfixes de fournisseurs :( Mais la méthode est intéressante et doit être utilisée dans quelques mois / années.
Maxime Lorant

régions css, formes css, filtres css ... qu'est-ce qu'il y a d'autre ik
Muhammad Umer

@MuhammadUmer ... exclusions css
Danield

18

Une longue ligne de texte dans la boîte laissera tomber le curseur au-delà des bords du milieu et je n'arrive pas à résoudre ce problème.

**[Fiddle Diddle][1]**

    #wrap {
        overflow: hidden;
    }
    #inner {
        height: 350px;
        width: 500px;
        border: 1px solid blue;
    }
    #textContent {
        word-wrap: break-word;
        word-break: break-all;
        white-space: pre-line;
    }
    #left, #right {
        height: 50%;
        width: 25%;
        margin-top: -1px;
        padding: 0;
        border: 1px solid blue;
        border-top-color: white;
        margin-bottom: 5px;
    }
    #right {
        margin-left: 5px;
        float: right;
        margin-right: -1px;
        border-right-color: white;
    }
    #left {
        margin-right: 5px;
        float: left;
        margin-left: -1px;
        border-left-color: white;
    }
<div id="wrap">
  <div id="inner">
     <div id="left"></div>
     <div id="right"></div>
     <span id="textContent" contenteditable>The A B Cs</span>
  </div>
</div>

[1]: http://jsfiddle.net/yKSZV/

8

Ce n'est pas possible sire! Une zone de texte est généralement une zone rectangulaire ou carrée, où vous pouvez taper.

Cependant, pour faire quelque chose comme ça, vous pouvez utiliser 2 zones de texte et leur donner une largeur et une hauteur spécifiées. Sinon, je ne pense pas que ça va arriver!

La deuxième méthode consisterait à créer un élément modifiable.

http://jsfiddle.net/afzaal_ahmad_zeeshan/at2ke/

Le code est:

<div contenteditable="true">
   This text can be edited by the user.
</div>

En utilisant cela, vous pouvez rendre n'importe quel élément modifiable! Vous pouvez lui donner des dimensions et ça marchera! Vous l'obtiendrez comme une zone de texte.

Référence: https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_Editable


3
Non vous vous trompez. Même il a utilisé divs au lieu de textarea. Parce que la zone de texte ne peut pas être modifiée en forme! :) @Markasoftware Vous vous trompez donc lors du vote en aval de cette réponse! .. puisque c'est juste la même réponse que la sienne. La seule chose qui n'est pas présente ici est l'image et le code pour faire le div modifiable avec cette forme!
Afzaal Ahmad Zeeshan

Quoi? Oh allez frère, si tu veux me garder sous-voté sans raison, tu es le bienvenu! Ma réponse a été publiée à: 9h58, il a posté la réponse à 10h10: / J'ai été le premier à répondre à cette question .. @ Markasoftware vous pouvez aller voir le temps par vous-même. Je ne suis pas beaucoup voté parce que je n'ai pas fourni le code. Cependant, j'ai posté la réponse dans le TOP 3 des réponses ..
Afzaal Ahmad Zeeshan

lol en fait quand je vais dans l'onglet "le plus ancien", cela montre que votre réponse est la deuxième plus ancienne
markasoftware

C'est à cause du fait qu'il n'est pas beaucoup voté! Je suis à chaque fois actif ici, alors comment poster récemment? Et celui-ci était une simple réponse. Pouvez-vous donc supprimer le downvote? :)
Afzaal Ahmad Zeeshan

5

Si vous combinez des formes CSS avec contenteditablecela, cela peut être fait dans les navigateurs webkit.

Vous devez d'abord activer le drapeau: enable-experimental-web-platform-features

Redémarrez ensuite votre navigateur webkit et vérifiez ce FIDDLE !

Cette méthode fonctionnera également pour les formes non standard.

Marquage

 <div class="shape" contenteditable="true">
    <p>
     Text here
    </p>
  </div>

CSS

.shape{
  -webkit-shape-inside: polygon(71.67px 204.00px,75.33px 316.47px,323.67px 315.47px,321.17px 196.00px,245.96px 197.88px,244.75px 87.76px,132.33px 87.53px,132.50px 202.26px);
  shape-inside: polygon(71.67px 204.00px,75.33px 316.47px,323.67px 315.47px,321.17px 196.00px,245.96px 197.88px,244.75px 87.76px,132.33px 87.53px,132.50px 202.26px);
  width: 400px;
  height: 400px;
  text-align: justify;
  margin: 0 auto;
}

Alors, comment diable ai-je obtenu cette forme de polygone?

Allez sur ce site et faites votre propre forme personnalisée!

Remarques sur l'activation du drapeau: (à partir d' ici )

Pour activer les modes Formes, Régions et Fusion:

Copiez et collez chrome: // flags / # enable-experimental-web-platform-features dans la barre d'adresse, puis appuyez sur entrée. Cliquez sur le lien «Activer» dans cette section. Cliquez sur le bouton «Relancer maintenant» au bas de la fenêtre du navigateur.


4
+1 pour une solution (bien documentée, structurée), qu'elle soit standard ou non.
rolfl du

3
@kinokijuf Vous vous rendez compte que c'est ainsi que les normes se présentent de nos jours, non? Dans ce cas, Adobe a proposé la forme, et Webkit a été le premier à la mettre en œuvre jusqu'à présent. Étant donné que le projet de l'éditeur est de novembre, cela ne peut probablement pas être appelé une extension propriétaire, et pour autant que vous le sachiez, il sera plus largement implémenté et standardisé plus tard. En attendant, les utilisateurs non-Webkit obtiendront un rectangle, ce qui est important. (Heck, Firefox nécessite toujours un préfixe pour box-sizing.)
millimoose

5

Vous pouvez utiliser l' outil de conception de sites Web Google pour créer des formes complexes à l'aideHTML5-canvas and CSS .

De plus, vous obtiendrez d'autres outils comme des outils de saisie pour saisir des textes à l'intérieur de ces formes.

Comme le fichier de sortie contient beaucoup de code, fournir un violon d'un exemple de démonstration créé à l'aide de l' outil Google Web Designer

FIDDLE DEMO >>


1
Fiddle ne fonctionne pas pour moi (= le texte n'est pas modifiable) sur Chrome 31.0 / Windows 7.
Ilmari Karonen

@IlmariKaronen = le texte n'est pas modifiable ??? vraiment je n'ai pas compris. Quel est le besoin de le rendre modifiable ??
Prasanth KC

5
La question demande quelque chose comme un <textarea>(c'est-à-dire une boîte de texte modifiable), mais avec une forme non rectangulaire. Sans la partie «modifiable», il n'y a pas de grand défi ici - les gens font du texte en HTML depuis l'introduction des images flottantes en HTML 2.0.
Ilmari Karonen

Fiddle mis à jour avec une propriété modifiable de contenu. Le texte à l'intérieur du conteneur est désormais modifiable.
Prasanth KC

Dans la démo, je peux éditer 2 textes différents, pas 1 texte entier. In Chrome 31.
Nicolas Barbulesco

1

Si, pour une raison quelconque, vous avez vraiment besoin de prendre en charge des navigateurs qui n'en ont pas contenteditable, vous pouvez probablement faire la même chose en JavaScript, en utilisant des événements, bien que ce soit une solution très compliquée.

Pseudocode:

focused=false;
when user clicks the div
    {
    focused=true;
    }
when user clicks outside the div
    {
    focused=false;
    }
when user presses a key
    {
    if (focused)
    {
    add character of key to div.innerHTML;
    }
    }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.