Обтікання текстом усередині типу введення = "текстовий" елемент HTML / CSS


98

HTML, показаний нижче,

<input type="text"/>

відображається у браузері приблизно так:


Коли я додаю наступний текст,

Швидкий коричневий лис перестрибнув ледачого собаку.

Використовуючи HTML нижче,

<input type="text" value="The quick brown fox jumped over the lazy dog."/>

він відображається у браузері приблизно так:


Але я хотів би, щоб він відображався у браузері так:


Я хочу, щоб текст у моєму елементі введення обернувся. Чи можна це зробити без текстової області?


3
Ні, я не думаю, що це може. Але чому текстова область не є варіантом?
Pekka

35
Використання текстового поля іноді не підходить, оскільки ви не хочете дозволяти введення кількох рядків тексту. Просто щоб обернути один рядок тексту (Примітка: Це не одне і те ж).
Flatliner DOA

Існує рішення, обговорене саме з цією метою з CSSWG щодо стандартизації, на жаль, я не можу знайти проблему.
Недійсне


1
@Pekka 웃 не те, що це актуально, але деякі причини включають: ми не можемо використовувати перевірку html5 на текстових областях; ми не можемо використовувати обмеження зразків для перевірки текстових областей; текстове поле - це непотрібний синонім для введення type = text (це введення, яке є текстовим типом!), що означає подвійний стиль, тощо тощо. Коротше кажучи, є багато причин.
Пітер Кіонга-Камау

Відповіді:


63

Це textareaробота - для багаторядкового введення тексту. The input не зробить цього ; він не був призначений для цього.

Тож використовуйте a textarea. Окрім їх візуальних відмінностей, вони отримують доступ через JavaScript однаково (використовуйте valueвластивість).

Ви можете запобігти введенню нових рядків через inputподію та просто за допомогою replace(/\n/g, '').


69
Це насправді не відповідає на питання про те, як зібрати один рядок вводу, відображаючи його загорнутим під час введення.
ehdv

3
Основною проблемою цього є те, що текстова область пригнічує кнопку переходу на мобільних пристроях.
Ден

2
@alex Саме так. Отже, якщо ви хочете справжнього багаторядкового введення, тоді текстове поле краще, але якщо ви просто хочете ввести текстове слово, тоді рішення css краще.
Ден

1
Я збирався сказати, що <textarea>це не спрацює з такими речами, як автозаповнення jQuery, а просто змініть <input>на, <textarea>і це все, що потрібно. Ура за стандарти!
Sablefoste

9
Як було сказано вище: Обтікання рядка! == багаторядковий рядок. Я не впевнений, чому це прийнята відповідь, оскільки вона не відповідає на питання.
mattLummus

38

Розрив слів буде імітувати деякий намір

    input[type=text] {
        word-wrap: break-word;
        word-break: break-all;
        height: 80px;
    }
<input type="text" value="The quick brown fox jumped over the lazy dog" />

Як обхідне рішення це рішення втратило свою ефективність у деяких браузерах. Будь ласка, перевірте демонстраційну версію: http://cssdesk.com/dbCSQ


7
Я щойно тестував його у Firefox 43.0.4, але він не працює, однак у Safari 9 та Chrome 48, здається, він працює: cssdesk.com/dbCSQ
Джейсон Сперске 02

6
Вкладене демонстраційне повідомлення від @JasonSperske не працює для мене ні у Firefox 45, ні в Chrome 50.
czerny

Демонстрація працює для мене в chrome 48 на Linux, але той самий css на моїй власній сторінці ні.
Mnebuerquo

40
Рішення застаріло принаймні з хрому 50 :(
userlond

4
Забудьте про це рішення: не працює з Chrome 74/75, Firefox 63/67, Edge 42, IE 11 та UCBrowser 7.0 (але працює з GNOME Web 3.28 - AppleWebKit / 605.1.15)
tanguy_k

10

Ви не можете використовувати введення для нього, вам потрібно використовувати текстове поле. Використовуйте textarea з wrap="soft"кодом та необов’язково решту атрибутів, як це:

<textarea name="text" rows="14" cols="10" wrap="soft"> </textarea>

Атрибути: Щоб обмежити кількість тексту в ньому, наприклад, до "40" символів, ви можете додати атрибут maxlength="40"таким чином: <textarea name="text" rows="14" cols="10" wrap="soft" maxlength="40"></textarea> щоб приховати стиль прокрутки для нього. якщо ви використовуєте лише overflow:scroll;або overflow:hidden;або overflow:auto;це вплине лише на одну смугу прокрутки. Якщо вам потрібні різні атрибути для кожної смуги прокрутки, використовуйте такі атрибути overflow:scroll; overflow-x:auto; overflow-y:hidden;в області стилів: Щоб зробити область тексту неможливою для зміни, ви можете використовувати стиль resize:none;таким чином:

<textarea name="text" rows="14" cols="10" wrap="soft" maxlength="40" style="overflow:hidden; resize:none;></textarea>

Таким чином, ви можете мати або приклад текстового поля з 14 рядками та 10 колами з перенесенням слів та максимальною довжиною символів "40" символів, яке працює точно так, як це робить текстове поле введення, але замість рядків і без використання вхідного тексту.

ПРИМІТКА: textarea працює з рядками, на відміну від вхідних даних, <input type="text" name="tbox" size="10"></input>які створені для того, щоб взагалі не працювати з рядками.


7

Щоб створити введення тексту, значення якого під капотом - це однорядковий рядок, але представлене користувачеві у форматі із заголовком слів, ви можете використовувати атрибут contenteditable на <div>іншому елементі:

const el = document.querySelector('div[contenteditable]');

// Get value from element on input events
el.addEventListener('input', () => console.log(el.textContent));

// Set some value
el.textContent = 'Lorem ipsum curae magna venenatis mattis, purus luctus cubilia quisque in et, leo enim aliquam consequat.'
div[contenteditable] {
  border: 1px solid black;
  width: 200px;
}
<div contenteditable></div>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.