Необычная форма текстовой области?

285

Обычно textareas являются прямоугольными или квадратными, например:

Изображение 102

Но мне нужна текстовая область в форме, например:

Изображение 103

Как это возможно?

  • 1
    Хм. Я хотел бы что-то встроенное для этого. Как «box-shape: circle» с помощью CSS. : /
  • 0
    Возможный дубликат Как нарисовать следующую форму, используя CSS?
Показать ещё 14 комментариев

10 ответов

276
Лучший ответ

Введение

Во-первых, существует множество решений, предложенных в других сообщениях. Я думаю, что в настоящий момент это (в 2013 году) тот, который может быть совместим с наибольшим количеством браузеров, потому что ему не нужны какие-либо свойства CSS3. Однако этот метод не будет работать в браузерах, которые не поддерживают contentdeditable, будьте осторожны.

Решение с помощью div contenteditable

Как было предложено @Getz, вы можете использовать div с contenteditable, а затем сформировать его с помощью некоторого div на нем. Вот пример с двумя блоками, которые плавают в верхнем левом углу и в правом верхнем углу главного div:

Изображение 2291

Как вы можете видеть, вам нужно немного поиграть с границами, если вы хотите получить тот же результат, что и в своем посте. Главный div имеет синюю рамку со всех сторон. Затем нужно закрыть красные блоки, чтобы скрыть верхние границы главного div, и вам нужно применить к ним границу только на определенных сторонах (снизу и слева для правого блока, снизу и справа слева).

После этого вы можете получить контент через Javascript, когда кнопка "Отправить" запускается, например. И я думаю, вы также можете обрабатывать остальную часть CSS (font-size, color и т.д.):)

Полный пример кода

.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
    Отличное решение, но с ошибкой: You can't apply a border color for the editable section keeping the two corner div's background-color:white . Не так ли? Тем не менее это победит. +1
  • 3
    Я не вижу проблемы. Для этого можно установить цвет фона: белый: jsfiddle.net/qgfP6/6 . Но вы должны установить фон, иначе случится что-то плохое: jsfiddle.net/qgfP6/7 (вы можете увидеть границу родительского контейнера ...)
Показать ещё 8 комментариев
116

В ближайшем будущем мы можем использовать так называемый css-shapes, чтобы достичь этого. Div с атрибутом contenteditable, установленным в true в сочетании с css-shapes, может сделать текстовую область любой формой.

В настоящее время Chrome Canary уже поддерживает css-shapes. Пример, который возможен с помощью css-фигур:

Изображение 2292

Здесь они используют форму многоугольника для определения потока текста. Должно быть возможно создать два полигона, чтобы соответствовать форме, которую вы хотите для своего текстового поля.

Дополнительная информация о css-shapes написана по адресу: http://sarasoueidan.com/blog/css-shapes/

Чтобы включить css-формы в Chrome Canary:

  • Скопировать и вставить chrome://flags/# enable-experimental-web-platform-features в адресную строку, затем нажмите клавишу ввода.
  • Нажмите ссылку "Включить" в пределах этого раздел.
  • Нажмите кнопку "Повторить сейчас" внизу браузера.

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

Многоугольник, созданный с помощью http://betravis.github.io/shape-tools/polygon-drawing/

Результат

Изображение 2293

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

  • 0
    Скрипка и пример у меня не сработали. Текст идет ниже многоугольника и остается скрытым под ним. Я тестировал с Chromium 49, Firefox 44
  • 0
    Только что видел это, это будет кошмар, чтобы заставить его реагировать.
60

Возможно ли это с помощью Content Editable?

Это не текстовое поле, но если вам удастся создать div с этой формой, он может работать.

Я думаю, что это невозможно с помощью только textarea...

Маленький пример: http://jsfiddle.net/qgfP6/5/

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

Вы можете работать с contenteditable div, с двумя углами divs:

<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>
  • 0
    Требуется дополнительная работа JS, чтобы позаботиться обо всех различных случаях использования. Но основа есть.
  • 0
    Я нахожусь на Chrome и не имею проблем с редактированием текста.
22

Вы также можете сделать это с помощью CSS-регионы

С помощью регионов вы можете использовать свойства CSS для потока содержимого в существующие с указанием контейнера, который вы выберете, независимо от их положения на странице.

(веб-платформа)

Изображение 2294

[В настоящее время поддерживается в WebKit Nightly, Safari 6.1+ и iOS7 и уже используется в Chrome и Opera после включения флага: enable-experimental-web-platform-features - caniuse, Веб-платформа]

FIDDLE

Итак, вы можете сделать эту форму textarea, протекая текст через 2 области и отредактировать ее, добавив контент в контент.

Разметка

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

(Релевантно) 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;
}

Результат:

Изображение 2295

Для получения дополнительной информации о регионах - здесь хорошая статья: Области CSS3: богатый макет страницы с HTML и CSS3

  • 1
    Ницца! Хотя он почти не поддерживается (большинству пользователей не нужно получать Chrome Canary и включать экспериментальные флаги для использования веб-сайта), это определенно так, как «следует» сделать
  • 0
    Действительно ... К сожалению, он еще не работает на Firefox (даже на Alpha) и других, и имеет неприятный запах префиксов вендоров :( Но этот метод интересен и должен использоваться через несколько месяцев / лет.
Показать ещё 2 комментария
19

Длинная строка текста в поле выводит курсор вниз по средним краям, и я не могу это исправить.

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

Это не возможно сир! Текстовое поле обычно представляет собой прямоугольное или квадратное поле, в которое вы можете ввести.

Однако, чтобы сделать что-то подобное, вы можете использовать 2 textarea, а затем дать им указанную ширину и высоту. В противном случае я не думаю, что это произойдет!

Второй метод - создать редактируемый элемент.

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

Код:

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

Используя это, вы можете сделать любой элемент редактируемым! Вы можете дать измерения, и это сработает! Вы получите это как текстовое поле.

Ссылка: https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_Editable

  • 3
    Нет ты ошибаешься. Даже он использовал div s вместо textarea. Потому что текстовая область не может быть изменена в форме! :) @Markasoftware Таким образом, вы не правы, принижая этот ответ! .. так как это тот же ответ, что и его. Единственное, чего здесь нет, это изображение и код для создания редактируемого div с этой формой!
  • 0
    Какие? О, давай, брат, если ты хочешь, чтобы за мной отказали без всякой причины, добро пожаловать! Мой ответ был опубликован в 9:58, он опубликовал ответ в 10:10: / Я был первым, кто ответил на этот вопрос .. @ Markasoftware вы можете пойти и посмотреть время для себя. Я не голосую много только потому, что я не предоставил код. Как бы то ни было, я разместил ответ в ТОП-3 ответов.
Показать ещё 2 комментария
6

Вы можете использовать инструмент веб-дизайнера Google для создания сложных форм с помощью HTML5-canvas and CSS.

Более того, вы получите другие инструменты, такие как ввод инструментов для ввода текстов внутри этих фигур.

Поскольку выходной файл содержит много кода, предоставляя скрипту демонстрационной демонстрации, созданной с помощью Инструмента Google Web Designer

FIDDLE DEMO →

  • 1
    Скрипка не работает для меня (= текст не редактируется) в Chrome 31.0 / Windows 7.
  • 0
    @IlmariKaronen = текст не редактируется ??? на самом деле я не получил. Зачем нужно сделать его редактируемым?
Показать ещё 3 комментария
6

Если вы объедините CSS-формы с contenteditable, это можно сделать в браузерах webkit.

Сначала вам нужно включить флаг: enable-experimental-web-platform-features

Затем перезагрузите браузер веб-браузера, а затем откройте FIDDLE!

Этот метод будет работать и для нестандартных форм.

Разметка

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

Итак, как же я получил форму полигона?

Перейдите на этот сайт и создайте собственную форму!

Заметки о включении флага: (от здесь)

Чтобы включить режим Shape, Regions и Blend:

Скопировать и вставить chrome://flags/# enable-experimental-web-platform-features в адресную строку, затем нажмите клавишу ввода. Нажмите ссылку "Включить" в пределах этого раздел. Нажмите кнопку "Повторить сейчас" внизу браузера. окно.

  • 1
    -1 за использование нестандартных функций webkit.
  • 4
    +1 за (хорошо документированное, структурированное) решение, стандартное или нет.
Показать ещё 1 комментарий
1

Если по какой-то причине вам действительно нужно поддерживать браузеры, у которых нет contenteditable, вы, вероятно, могли бы сделать то же самое в JavaScript, используя события, хотя это очень грязное решение.

псевдокод:

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;
    }
    }
  • 0
    даже псевдокод может использовать приличное форматирование и отступ: D

Ещё вопросы

Сообщество Overcoder
Наверх
Меню