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


273

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

Обычная текстовая область

Но я хочу текстовую область нестандартной формы, например, такую:

Текстовая область по индивидуальному заказу

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


45
Добро пожаловать в самый популярный веб-трос в течение следующих трех лет!
10

24
Совершенно не связано: могу я спросить, в каком контексте вы планируете использовать это? Я имею в виду, я не могу придумать сценарий, в котором это было бы полезно, поэтому я хотел бы получить вдохновение в этом.
user98085

23
Все упускают критическую проблему . Использование <div>для хранения текста не является хорошим решением. Это может помочь при разработке и даже может быть приемлемо для текста только для чтения (что полностью противоречит цели contenteditable), но не подходит для ввода текста пользователем. Div (даже contenteditable) не является стандартным элементом ввода, как обычный элемент формы, поэтому он не будет обрабатываться как один, и поэтому его содержимое не будет сохраняться браузерами в случае сбоев. Использование div приводит к потере данных . Смотрите этот пример .
Synetech

3
На самом деле это должно быть закрыто как «продемонстрировало минимальное понимание решаемой проблемы»
г-н Чужой

9
Итак, где вы хотите увидеть вертикальную полосу прокрутки?
Роб W

Ответы:


262

Введение

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

Решение с div contenteditable

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

Результат с Firefox 28

Как видите, вам нужно немного поиграть с границами, если вы хотите получить тот же результат, который вы запрашивали в своем посте. Основной 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 (вы можете увидеть границу родительского контейнера ...)
Максим Лоран

1
Однако есть обходной путь, требующий большего количества div. Элемент parrent, который является прозрачным и без рамки, заполнен перекрывающимися элементами div с границами и фонами И с дополнительными элементами div для создания желаемого эффекта.
Qwerty

@MaximeLorant Я рассказывал bad thingsтолько о них . Это будет побочным эффектом ситуации, о которой я только что спросил, и того, что вы сделали на скрипке. Но это, безусловно, действительно хорошее решение. Спасибо за разъяснение.
Раджеш Пол

1
Блестящий ответ! И здесь я собирался пойти и предложить что-то вроде использования двух текстовых областей близко друг к другу с разделением контента между ними.
Заратузтра

115

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

В настоящее время Chrome Canary уже поддерживает css-shapes . Пример того, что возможно с css-shape:

введите описание изображения здесь

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

Более подробная информация о css-shapesбыла написана на: http://sarasoueidan.com/blog/css-shapes/

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

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

    от: 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/

результат

введите описание изображения здесь

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


Скрипка и пример у меня не сработали. Текст идет ниже многоугольника и остается скрытым под ним. Я тестировал с Chromium 49, Firefox 44
deathangel908

Только что видел это, это будет кошмар, чтобы заставить его реагировать.
Дамиано Челент

62

Может быть, это возможно с Content Editable ?

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

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

Небольшой пример: http://jsfiddle.net/qgfP6/5/

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

23

Вы можете работать с contenteditable div, с двумя углами 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>

Требуется дополнительная работа JS, чтобы позаботиться обо всех различных случаях использования. Но основа есть.
Гидон

20

Вы также можете сделать это с помощью CSS Regions

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

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

введите описание изображения здесь

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

FIDDLE

Таким образом, вы можете придать текстовой форме форму, пропустив текст через 2 области, и отредактировать его, добавив contenteditable к содержимому.

наценка

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

Результат:

введите описание изображения здесь

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


1
Ницца! Хотя он почти не поддерживается (большинству пользователей не нужно получать Chrome Canary и включать экспериментальные флаги для использования веб-сайта), это определенно так, как «должно» быть сделано
markasoftware

Действительно ... К сожалению, он еще не работает на Firefox (даже на Alpha) и других, и имеет неприятный запах префиксов вендоров :( Но этот метод интересен и должен использоваться через несколько месяцев / лет.
Максим Лоран

регионы css, формы css, фильтры css ... что еще там есть ик
Мухаммед Умер

@MuhammadUmer ... css
excmissions

18

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

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

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

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

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

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
Нет, вы ошибаетесь. Даже он использовал divs вместо textarea. Потому что текстовая область не может быть изменена в форме! :) @Markasoftware Так что вы не правы при голосовании этого ответа! .. так как это тот же ответ, что и его. Единственное, чего здесь нет, это изображение и код для создания редактируемого div с этой формой!
Афзаал Ахмад Зеешан

Какой? О, давай, брат, если ты хочешь удержать меня в голосе без всякой причины, добро пожаловать! Мой ответ был опубликован в: 9:58, он опубликовал ответ в 10:10: / Я был первым, кто ответил на этот вопрос .. @ Markasoftware вы можете пойти и посмотреть время для себя. Я не очень голосую только потому, что не предоставил код. Как бы то ни было, я разместил ответ в ТОП-3 ответчиков ..
Афзаал Ахмад Зеешан

На самом деле, когда я захожу на «самую старую» вкладку, это говорит о том, что твой ответ - второй самый старый
markasoftware

Это из-за того, что за это не так много проголосовало! Я всегда активен здесь, так как я могу опубликовать в последнее время? И этот был простой ответ. Так что вы можете удалить downvote? :)
Афзаал Ахмад Зеешан

5

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

Сначала вы должны включить флаг: enable-экспериментальный-веб-платформа-функции

Затем перезапустите браузер WebKit , а затем проверьте эту 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;
}

Так как же я получил эту форму многоугольника?

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

Примечания о включении флага: ( отсюда )

Чтобы включить Shapes, Regions и Blend Mode:

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


4
+1 за (хорошо документированное, структурированное) решение, стандартное или нет.
rolfl

3
@kinokijuf Вы понимаете, что таковы стандарты в наши дни, верно? В этом случае Adobe предложила форму, и Webkit был первым, кто реализовал его до сих пор. Поскольку проект редакции написан в ноябре, его, вероятно, нельзя назвать проприетарным расширением, и, насколько вам известно, в дальнейшем он будет более широко реализован и стандартизирован. Тем временем пользователи без Webkit получат прямоугольник, большое дело. (Черт, Firefox все еще требует префикса для box-sizing.)
Millimoose

5

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

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

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

FIDDLE DEMO >>


1
Скрипка не работает для меня (= текст не редактируется) в Chrome 31.0 / Windows 7.
Ilmari Karonen

@IlmariKaronen = текст не редактируется ??? на самом деле я не понял. Зачем нужно сделать его редактируемым?
Prasanth KC

5
Вопрос требует что-то вроде <textarea>(например, поле редактируемого текста), но непрямоугольной формы. Без «редактируемой» части здесь очень мало проблем - люди делали потоковый текст в HTML с момента появления плавающих изображений в HTML 2.0.
Ильмари Каронен

Скрипка обновлена ​​с возможностью редактирования содержимого. Теперь текст внутри контейнера можно редактировать.
Prasanth KC

В демоверсии я могу редактировать 2 разных текста, а не 1 весь текст. В Chrome 31.
Николас Барбулеско

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;
    }
    }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.