Hình dạng bất thường của một textarea?


273

Thông thường textareas là hình chữ nhật hoặc hình vuông, như thế này:

Textarea thông thường

Nhưng tôi muốn một textarea có hình dạng tùy chỉnh, như thế này, ví dụ:

Textarea hình tùy chỉnh

Sao có thể như thế được?


45
Chào mừng bạn đến với trope web được sử dụng nhiều nhất trong ba năm tới!
l0b0

24
Hoàn toàn không liên quan: Tôi có thể hỏi bối cảnh nào bạn dự định sử dụng trong bối cảnh này không? Ý tôi là, tôi thực sự không thể tìm ra một kịch bản trong đó điều này sẽ hữu ích, vì vậy tôi muốn có một chút cảm hứng về điều đó.
user98085

23
Mọi người đang thiếu một vấn đề quan trọng . Sử dụng một <div>để lưu trữ văn bản không phải là một giải pháp tốt. Nó có thể giúp thiết kế và thậm chí có thể được chấp nhận đối với văn bản chỉ đọc (hoàn toàn đánh bại mục đích contenteditable), nhưng nó không tốt cho việc nhập văn bản từ người dùng. Một div (thậm chí là một nội dung có thể nội dung) không phải là một yếu tố đầu vào tiêu chuẩn như một yếu tố hình thức bình thường, do đó, nó sẽ không được xử lý như một, và do đó, nội dung của nó sẽ không được lưu bởi các trình duyệt trong trường hợp gặp sự cố. Sử dụng div dẫn đến mất dữ liệu . Xem ví dụ này .
Synetech

3
Trên thực tế, điều này nên được đóng lại vì "Thể hiện sự hiểu biết tối thiểu về vấn đề đang được giải quyết"
Ông Alien

9
Vì vậy, nơi bạn muốn xem thanh cuộn dọc?
Cướp

Câu trả lời:


262

Giới thiệu

Đầu tiên, có nhiều giải pháp, được đề xuất trong các bài viết khác. Tôi nghĩ cái này hiện tại (năm 2013) là cái có thể tương thích với số lượng trình duyệt lớn nhất, bởi vì nó không cần bất kỳ thuộc tính CSS3 nào. Tuy nhiên, phương pháp sẽ không hoạt động trên các trình duyệt không hỗ trợ contentdeditable , hãy cẩn thận.

Giải pháp với div contenteditable

Theo đề xuất của @Getz , bạn có thể sử dụng div với contenteditablevà sau đó định hình nó với một số div trên đó. Dưới đây là một ví dụ, với hai khối nổi ở phía trên bên trái và phía trên bên phải của div chính:

Kết quả với Firefox 28

Như bạn có thể thấy, bạn phải chơi một chút với các đường viền nếu bạn muốn kết quả giống như bạn yêu cầu trong bài viết của mình. Div chính có viền màu xanh ở mọi phía. Tiếp theo, các khối màu đỏ phải được dán để ẩn các đường viền trên cùng của div chính và bạn chỉ cần áp dụng đường viền cho chúng ở các mặt cụ thể ( phía dưới và bên trái cho khối bên phải, dưới cùng và bên phải cho bên trái).

Sau đó, bạn có thể lấy nội dung qua Javascript, khi nút " Gửi " được kích hoạt chẳng hạn. Và tôi nghĩ bạn cũng có thể xử lý phần còn lại của CSS ( font-size, color, vv) :)

Mẫu mã đầy đủ

.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
Giải pháp tuyệt vời nhưng có lỗi : You can't apply a border color for the editable section keeping the two corner div's background-color:white. Phải không? Tuy nhiên, điều này sẽ giành chiến thắng. +1
Rajesh Paul

3
Tôi không thấy vấn đề. Có thể đặt màu nền: trắng trên này: jsfiddle.net/qgfP6/6 . Nhưng, bạn phải đặt nền, nếu không, điều tồi tệ đã xảy ra: jsfiddle.net/qgfP6/7 (bạn có thể thấy đường viền của thùng chứa cha mẹ ...)
Maxime Lorant 22/12/13

1
Có một cách giải quyết đòi hỏi nhiều div hơn, mặc dù. Phần tử parrent trong suốt và không có viền, chứa đầy các div chồng chéo với viền và nền VÀ với các div đệm để tạo hiệu ứng mong muốn.
Qwerty

@MaximeLorant Tôi chỉ nói về những điều đó bad things. Đó sẽ là những tác dụng phụ của tình huống tôi vừa hỏi và những gì bạn đã làm trong câu đố. Nhưng nó chắc chắn là một giải pháp thực sự tốt. Thanx để làm rõ.
Rajesh Paul

1
Câu trả lời rực rỡ! Và ở đây tôi sẽ đi và đề xuất một cái gì đó dọc theo dòng sử dụng hai vùng văn bản gần nhau với nội dung được phân chia giữa hai.
Zarathuztra

115

Trong tương lai gần, chúng ta có thể sử dụng cái gọi là css-shapesđể đạt được điều này. Một div với contenteditablethuộc tính được đặt để truekết hợp với css-shapescó thể tạo một vùng văn bản bất kỳ loại hình dạng nào.

Hiện tại Chrome Canary đã hỗ trợ css-shapes . Một ví dụ những gì có thể với hình dạng css là:

nhập mô tả hình ảnh ở đây

Ở đây họ đang sử dụng hình dạng đa giác để xác định luồng văn bản. Có thể tạo hai đa giác để khớp với hình dạng bạn muốn cho vùng văn bản của bạn.

Thông tin thêm về css-shapesđã được viết tại: http://saraoueidan.com/blog/css-shapes/

Để bật hình dạng css trong Chrome Canary:

  1. Sao chép và dán chrome: // flags / # enable-thử nghiệm-web-platform-tính năng vào thanh địa chỉ, sau đó nhấn enter.
  2. Nhấp vào liên kết 'Kích hoạt' trong phần đó.
  3. Nhấp vào nút 'Khởi chạy lại ngay ở cuối cửa sổ trình duyệt.

    từ: http://html.adobe.com/webpl platform / 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>

Đa giác được tạo bằng: http://betravis.github.io/shape-tools/polygon-drawing/

Kết quả

nhập mô tả hình ảnh ở đây

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


Fiddle và ví dụ không làm việc cho tôi. Các văn bản đi bên dưới đa giác và ở ẩn bên dưới nó. Tôi đã thử nghiệm với Chromium 49, Firefox 44
deathangel908

Chỉ cần nhìn thấy điều này, đây sẽ là một cơn ác mộng để làm cho nó phản ứng.
damiano celent 16/07/2016

62

Có lẽ nó có thể với Nội dung có thể chỉnh sửa ?

Nó không phải là một textarea, nhưng nếu bạn thành công để tạo một div với hình dạng này, nó có thể hoạt động.

Tôi nghĩ rằng điều đó là không thể chỉ với textarea ...

Một ví dụ nhỏ: http://jsfiddle.net/qgfP6/5/

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

23

Bạn có thể làm việc với một div có thể nội dung, với hai góc 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>

Nó cần thêm một số công việc JS để xử lý tất cả các trường hợp sử dụng khác nhau. Nhưng cơ sở là có.
Gidon

20

Bạn cũng có thể làm điều này với Vùng CSS

Với Vùng, bạn có thể sử dụng các thuộc tính CSS để chuyển nội dung vào các vùng chứa theo kiểu hiện có, chỉ định bất kỳ thứ tự vùng chứa nào bạn chọn, bất kể vị trí của chúng trên trang.

(Nền tảng web)

nhập mô tả hình ảnh ở đây

[Hiện được hỗ trợ trong WebKit Nightly, Safari 6.1+ và iOS7 và đã có thể sử dụng bằng chrome và opera sau khi bật cờ: enable-thử nghiệm-nền tảng web-tính năng - caniuse , Nền tảng web ]

VĨ CẦM

Vì vậy, bạn có thể làm cho hình dạng văn bản đó bằng cách chuyển văn bản qua 2 vùng và chỉnh sửa nó bằng cách thêm nội dung vào nội dung.

Đánh dấu

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

(Có liên quan) 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;
}

Kết quả:

nhập mô tả hình ảnh ở đây

Để biết thêm thông tin về các khu vực - đây là một trung tâm tốt: các khu vực CSS3: Bố cục trang phong phú với HTML và CSS3


1
Đẹp! Mặc dù nó chỉ được hỗ trợ (hầu hết người dùng không muốn phải get Chrome Canary và cho phép cờ thử nghiệm sử dụng một trang web), điều này chắc chắn là cách nó "nên" được thực hiện
markasoftware

Thật vậy ... Thật không may, nó chưa hoạt động trên Firefox (ngay cả trên Alpha) và các loại khác, và có mùi khó chịu của tiền tố nhà cung cấp :( Nhưng phương pháp này rất thú vị và phải được sử dụng trong vài tháng / năm.
Maxime Lorant

khu vực css, hình dạng css, bộ lọc css ... còn gì nữa không
Muhammad Umer 24/12/13

@MuhammadUmer ... loại trừ css
Danield

18

Một dòng văn bản dài trong hộp sẽ thả con trỏ xuống qua các cạnh giữa và tôi dường như không thể sửa nó.

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

Điều đó không thể xảy ra! Một textarea thường là một hộp trực tràng hoặc hình vuông, nơi bạn có thể nhập vào.

Tuy nhiên, để làm một cái gì đó tương tự, bạn có thể sử dụng 2 textarea và sau đó cung cấp cho chúng chiều rộng và chiều cao được chỉ định. Nếu không tôi không nghĩ nó sẽ xảy ra!

Phương pháp thứ hai sẽ là tạo ra một yếu tố có thể chỉnh sửa.

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

Mã này là:

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

Sử dụng điều này, bạn có thể làm cho bất kỳ yếu tố có thể chỉnh sửa! Bạn có thể cung cấp kích thước cho nó, và nó sẽ hoạt động! Bạn sẽ nhận được nó giống như một textarea.

Tham khảo: https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_Editable


3
Không, bạn sai rồi. Thậm chí anh ấy đã sử dụng divs thay vì textarea. Bởi vì textarea không thể được sửa đổi thành hình! :) @Markasoftware Vì vậy, bạn đã sai trong khi hạ thấp câu trả lời này! .. vì đây chỉ là câu trả lời giống như của anh ấy. Điều duy nhất không có ở đây là hình ảnh và mã để tạo div có thể chỉnh sửa với hình dạng đó!
Afzaal Ahmad Zeeshan

Gì? Thôi nào anh bạn, nếu bạn muốn giữ cho tôi xuống cấp mà không có lý do gì bạn được chào đón nhất! Câu trả lời của tôi đã được đăng vào lúc: 9:58 anh ấy đã đăng câu trả lời lúc 10:10: / Tôi là người đầu tiên trả lời câu hỏi này .. @ Markasoftware bạn có thể tự mình đi xem thời gian. Tôi không được nâng cấp nhiều chỉ vì tôi không cung cấp mã. Howver, tôi đăng các câu trả lời trong TOP 3 người trả lời ..
Afzaal Ahmad Zeeshan

lol thực sự khi tôi đi đến tab "lâu đời nhất" nó cho thấy rằng câu trả lời của bạn là lâu đời thứ hai
markasoftware

Đó là bởi vì thực tế là nó không được nâng cấp nhiều! Tôi luôn hoạt động ở đây, vậy làm thế nào tôi có thể đăng bài gần đây? Và đây là một câu trả lời đơn giản. Vì vậy, bạn có thể vui lòng loại bỏ downvote? :)
Afzaal Ahmad Zeeshan 23/12/13

5

Nếu bạn kết hợp các hình dạng CSS với contenteditableđiều này có thể được thực hiện trong trình duyệt webkit.

Trước tiên, bạn phải bật cờ: enable-thử nghiệm-nền tảng web-tính năng

Sau đó khởi động lại trình duyệt webkit của bạn và sau đó kiểm tra FIDDLE này !

Phương pháp này cũng sẽ làm việc cho các hình dạng không chuẩn.

Đánh dấu

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

Vậy làm thế nào trên trái đất tôi có được hình dạng đa giác đó?

Tới trang web này và tạo hình tùy chỉnh của riêng bạn!

Lưu ý về việc bật cờ: (từ đây )

Để bật Chế độ hình dạng, khu vực và pha trộn:

Sao chép và dán chrome: // flags / # enable-thử nghiệm-web-platform-tính năng vào thanh địa chỉ, sau đó nhấn enter. Nhấp vào liên kết 'Kích hoạt' trong phần đó. Nhấp vào nút 'Khởi chạy lại ngay ở cuối cửa sổ trình duyệt.


4
+1 cho giải pháp (được ghi chép tốt, có cấu trúc), cho dù là tiêu chuẩn hay không.
rolfl

3
@kinokijuf Bạn có nhận ra rằng làm thế nào các tiêu chuẩn trở thành ngày nay, phải không? Trong trường hợp này, Adobe đã đưa ra đề xuất hình dạng và Webkit là người đầu tiên thực hiện nó cho đến nay. Được xem là Bản nháp của Biên tập viên là từ tháng 11, đây có lẽ không thể được gọi là tiện ích mở rộng độc quyền và đối với tất cả những gì bạn biết sẽ kết thúc được triển khai và chuẩn hóa rộng rãi hơn sau này. Trong khi đó, người dùng không phải là Webkit sẽ có được một hình chữ nhật, một vấn đề lớn. (Heck, Firefox vẫn yêu cầu tiền tố cho box-sizing.)
millimoose

5

Bạn có thể sử dụng công cụ thiết kế web của Google để tạo các hình dạng phức tạp bằng cách sử dụng HTML5-canvas and CSS.

Hơn nữa bạn sẽ nhận được các công cụ khác như công cụ gõ để nhập văn bản bên trong các hình dạng này.

Vì tệp đầu ra chứa nhiều mã, cung cấp một bản thử nghiệm mẫu được tạo bằng công cụ Google Web Designer

FIDDLE DEMO >>


1
Fiddle không hoạt động với tôi (= văn bản không thể chỉnh sửa) trên Chrome 31.0 / Windows 7.
Ilmari Karonen

@IlmariKaronen = văn bản không thể chỉnh sửa ??? thực sự tôi đã không nhận được. Sự cần thiết phải làm cho nó có thể chỉnh sửa là gì ??
Prasanth KC

5
Câu hỏi yêu cầu một cái gì đó giống như <textarea>(ví dụ một hộp văn bản có thể chỉnh sửa), nhưng với hình dạng không phải hình chữ nhật. Không có phần "có thể chỉnh sửa", có rất ít thách thức ở đây - mọi người đã thực hiện chuyển văn bản trong HTML kể từ khi giới thiệu hình ảnh nổi trong HTML 2.0.
Ilmari Karonen

Fiddle cập nhật với nội dung có thể chỉnh sửa nội dung. Bây giờ văn bản bên trong container có thể chỉnh sửa.
Prasanth KC

Trong bản demo, tôi có thể chỉnh sửa 2 văn bản khác nhau, không phải 1 toàn bộ văn bản. Trong Chrome 31.
Nicolas Barbulesco 23/12/13

1

Nếu vì bất kỳ lý do gì, bạn thực sự cần hỗ trợ các trình duyệt không có contenteditable, có lẽ bạn có thể làm điều tương tự trong JavaScript, bằng cách sử dụng các sự kiện, mặc dù đây là một cách giải quyết rất lộn xộn.

Mã giả:

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;
    }
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.