Как получить высоту текста внутри текстового поля

У меня есть textarea с текстом Hello World. Я хотел бы получить высоту этого текста.

Я пробовал использовать:

var element = document.getElementById('textarea');
var textHeight = element.innerHTML.offsetHeight;

и:

var textHeight = element.value.offsetHeight;

Но здесь указаны не номера текста, а высота элемента textarea.


person Adam Halasz    schedule 27.07.2010    source источник


Ответы (8)


Создайте элемент span, установите для параметра innerHTML Span значение «Hello World».
Получите значение offsetHeight диапазона.

var span = document.createElement("span");
span.innerHTML="Hello World"; //or whatever string you want.
span.offsetHeight // this is the answer

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

Ваш пример НИКОГДА не будет работать, потому что innerHTML и значение являются строками. String не определяет offsetWidth.

Если вы хотите получить высоту выделенного текста внутри текстовой области, используйте selectionStart / selectionEnd, чтобы найти выделенный текст в текстовой области.

person Warty    schedule 27.07.2010
comment
ах, так что я должен создать <span> внутри <textarea>, верно? - person Adam Halasz; 27.07.2010
comment
Нет. Диапазон вообще не нужно добавлять к документу. Он будет удален после указанного выше кода. Я также должен отметить, что код дает высоту текста с заполнением top / bot, как всегда с диапазоном / div / безотносительно. Если вам не нужен этот отступ, можно использовать CSS. - person Warty; 27.07.2010
comment
Aham: D Думаю, я понял. Дай мне попробовать. - person Adam Halasz; 27.07.2010
comment
Я не знаю: это был не я. - person Adam Halasz; 27.07.2010
comment
Также должен отметить, что ваш вопрос был неоднозначным, поэтому я переименовал его в текущее название. Вероятно, это не то, что вам нужно. Вы хотите получить высоту приветственного мира внутри текстового поля? или что? - person Warty; 27.07.2010
comment
Я хочу получить высоту текста, который я пишу в текстовом поле, ваш ответ - сложный способ сделать это, но в моем скрипте у меня есть и другие вещи, в настоящее время я над этим работаю. - person Adam Halasz; 27.07.2010
comment
Думаю, если вы расскажете, что хотите сделать с такой высотой, нам будет понятнее. Я поставил +1 к ItsWarty, так как это обычное решение, которое он предложил. - person Boris Delormas; 27.07.2010
comment
CIRK, я ответил на ваш другой вопрос об автоматически изменяемом текстовом поле с кодом макета. Это не идеально, но, надеюсь, поможет вам или любому другому разработчику, желающему попробовать. - person Warty; 27.07.2010
comment
Range тебе не поможет. Во-первых, Range не применяется к значению текстовых полей: для этого есть свойства selectionStart и selectionEnd текстового поля. Во-вторых, Range - это все об узлах и смещениях в DOM, а не о каком-либо визуальном представлении. В-третьих, Range не существует в IE (до версии 9, в которой он есть). - person Tim Down; 27.07.2010
comment
элемент span не является элементом textarea - person Andrei Cristian Prodan; 23.07.2013
comment
Диапазон должен быть добавлен к документу до того, как offsetHeight что-нибудь вернет мне. Я думаю, вам нужно добавить его туда, где это тот же стиль, что и у текстового поля, но вы не знаете, какой CSS применяется конкретно к текстовому полю, поэтому я не понимаю, как это решение на самом деле работает? - person Ally; 23.07.2013
comment
Здесь не об этом спрашивают. - person cbdeveloper; 03.04.2019

element.scrollHeight, вероятно, стоит изучить.

Если бы я собирался подойти к этому (а я это вообще не тестировал), я бы установил высоту текстового поля на 1 пиксель, измерьте высоту прокрутки, а затем сбросил бы высоту текстового поля.

https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight

person edeverett    schedule 27.07.2010
comment
Просто протестировал это, и он решил проблему, с которой у меня была scrollHeight, дающая странные значения (каждый раз, когда вы вводили / удаляли символ в IE11, высота прокрутки увеличивалась). Установив сначала высоту текстовой области на 1 пиксель, я получил необходимую высоту текста. - person LeigerGaming; 11.02.2014
comment
это замечательно, но не работает, если для текстового поля или его родительского элемента установлено значение display:none - person phil294; 16.03.2021

В jQuery нет scrollHeight, поэтому требуется небольшое обходное решение. решение будет:

var areaheight=$("textarea#element")[0].scrollHeight;
$("#element").height(areaheight);

или короче:

$("#element").height($("#element")[0].scrollHeight)
person patrick    schedule 13.03.2014
comment
Я не понимаю, почему StackOverflow позволяет людям отрицать голос без комментариев ... Я нашел этот вопрос, когда столкнулся с той же проблемой, что и OP, и решил, что решение jQuery, которое работает и которое я все еще использую сегодня, и решил опубликуйте это как ответ на случай, если другим людям понадобится то же самое. Это четкий ответ на проблему с примером кода и объяснением ... Я не получаю отрицательных голосов ?! - person patrick; 15.12.2016
comment
Я не знаю, является ли это причиной, но когда я использую этот код для обновления высоты текстового поля после ввода, он просто всегда добавляет около 15 пикселей в высоту. Если я удалю строку, она все равно увеличит текстовое поле. - person Goldentoa11; 22.01.2017
comment
Это не предназначено для динамических целей. Если вы хотите, чтобы он работал динамически, сбросьте высоту до автоматического, затем прочтите высоту прокрутки и установите эту высоту. - person patrick; 22.01.2017

Вы можете использовать element.scrollHeight (как ответил Патрик), но это требует некоторых исправлений (в примере я использую jQuery):

1) если в вашем текстовом поле есть отступы, вам нужно вычесть его (сверху и снизу).

2) если элемент уже установил высоту, вам нужно установить ее на ноль (просто для измерения, затем установите ее обратно, иначе он вернет эту высоту + отступ)

var h0 = $(element).height();  // backup height
$(this).height(0); 
var h = $(this).get(0).scrollHeight - $(this).css('paddingTop').replace('px','')*1 - $(this).css('paddingBottom').replace('px','')*1; // actual text height
$(this).height(h0); // set back original height (or new height using h)

Нет необходимости в дополнительном диапазоне с тем же CSS, что и textarea.

person Dawe    schedule 17.07.2017
comment
Понятия не имею, почему другие ответы - все неправильно! Выбираются и голосуются. Это единственный правильный ответ, который я нашел, и он действительно работает. Спасибо! - person shal; 05.02.2018
comment
Это должен быть принятый ответ. Если у вас есть 1000 текстовых полей на странице, вы действительно не хотите создавать такую ​​большую нагрузку на клиента, создавая промежутки, применяя CSS, все только для того, чтобы получить высоту текста и уничтожить, чтобы охватить. В качестве альтернативы вы не можете использовать текстовые поля и просто создать полное текстовое поле css с p и div. Но с текстовыми полями это решение работает отлично, оно увеличивается и уменьшается при вводе, даже если страница загружается с предварительно заполненным текстом (в отличие от большинства других решений, которые мне удалось найти). - person Furbeenator; 13.07.2018

Вы можете получить высоту текста, получив высоту полосы прокрутки текстового поля

const textarea = document.getElementByTagName("textarea");
const height = textarea.scrollHeight;

console.log({ height });
person Naycho334    schedule 24.11.2020

Для всех, кто использует React:

const textarea_ref = useRef(null);
const [idealHeight,setIdealHeight] = useState(0);
const [inputValue,setInputValue] = useState("");


useLayoutEffect(() => {                                           // useLayoutEffect TO AVOID FLICKERING
    textarea_ref.current.style.height = '0px';                    // NEEDS TO SET HEIGHT TO ZERO
    const scrollHeight = textarea_ref.current.scrollHeight;       // TO READ THE CORRECT SCROLL HEIGHT WHEN IT SHRINKS
    textarea_ref.current.removeAttribute('style');                // REMOVE INLINE STYLE THAT WAS ADDED WITH 0px
    setIdealHeight(scrollHeight + 2);                             // NEEDS TO ADD 2. I THINK IT'S BECAUSE OF THE BORDER
  },[inputValue]);

return (
  <textarea
    // USE idealHeight STATE TO SET THE HEIGHT
    value={inputValue}
    onChange={onChange}
    ref={textarea_ref}
  />
);

PS: Иногда все еще мерцает. По крайней мере, в Chrome.

person cbdeveloper    schedule 30.06.2020

http://www.quirksmode.org/dom/range_intro.html извините, что я больше ничем не может помочь.

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

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

person Timo Huovinen    schedule 27.07.2010

Я не уверен, правильно ли я интерпретирую ваш вопрос, но мне лично нужно было знать точную высоту каждой строки текста. Свойство line-height не имеет правильного значения (например, в Safari оно будет округлено до ближайшего значения при фактической печати текста).

Это мой обходной путь. У вас должен быть следующий код где-то в начале документа.

// set one row in the textarea and get its height
element.rows = 1;
var height1 = parseFloat(window.getComputedStyle(element)["height"]);
// set two rows in the textarea and get its height
element.rows = 2;
var height2 = parseFloat(window.getComputedStyle(element)["height"]);
// Now, the line height should be the difference
var inputLineHeight = height2-height1;

Переменная inputLineHeight должна содержать правильное значение в пикселях.

person fffred    schedule 29.12.2015