Forma insolita di una textarea?


273

Di solito le textareas sono rettangolari o quadrate, in questo modo:

Area di testo usuale

Ma voglio un'area di testo personalizzata, come questa, ad esempio:

Textarea di forma personalizzata

Com'è possibile?


45
Benvenuti nel tropo Web più abusato per i prossimi tre anni!
l0b0

24
Completamente indipendente: posso chiederti in quale contesto stai pianificando di utilizzarlo? Voglio dire, non riesco davvero a immaginare uno scenario in cui questo sarebbe utile, quindi mi piacerebbe un po 'di ispirazione.
user98085

23
A tutti manca un problema critico . L'uso di a <div>per memorizzare il testo non è una buona soluzione. Può aiutare a progettare e potrebbe anche essere accettabile per il testo di sola lettura (che non soddisfa completamente lo scopo di contenteditable), ma non è buono per l'inserimento di testo da parte di un utente. Un div (anche un contenteditable) non è un elemento di input standard come un normale elemento di modulo, pertanto non verrà trattato come uno e quindi i suoi contenuti non verranno salvati dai browser in caso di crash. L'uso di un div comporta la perdita di dati . Vedere questo esempio .
Synetech,

3
In realtà questo dovrebbe essere chiuso come "Dimostrato una minima comprensione del problema che si sta risolvendo"
Mr. Alien,

9
Quindi, dove vuoi vedere la barra di scorrimento verticale?
Rob W,

Risposte:


262

introduzione

Innanzitutto, ci sono molte soluzioni, proposte in altri post. Penso che questo sia attualmente (nel 2013) quello che può essere compatibile con il maggior numero di browser, perché non ha bisogno di alcuna proprietà CSS3. Tuttavia, il metodo non funzionerà su browser che non supportano contentdeditable , fai attenzione.

Soluzione con un div contenteditable

Come proposto da @Getz , puoi usare un div con contenteditablee quindi modellarlo con qualche div su di esso. Ecco un esempio, con due blocchi che galleggiano in alto a sinistra e in alto a destra del div principale:

Il risultato con Firefox 28

Come puoi vedere, devi giocare un po 'con i bordi se vuoi lo stesso risultato che hai richiesto nel tuo post. Il div principale ha il bordo blu su ogni lato. Successivamente, i blocchi rossi devono essere incollati per nascondere i bordi superiori del div principale e devi applicare il bordo solo su lati particolari (in basso e a sinistra per il blocco destro, basso e a destra per il sinistro).

Successivamente, puoi ottenere il contenuto tramite Javascript, quando il " viene attivato il pulsante Invia ". E penso che tu possa anche gestire il resto del CSS ( font-size,color , ecc) :)

Esempio di codice completo

.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
Grande soluzione, ma con un bug: You can't apply a border color for the editable section keeping the two corner div's background-color:white. No? Tuttavia questo vincerà. +1
Rajesh Paul,

3
Non vedo il problema. È possibile impostare un colore di sfondo: bianco su questo: jsfiddle.net/qgfP6/6 . Ma devi impostare uno sfondo, altrimenti accadono cose brutte: jsfiddle.net/qgfP6/7 (puoi vedere il bordo del contenitore padre ...)
Maxime Lorant il

1
C'è una soluzione che richiede più div, però. L'elemento parrent che è trasparente e senza bordo, riempito con div sovrapposti con bordi e sfondi E con div imbottiti per creare l'effetto desiderato.
Qwerty,

@MaximeLorant di cui parlavo bad thingssolo quelli . Questi sarebbero gli effetti collaterali della situazione che ho appena chiesto e cosa hai fatto nel violino. Ma è sicuramente un'ottima soluzione. Grazie per il chiarimento.
Rajesh Paul,

1
Risposta brillante! E qui stavo per suggerire qualcosa sulla falsariga di usare due aree di testo vicine insieme a un contenuto diviso tra le due.
Zarathuztra,

115

Nel prossimo futuro possiamo usare il cosiddetto css-shapesper raggiungere questo obiettivo. Un div con l' contenteditableattributo impostato su truecombinato con css-shapespuò rendere un'area di testo qualsiasi tipo di forma.

Attualmente Chrome Canary supporta già css-shapes. Un esempio di ciò che è possibile con css-shapes è:

inserisci qui la descrizione dell'immagine

Qui stanno usando una forma poligonale per definire il flusso di testo. Dovrebbe essere possibile creare due poligoni per abbinare la forma desiderata per l'area di testo.

Ulteriori informazioni su css-shapessono state scritte su: http://sarasoueidan.com/blog/css-shapes/

Per abilitare le forme CSS in Chrome Canary:

  1. Copia e incolla chrome: // flags / # enable-experimental-web-platform-features nella barra degli indirizzi, quindi premi invio.
  2. Fai clic sul link "Abilita" all'interno di quella sezione.
  3. Fai clic sul pulsante "Riavvia ora" nella parte inferiore della finestra del browser.

    da: 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>

Poligono creato con: http://betravis.github.io/shape-tools/polygon-drawing/

Risultato

inserisci qui la descrizione dell'immagine

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


Il violino e l'esempio non hanno funzionato per me. Il testo scende sotto il poligono e rimane nascosto sotto di esso. Ho provato con Chromium 49, Firefox 44
deathangel908

Appena visto questo, sarà un incubo per renderlo reattivo.
Damiano Celent,


23

Puoi lavorare con un div contenteditable, con due div di angoli:

<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>

Ha bisogno di un po 'più di lavoro JS per occuparsi di tutti i diversi casi d'uso. Ma la base è lì.
Gidon,

20

Puoi farlo anche con le regioni CSS

Con le regioni, è possibile utilizzare le proprietà CSS per trasferire il contenuto nei contenitori con stile esistenti, specificando qualsiasi ordine di contenitore scelto, indipendentemente dalla loro posizione sulla pagina.

(Piattaforma Web)

inserisci qui la descrizione dell'immagine

[Attualmente supportato in WebKit Nightly, Safari 6.1+ e iOS7 e già utilizzabile in Chrome e Opera dopo aver abilitato il flag: enable-sperimental-web-platform-features - caniuse , Web Platform ]

VIOLINO

Quindi potresti creare quella textarea modellando il testo attraverso 2 regioni e modificandolo aggiungendo contenteditable al contenuto.

markup

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

(Rilevante) 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;
}

Il risultato:

inserisci qui la descrizione dell'immagine

Per maggiori informazioni sulle regioni, ecco un buon articolo: Regioni CSS3: layout di pagina ricco con HTML e CSS3


1
Bello! Sebbene sia a malapena supportato (la maggior parte degli utenti non vuole avere Chrome Canary e abilitare i flag sperimentali per utilizzare un sito Web), questo è sicuramente il modo in cui "dovrebbe" essere fatto
markasoftware il

Anzi ... Sfortunatamente, non funziona ancora su Firefox (anche su Alpha) e altri, e ha un cattivo odore di prefissi del fornitore :( Ma il metodo è interessante e deve essere usato in alcuni mesi / anni.
Maxime Lorant,

regioni css, forme css, filtri css ... cos'altro c'è ik
Muhammad Umer

@MuhammadUmer ... esclusioni css
Danield

18

Una lunga riga di testo nella casella farà cadere il cursore oltre i bordi centrali e non riesco a sistemarlo.

**[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

Non è possibile padre! Un'area di testo è generalmente una casella quadrata o quadrata, in cui è possibile digitare.

Tuttavia, per fare qualcosa del genere puoi usare 2 textarea e quindi dare loro una larghezza e un'altezza specificate. Altrimenti non penso che succederà!

Il secondo metodo sarebbe quello di creare un elemento modificabile.

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

Il codice è:

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

Usando questo, puoi rendere qualsiasi elemento modificabile! Puoi dargli dimensioni e funzionerà! Lo otterrai proprio come textarea.

Riferimento: https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_Editable


3
No, ti sbagli. Anche lui ha usato divs invece di textarea. Perché textarea non può essere modificato in forma! :) @Markasoftware Quindi hai torto durante il downgrade di questa risposta! .. dato che questa è la stessa risposta della sua. L'unica cosa che non è presente qui è l'immagine e il codice per rendere il div modificabile con quella forma!
Afzaal Ahmad Zeeshan,

Che cosa? Oh andiamo fratello, se vuoi tenermi sottovalutato senza motivo, sei il benvenuto! La mia risposta è stata pubblicata alle: 9:58 ha pubblicato la risposta alle 10:10: / Sono stato il primo a rispondere a questa domanda .. @ Markasoftware puoi andare a vedere il tempo per te. Non sono molto votato solo perché non ho fornito il codice. Tuttavia, ho pubblicato la risposta tra i 3
migliori risponditori

lol in realtà quando vado alla scheda "più vecchia" mostra che la tua risposta è la seconda più antica
markasoftware

È per il fatto che non è molto votato! Sono sempre attivo qui, quindi come posso pubblicare di recente? E questa era una semplice risposta. Quindi, per favore, puoi rimuovere il downvote? :)
Afzaal Ahmad Zeeshan,

5

Se si combinano forme CSS con contenteditablequesto può essere fatto nei browser webkit.

Per prima cosa devi abilitare il flag: enable-experimental-web-platform-features

Quindi riavvia il tuo browser webkit e quindi controlla questo FIDDLE !

Questo metodo funzionerà anche per forme non standard.

markup

 <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;
}

Quindi come diavolo ho ottenuto quella forma poligonale?

Vai a questo sito e crea la tua forma personalizzata!

Note sull'abilitazione della bandiera: (da qui )

Per abilitare forme, regioni e metodi di fusione:

Copia e incolla chrome: // flags / # enable-experimental-web-platform-features nella barra degli indirizzi, quindi premi Invio. Fai clic sul link "Abilita" all'interno di quella sezione. Fai clic sul pulsante "Riavvia ora" nella parte inferiore della finestra del browser.


4
+1 per una soluzione (ben documentata, strutturata), standard o no.
rolfl,

3
@kinokijuf Ti rendi conto che è così che diventano gli standard in questi giorni, giusto? In questo caso, Adobe ha ideato la proposta di forma e Webkit è stata la prima ad implementarla finora. Visto che l'Editor's Draft è di novembre, questa probabilmente non può essere definita un'estensione proprietaria e, per quanto ne sai, finirà per essere più ampiamente implementata e standardizzata in seguito. Nel frattempo gli utenti non Webkit otterranno un rettangolo, un grosso problema. (Diamine, Firefox richiede ancora un prefisso per box-sizing.)
millimoose

5

Puoi utilizzare lo strumento web designer di Google per creare forme complesse utilizzando HTML5-canvas and CSS.

Più oltre otterrai altri strumenti come gli strumenti di digitazione per inserire testi all'interno di queste forme.

Poiché il file di output contiene molto codice, fornisce un violino di una demo di esempio creata utilizzando lo strumento Google Web Designer

DEMO FIDDLE >>


1
Fiddle non funziona per me (= il testo non è modificabile) su Chrome 31.0 / Windows 7.
Ilmari Karonen il

@IlmariKaronen = il testo non è modificabile ??? davvero non ho capito. Qual è la necessità di renderlo modificabile ??
Prasanth KC

5
La domanda richiede qualcosa come un <textarea>(cioè una casella di testo modificabile), ma con una forma non rettangolare. Senza la parte "modificabile", qui non c'è molta sfida: le persone hanno fatto scorrere il testo in HTML fin dall'introduzione delle immagini mobili in HTML 2.0.
Ilmari Karonen,

Fiddle aggiornato con proprietà modificabile del contenuto. Ora il testo all'interno del contenitore è modificabile.
Prasanth KC il

Nella demo, posso modificare 2 testi diversi, non 1 testo intero. In Chrome 31.
Nicolas Barbulesco il

1

Se, per qualsiasi motivo, hai davvero bisogno di supportare i browser che non hanno contenteditable , probabilmente potresti fare la stessa cosa in JavaScript, usando gli eventi, anche se questa è una soluzione molto disordinata.

pseudocodice:

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;
    }
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.