Bentuk teks yang tidak biasa?

273

Biasanya textareas persegi panjang atau persegi, seperti ini:

SMS biasa

Tapi saya ingin textarea berbentuk kustom, seperti ini, misalnya:

Textarea berbentuk khusus

Bagaimana ini mungkin?

Paranoid
sumber
45
Selamat datang di web trope yang paling sering digunakan selama tiga tahun ke depan!
l0b0
24
Sama sekali tidak berhubungan: Bolehkah saya bertanya dalam konteks apa Anda berencana menggunakan ini? Maksudku, aku tidak bisa membayangkan skenario di mana ini akan berguna, jadi aku ingin inspirasi.
user98085
23
Semua orang kehilangan masalah kritis . Menggunakan <div>teks untuk menyimpan bukan solusi yang baik. Ini dapat membantu mendesain, dan bahkan mungkin dapat diterima untuk teks hanya-baca (yang benar-benar mengalahkan tujuan contenteditable), tetapi itu tidak baik untuk input teks dari pengguna. Sebuah div (bahkan yang dapat diedit) bukan elemen input standar seperti elemen form normal, oleh karena itu, itu tidak akan diperlakukan seperti itu, sehingga isinya tidak akan disimpan oleh browser jika terjadi crash. Menggunakan div menyebabkan hilangnya data . Lihat contoh ini .
Synetech
3
Sebenarnya ini harus ditutup sebagai "Menunjukkan pemahaman minimal tentang masalah yang sedang dipecahkan"
Mr. Alien
9
Jadi, di mana Anda ingin melihat scrollbar vertikal?
Rob W

Jawaban:

262

pengantar

Pertama, ada banyak solusi, yang diusulkan dalam posting lain. Saya pikir yang ini saat ini (tahun 2013) adalah yang dapat kompatibel dengan jumlah browser terbesar, karena tidak memerlukan properti CSS3. Namun, metode ini tidak akan berfungsi pada browser yang tidak mendukung contentdeditable , hati-hati.

Solusi dengan div contenteditable

Seperti yang diusulkan oleh @Getz , Anda dapat menggunakan div dengan contenteditabledan kemudian membentuknya dengan beberapa div di atasnya. Berikut adalah contohnya, dengan dua blok yang melayang di kiri atas dan kanan atas div utama:

Hasilnya dengan Firefox 28

Seperti yang Anda lihat, Anda harus bermain sedikit dengan perbatasan jika Anda ingin hasil yang sama seperti yang Anda minta di posting Anda. Div utama memiliki perbatasan biru di setiap sisi. Selanjutnya, blok merah harus ditempel untuk menyembunyikan batas atas div utama, dan Anda perlu menerapkan perbatasan hanya pada sisi tertentu ( bawah dan kiri untuk blok kanan, bawah dan kanan untuk kiri).

Setelah itu, Anda bisa mendapatkan konten melalui Javascript, ketika tombol " Kirim " dipicu misalnya. Dan saya pikir Anda juga dapat menangani sisa CSS ( font-size, color, dll) :)

Contoh kode lengkap

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

Maxime Lorant
sumber
1
Solusi yang bagus tapi dengan bug: You can't apply a border color for the editable section keeping the two corner div's background-color:white. Bukan? Masih ini akan menang. +1
Rajesh Paul
3
Saya tidak melihat masalah. Ini mungkin untuk mengatur latar belakang warna: putih pada ini: jsfiddle.net/qgfP6/6 . Tapi, Anda harus menetapkan latar belakang, jika tidak hal-hal buruk terjadi: jsfiddle.net/qgfP6/7 (Anda dapat melihat perbatasan wadah induk ...)
Maxime Lorant
1
Namun, ada solusi yang membutuhkan lebih banyak div. Elemen parrent yang transparan dan tanpa batas, diisi dengan div yang tumpang tindih dengan batas dan latar belakang DAN dengan padding divs untuk menciptakan efek yang diinginkan.
Qwerty
@ MaximeLorant yang saya ceritakan bad thingshanya tentang itu . Itu akan menjadi efek samping dari situasi yang baru saja saya tanyakan dan apa yang telah Anda lakukan dalam biola. Tapi itu jelas merupakan solusi yang sangat bagus. Terima kasih untuk klarifikasi.
Rajesh Paul
1
Jawaban yang brilian! Dan di sini saya akan pergi dan menyarankan sesuatu di sepanjang baris menggunakan dua area teks yang berdekatan dengan konten yang terbelah di antara keduanya.
Zarathuztra
115

Dalam waktu dekat kita dapat menggunakan apa yang disebut css-shapesuntuk mencapai ini. Sebuah div dengan contenteditableatribut yang diset untuk truedigabungkan dengan css-shapesdapat membuat area teks bentuk apa pun.

Saat ini Chrome Canary sudah mendukung css-shapes . Contoh yang mungkin dengan css-bentuk adalah:

masukkan deskripsi gambar di sini

Di sini mereka menggunakan bentuk poligon untuk mendefinisikan aliran teks. Seharusnya dimungkinkan untuk membuat dua poligon agar sesuai dengan bentuk yang Anda inginkan untuk textarea Anda.

Informasi lebih lanjut tentang css-shapestelah ditulis di: http://sarasoueidan.com/blog/css-shapes/

Untuk mengaktifkan css-bentuk di Chrome Canary:

  1. Salin dan tempel chrome: // flags / # enable-experimental-web-platform-features ke bilah alamat, lalu tekan enter.
  2. Klik tautan 'Aktifkan' di dalam bagian itu.
  3. Klik tombol 'Luncurkan Ulang Sekarang' di bagian bawah jendela browser.

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

Polygon dibuat dengan: http://betravis.github.io/shape-tools/polygon-drawing/

Hasil

masukkan deskripsi gambar di sini

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

Bas van Dijk
sumber
Biola dan teladan tidak bekerja untuk saya. Teks berjalan di bawah poligon dan tetap tersembunyi di bawahnya. Saya diuji dengan Chromium 49, Firefox 44
deathangel908
Baru saja melihat ini, ini akan menjadi mimpi buruk untuk membuatnya responsif.
damiano celent
62

Mungkin itu mungkin dengan Content Editable ?

Ini bukan textarea, tetapi jika Anda berhasil membuat div dengan bentuk ini, itu bisa berhasil.

Saya pikir itu tidak mungkin hanya dengan textarea ...

Contoh kecil: http://jsfiddle.net/qgfP6/5/

<div contenteditable="true">
</div>
Getz
sumber
23

Anda bisa bekerja dengan div yang dapat diedit, dengan dua sudut div:

<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>
Gidon
sumber
Perlu beberapa pekerjaan JS untuk menangani semua kasus penggunaan yang berbeda. Tapi dasarnya ada di sana.
Gidon
20

Anda juga bisa melakukan ini dengan Kawasan CSS

Dengan Kawasan, Anda dapat menggunakan properti CSS untuk mengalirkan konten ke wadah gaya yang ada, menentukan urutan wadah apa pun yang Anda pilih, terlepas dari posisinya di halaman.

(Platform Web)

masukkan deskripsi gambar di sini

[Saat ini didukung di WebKit Nightly, Safari 6.1+ dan iOS7 dan sudah dapat digunakan dalam chrome dan opera setelah mengaktifkan flag: enable-experimental-web-platform-features - caniuse , Web Platform ]

BIOLA

Jadi Anda bisa membuat bentuk teks itu dengan mengalirkan teks melalui 2 wilayah, dan mengeditnya dengan menambahkan konten yang dapat diedit pada konten.

Markup

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

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

Hasil:

masukkan deskripsi gambar di sini

Untuk info lebih lanjut tentang kawasan - inilah aricle yang bagus: wilayah CSS3: Tata letak halaman kaya dengan HTML dan CSS3

Danield
sumber
1
Bagus! Meskipun hampir tidak didukung (sebagian besar pengguna tidak ingin harus mendapatkan kenari krom dan mengaktifkan bendera eksperimental untuk menggunakan situs web), ini jelas cara itu "harus" dilakukan
markasoftware
Memang ... Sayangnya, belum berfungsi di Firefox (bahkan di Alpha) dan lainnya, dan memiliki bau awalan vendor :( Tapi metode ini menarik dan harus digunakan dalam beberapa bulan / tahun.
Maxime Lorant
wilayah css, bentuk css, filter css ... apa lagi yang ada
Muhammad Umer
@MuhammadUmer ... css pengecualian
Danield
18

Baris panjang teks di dalam kotak akan menurunkan kursor melewati tepi tengah dan saya tidak bisa memperbaikinya

**[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/
Deryck
sumber
8

Itu tidak mungkin tuanku! Textarea umumnya kotak kotak atau persegi, tempat Anda bisa mengetik.

Namun, untuk membuat sesuatu seperti itu Anda dapat menggunakan 2 textarea dan kemudian memberi mereka lebar dan tinggi yang ditentukan. Kalau tidak, saya tidak berpikir itu akan terjadi!

Metode kedua adalah membuat elemen yang dapat diedit.

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

Kode tersebut adalah:

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

Dengan ini, Anda dapat membuat elemen apa pun dapat diedit! Anda dapat memberikan dimensi padanya, dan itu akan berhasil! Anda akan mendapatkannya hanya sebagai textarea.

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

Afzaal Ahmad Zeeshan
sumber
3
Tidak, kamu salah. Bahkan dia menggunakan divs bukan textarea. Karena textarea tidak dapat dimodifikasi menjadi bentuk! :) @Markasoftware Jadi Anda salah saat mengunduh jawaban ini! .. karena ini adalah jawaban yang sama dengan miliknya. Satu-satunya hal yang tidak ada di sini adalah gambar dan kode untuk membuat div yang dapat diedit dengan bentuk itu!
Afzaal Ahmad Zeeshan
Apa? Oh, ayolah saudaraku, jika Anda ingin agar saya tetap downvot tanpa alasan Anda dipersilahkan! Jawaban saya diposting di: 9:58 ia memposting jawaban di 10:10: / Saya pertama kali menjawab pertanyaan ini .. @ Markasoftware Anda dapat pergi dan melihat waktu untuk diri sendiri. Saya tidak banyak dipilih hanya karena saya tidak memberikan kode. Howver, saya memposting jawabannya di TOP 3 penjawab ..
Afzaal Ahmad Zeeshan
lol sebenarnya ketika saya pergi ke tab "tertua" itu menunjukkan bahwa jawaban Anda tertua kedua
markasoftware
Itu karena fakta bahwa itu tidak banyak terangkat! Saya setiap kali aktif di sini, jadi bagaimana saya bisa mengirim belakangan ini? Dan yang ini adalah jawaban sederhana. Jadi bisakah Anda menghapus downvote? :)
Afzaal Ahmad Zeeshan
5

Jika Anda menggabungkan bentuk CSS dengan contenteditableini dapat dilakukan di browser webkit.

Pertama, Anda harus mengaktifkan flag: enable-experimental-web-platform-features

Kemudian restart browser webkit Anda dan kemudian periksa FIDDLE ini !

Metode ini juga akan berfungsi untuk bentuk yang tidak standar.

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

Jadi bagaimana saya bisa mendapatkan bentuk poligon itu?

Buka situs ini dan buat bentuk kustom Anda sendiri!

Catatan tentang mengaktifkan bendera: (dari sini )

Untuk mengaktifkan Bentuk, Wilayah, dan Mode Campuran:

Salin dan tempel chrome: // flags / # enable-experimental-web-platform-features ke bilah alamat, lalu tekan enter. Klik tautan 'Aktifkan' di dalam bagian itu. Klik tombol 'Luncurkan Ulang Sekarang' di bagian bawah jendela browser.

Danield
sumber
4
+1 untuk solusi (didokumentasikan dengan baik, terstruktur), baik standar atau tidak.
rolfl
3
@kinokijuf Anda benar-benar menyadari bahwa standar menjadi seperti sekarang ini, bukan? Dalam hal ini, Adobe membuat proposal bentuk, dan Webkit adalah yang pertama yang mengimplementasikannya sejauh ini. Melihat Rancangan Editor berasal dari bulan November, ini mungkin tidak dapat disebut sebagai ekstensi hak milik, dan untuk semua yang Anda tahu akan berakhir lebih banyak diimplementasikan dan distandarisasi kemudian. Sementara itu, pengguna non-Webkit akan mendapatkan persegi panjang, masalah besar. (Heck, Firefox masih membutuhkan awalan untuk box-sizing.)
millimoose
5

Anda dapat menggunakan alat desainer web Google untuk membuat bentuk yang rumit menggunakan HTML5-canvas and CSS.

Terlebih lagi Anda akan mendapatkan alat lain seperti alat mengetik untuk memasukkan teks di dalam bentuk ini.

Karena file output berisi banyak kode, menyediakan contoh demo sampel yang dibuat menggunakan alat Google Web Designer

DEMO FIDDLE >>

Prasanth KC
sumber
1
Fiddle tidak berfungsi untuk saya (= teks tidak dapat diedit) di Chrome 31.0 / Windows 7.
Ilmari Karonen
@IlmariKaronen = teks tidak bisa diedit ??? sungguh aku tidak mengerti. Apa perlunya membuatnya bisa diedit ??
Prasanth KC
5
Pertanyaannya menanyakan sesuatu seperti <textarea>(yaitu kotak teks yang dapat diedit), tetapi dengan bentuk non-persegi panjang. Tanpa bagian "yang dapat diedit", ada sedikit tantangan di sini - orang telah melakukan teks mengalir dalam HTML sejak diperkenalkannya gambar mengambang di HTML 2.0.
Ilmari Karonen
Biola diperbarui dengan properti yang dapat diedit konten. Sekarang teks di dalam wadah dapat diedit.
Prasanth KC
Dalam demo, saya dapat mengedit 2 teks berbeda, bukan 1 teks utuh. Di Chrome 31.
Nicolas Barbulesco
1

Jika, untuk alasan apa pun, Anda benar-benar perlu mendukung browser yang tidak memilikinya contenteditable, Anda mungkin bisa melakukan hal yang sama dalam JavaScript, dengan menggunakan acara, meskipun ini merupakan solusi yang sangat berantakan.

Kodesemu:

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

sumber