Tự động điều chỉnh tỷ lệ đầu vào [type = text] thành chiều rộng của giá trị?


85

Có cách nào để chia tỷ lệ chiều rộng của an <input type="text">thành chiều rộng của giá trị thực không?

input {
  display: block;
  margin: 20px;
  width: auto;
}
<input type="text" value="I've had enough of these damn snakes, on this damn plane!" />

<input type="text" value="me too" />


Câu trả lời:


86

Bạn có thể thực hiện việc này một cách dễ dàng bằng cách đặt sizethuộc tính thành độ dài của nội dung đầu vào:

function resizeInput() {
    $(this).attr('size', $(this).val().length);
}

$('input[type="text"]')
    // event handler
    .keyup(resizeInput)
    // resize on page load
    .each(resizeInput);

Xem: http://jsfiddle.net/nrabinowitz/NvynC/

Điều này dường như thêm một số phần đệm ở bên phải mà tôi nghi ngờ là phụ thuộc vào trình duyệt. Nếu bạn muốn nó thực sự chặt chẽ với đầu vào, bạn có thể sử dụng một kỹ thuật như kỹ thuật tôi mô tả trong câu trả lời liên quan này , sử dụng jQuery để tính toán kích thước pixel cho văn bản của bạn.


23
"Phần đệm ở bên phải" không phụ thuộc vào trình duyệt, đó là vì kích thước của phần tử được chỉ định bằng các ký tự, nhưng đối với nhiều phông chữ, không phải tất cả các ký tự đều có cùng chiều rộng. Điền vào trường của bạn với 'iiiiiiiiiii' bằng phông chữ có độ rộng thay đổi và bạn sẽ thấy vấn đề rõ ràng hơn.
Đánh dấu

@Mark - Đã đúng, nhưng phần phụ thuộc vào trình duyệt là cách diễn giải thuộc tính "size" - Tôi không nghĩ chiều rộng chính xác là tiêu chuẩn trên các trình duyệt.
nrabinowitz

... hãy thử nó với phông chữ monospace và bạn sẽ thấy vẫn có phần đệm phù hợp trong một số trình duyệt: jsfiddle.net/nrabinowitz/NvynC/151
nrabinowitz

@nrabinowitz Xem jsfiddle.net/NvynC/662 để biết một sửa đổi nhỏ bổ sung giá trị MAX cần thiết trong hầu hết các trường hợp.
GJ

1
mã đẹp, tôi nghĩ tốt hơn nên sử dụng Courier Newphông chữ cho hộp văn bản, vì chiều rộng của tất cả các ký tự trong phông chữ này bằng nhau. ( jsfiddle.net/NabiKAZ/NvynC/745 )
Nabi KAZ

45

MỘT GIẢI PHÁP HOÀN HẢO ĐƠN GIẢN NHƯNG PIXEL

Tôi đã thấy một số cách để làm điều này nhưng việc tính toán độ rộng của phông chữ không phải lúc nào cũng chính xác 100%, nó chỉ là ước tính.

Tôi đã quản lý để tạo ra một pixel hoàn hảo để điều chỉnh chiều rộng đầu vào bằng cách có một trình giữ chỗ ẩn để đo từ đó.


jQuery (Khuyến nghị)

$(function(){
  $('#hide').text($('#txt').val());
  $('#txt').width($('#hide').width());
}).on('input', function () {
  $('#hide').text($('#txt').val());
  $('#txt').width($('#hide').width());
});
body,
#txt,
#hide{
  font:inherit;
  margin:0;
  padding:0;
}
#txt{
  border:none;
  color:#888;
  min-width:10px;
}
#hide{
  display:none;
  white-space:pre;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<p>Lorem ipsum 
  <span id="hide"></span><input id="txt" type="text" value="type here ...">
  egestas arcu.
</p>


JavaScript thuần túy

Tôi không thể xác định cách jQuery tính toán chiều rộng của các phần tử ẩn vì vậy cần phải có một chút tinh chỉnh đối với css để phù hợp với giải pháp này.

var hide = document.getElementById('hide');
var txt = document.getElementById('txt');
resize();
txt.addEventListener("input", resize);

function resize() {
  hide.textContent = txt.value;
  txt.style.width = hide.offsetWidth + "px";
}
body,
#txt,
#hide {
  font: inherit;
  margin: 0;
  padding: 0;
}

#txt {
  border: none;
  color: #888;
  min-width: 10px;
}

#hide {
  position: absolute;
  height: 0;
  overflow: hidden;
  white-space: pre;
}
<p>Lorem ipsum
  <span id="hide"></span><input id="txt" type="text" value="type here ..."> egestas arcu.
</p>


2
hoạt động tuyệt vời! Tôi vẫn muốn làm điều đó mà không có jQuerry nhưng chỉ có vani JS! đây là jsfiddle với mã trên: jsfiddle.net/kjxdr50a
Tàu đêm

3
@NightTrain Theo yêu cầu của bạn. Đã thêm giải pháp JavaScript. =)
DreamTeK 23/03/18

khi so sánh hai giải pháp jQuerry: jsfiddle.net/kjxdr50a/42 JS: jsfiddle.net/kjxdr50a/44 , giải pháp jQuerry hoạt động tốt hơn một chút vì không có trục trặc. (Tôi đã sửa nó bằng cách thêm 2 pixel) @Obsidian bạn có ổn không khi tôi trích dẫn giải pháp này trong một trong những câu hỏi của tôi, điều đó rất giống?
Chuyến tàu đêm

Cảm ơn tất cả sự giúp đỡ của bạn! Cuối cùng tôi đã triển khai được nó vào ứng dụng Angular của mình. Bản demo có thể được tìm thấy trên StackBlitz . Và Câu hỏi tôi đã hỏi liên quan đến đầu vào đáp ứng: stackoverflow.com/a/49478320/9058671 . Tôi sẽ cố gắng cải thiện mã của mình và cập nhật bản demo ..
Night Train

1
Câu trả lời tuyệt vời, tôi sẽ thêm một điều hovewer: Nếu đầu vào của bạn có phần đệm (tất nhiên phần tử ma hidephải có cùng height: 0;một phần đệm) phần sẽ không hoạt động chính xác. Một giải pháp cho vấn đề này sẽ là sử dụng position: fixed; top: -100vh;, bạn cũng có thể thêm opacity: 0;chỉ để an toàn.
Kamil Bęben

35

Nếu vì lý do nào đó mà các giải pháp khác không phù hợp với bạn, bạn có thể sử dụng một khoảng có thể thay đổi được thay vì một phần tử đầu vào.

<span contenteditable="true">dummy text</span>

Lưu ý rằng đây là một cuộc tấn công nhiều hơn và có nhược điểm nghiêm trọng là cho phép đầu vào HTML hoàn toàn không được bảo vệ như cho phép người dùng nhập (và dán) dấu ngắt dòng, liên kết và HTML khác.

Vì vậy, bạn có thể không nên sử dụng giải pháp này trừ khi bạn đang vệ sinh đầu vào rất cẩn thận ...

Cập nhật : bạn có thể muốn sử dụng giải pháp của DreamTeK bên dưới .


1
Giải pháp này xác định nhiệm vụ cho trình duyệt! Bởi cho đến nay giải pháp tốt nhất!
dùng2033412

8
người dùng có thể dán nhiều hơn chỉ ngắt dòng trong nội dung có thể chỉnh sửa. anh ta có thể dán hình ảnh, iframe, bất kỳ html nào.
CodeToad

2
Ngoài ra, việc dán văn bản được định dạng từ các trình chỉnh sửa như MS Word hoặc tệp PDF cho kết quả không mong đợi, nhìn chung việc sử dụng điều này thay vì phần tử đầu vào gốc thực sự khó và không đáng (chưa).
Senthe

7
đây thực sự là một công thức cho thảm họa
Joseph Nields

2
contenteditablelà để thiết lập trình soạn thảo văn bản WYSIWYG đa dạng thức. Không phải để thay đổi kích thước đầu vào.
Joseph Nields

10

Chỉnh sửa : Plugin hiện hoạt động với các ký tự khoảng trắng ở cuối. Cảm ơn bạn đã chỉ ra @JavaSpyder

Vì hầu hết các câu trả lời khác không phù hợp với những gì tôi cần (hoặc đơn giản là không hoạt động chút nào) nên tôi đã sửa đổi câu trả lời của Adrian B thành một plugin jQuery thích hợp dẫn đến tỷ lệ đầu vào hoàn hảo theo pixel mà không yêu cầu bạn thay đổi css hoặc html của mình.

Ví dụ: https://jsfiddle.net/587aapc2/

Sử dụng:$("input").autoresize({padding: 20, minWidth: 20, maxWidth: 300});

Cắm vào:

//JQuery plugin:
$.fn.textWidth = function(_text, _font){//get width of text with font.  usage: $("div").textWidth();
        var fakeEl = $('<span>').hide().appendTo(document.body).text(_text || this.val() || this.text()).css({font: _font || this.css('font'), whiteSpace: "pre"}),
            width = fakeEl.width();
        fakeEl.remove();
        return width;
    };

$.fn.autoresize = function(options){//resizes elements based on content size.  usage: $('input').autoresize({padding:10,minWidth:0,maxWidth:100});
  options = $.extend({padding:10,minWidth:0,maxWidth:10000}, options||{});
  $(this).on('input', function() {
    $(this).css('width', Math.min(options.maxWidth,Math.max(options.minWidth,$(this).textWidth() + options.padding)));
  }).trigger('input');
  return this;
}



//have <input> resize automatically
$("input").autoresize({padding:20,minWidth:40,maxWidth:300});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input value="i magically resize">
<br/><br/>
called with:
$("input").autoresize({padding: 20, minWidth: 40, maxWidth: 300});


1
Giải pháp tuyệt vời, nhưng dường như không tính đến dấu cách ở cuối (thêm một loạt dấu cách vào đầu vào)
SpyderScript

1
Lưu ý, nó không hoạt động với Firefox vì fontlà một viết tắt CSS (kỳ lạ là FF không thể xử lý nó ). Bạn có thể khắc phục điều này bằng cách định nghĩa trong hàm đầu tiên: var _this_font = [this.css('font-style'), this.css('font-variant'), this.css('font-weight'), 'normal', this.css('font-size') + ' / ' + this.css('line-height'), this.css('font-family')].join(' ');. Sau đó, thay đổi this.css('font')để được _this_font.
Garrett

@Garrett, cảm ơn rất nhiều vì bản sửa lỗi Firefox đó. Bạn đã tiết kiệm cho tôi rất nhiều thời gian.
maiko

8

Tôi có một plugin jQuery trên GitHub: https://github.com/MartinF/jQuery.Autosize.Input

Nó phản ánh giá trị của đầu vào, tính toán chiều rộng và sử dụng nó để thiết lập chiều rộng của đầu vào.

Bạn có thể xem một ví dụ trực tiếp tại đây: http://jsfiddle.net/mJMpw/2175/

Ví dụ về cách sử dụng nó (vì cần một số mã khi đăng liên kết jsfiddle):

<input type="text" value="" placeholder="Autosize" data-autosize-input='{ "space": 40 }' />

input[type="data-autosize-input"] {
  width: 90px;
  min-width: 90px;
  max-width: 300px;
  transition: width 0.25s;    
}

Bạn chỉ cần sử dụng css để đặt chiều rộng tối thiểu / tối đa và sử dụng hiệu ứng chuyển tiếp trên chiều rộng nếu bạn muốn có hiệu ứng đẹp.

Bạn có thể chỉ định khoảng trắng / khoảng cách đến cuối là giá trị trong ký hiệu json cho thuộc tính data-autosize-input trên phần tử đầu vào.

Tất nhiên bạn cũng có thể khởi tạo nó bằng jQuery

$("selector").autosizeInput();

6

Đã có rất nhiều câu trả lời hay ở đây. Để giải trí, tôi đã thực hiện giải pháp này bên dưới, dựa trên các câu trả lời khác và ý tưởng của riêng tôi.

<input class="adjust">

Yếu tố đầu vào được điều chỉnh pixel chính xác và có thể xác định độ lệch bổ sung.

function adjust(elements, offset, min, max) {

    // Initialize parameters
    offset = offset || 0;
    min    = min    || 0;
    max    = max    || Infinity;
    elements.each(function() {
        var element = $(this);

        // Add element to measure pixel length of text
        var id = btoa(Math.floor(Math.random() * Math.pow(2, 64)));
        var tag = $('<span id="' + id + '">' + element.val() + '</span>').css({
            'display': 'none',
            'font-family': element.css('font-family'),
            'font-size': element.css('font-size'),
        }).appendTo('body');

        // Adjust element width on keydown
        function update() {

            // Give browser time to add current letter
            setTimeout(function() {

                // Prevent whitespace from being collapsed
                tag.html(element.val().replace(/ /g, '&nbsp'));

                // Clamp length and prevent text from scrolling
                var size = Math.max(min, Math.min(max, tag.width() + offset));
                if (size < max)
                    element.scrollLeft(0);

                // Apply width to element
                element.width(size);
            }, 0);
        };
        update();
        element.keydown(update);
    });
}

// Apply to our element
adjust($('.adjust'), 10, 100, 500);

Quá trình điều chỉnh sẽ được thực hiện trơn tru với quá trình chuyển đổi CSS.

.adjust {
    transition: width .15s;
}

Đây là trò chơi . Tôi hy vọng điều này có thể giúp những người khác đang tìm kiếm một giải pháp sạch.


4

Thay vì cố gắng tạo một div và đo chiều rộng của nó, tôi nghĩ đo chiều rộng trực tiếp bằng cách sử dụng phần tử canvas sẽ chính xác hơn.

function measureTextWidth(txt, font) {
    var element = document.createElement('canvas');
    var context = element.getContext("2d");
    context.font = font;
    return context.measureText(txt).width;
}

Bây giờ bạn có thể sử dụng điều này để đo chiều rộng của một số phần tử đầu vào bất kỳ lúc nào bằng cách thực hiện điều này:

// assuming inputElement is a reference to an input element (DOM, not jQuery)
var style = window.getComputedStyle(inputElement, null);
var text = inputElement.value || inputElement.placeholder;
var width = measureTextWidth(text, style.font);

Điều này trả về một số (có thể là dấu phẩy động). Nếu bạn muốn tính đến padding, bạn có thể thử cách này:

  var desiredWidth = (parseInt(style.borderLeftWidth) +
      parseInt(style.paddingLeft) +
      Math.ceil(width) +
      1 + // extra space for cursor
      parseInt(style.paddingRight) +
      parseInt(style.borderRightWidth))
  inputElement.style.width = desiredWidth + "px";

3

Bạn có thể giải quyết vấn đề này như ở đây :) http://jsfiddle.net/MqM76/217/

HTML:

<input id="inpt" type="text" />
<div id="inpt-width"></div>

JS:

$.fn.textWidth = function(text, font) {
    if (!$.fn.textWidth.fakeEl) $.fn.textWidth.fakeEl =      $('<span>').hide().appendTo(document.body);
    $.fn.textWidth.fakeEl.text(text || this.val() || this.text()).css('font', font || this.css('font'));
    return $.fn.textWidth.fakeEl.width(); 
};

$('#inpt').on('input', function() {
    var padding = 10; //Works as a minimum width
    var valWidth = ($(this).textWidth() + padding) + 'px';
    $('#'+this.id+'-width').html(valWidth);
    $('#inpt').css('width', valWidth);
}).trigger('input');

3

Thật không may, sizethuộc tính sẽ không hoạt động rất tốt. Đôi khi sẽ có thêm không gian và quá ít không gian, tùy thuộc vào cách thiết lập phông chữ. (xem ví dụ)

Nếu bạn muốn điều này hoạt động tốt, hãy thử xem các thay đổi trên đầu vào và sau đó thay đổi kích thước. Bạn có thể muốn đặt nó thành đầu vào scrollWidth. Chúng tôi cũng cần tính đến kích thước hộp.

Trong ví dụ sau, tôi đang đặt giá sizetrị đầu vào thành 1 để ngăn nó có giá trị scrollWidthlớn hơn chiều rộng ban đầu của chúng tôi (đặt thủ công bằng CSS).

// (no-jquery document.ready)
function onReady(f) {
    "complete" === document.readyState
        ? f() : setTimeout(onReady, 10, f);
}

onReady(function() {
    [].forEach.call(
        document.querySelectorAll("input[type='text'].autoresize"),
        registerInput
    );
});
function registerInput(el) {
    el.size = 1;
    var style = el.currentStyle || window.getComputedStyle(el),
        borderBox = style.boxSizing === "border-box",
        boxSizing = borderBox
            ? parseInt(style.borderRightWidth, 10) +
                parseInt(style.borderLeftWidth, 10)
            : 0;
    if ("onpropertychange" in el) {
         // IE
         el.onpropertychange = adjust;
    } else if ("oninput" in el) {
         el.oninput = adjust;
    }
    adjust();

    function adjust() {

        // reset to smaller size (for if text deleted) 
        el.style.width = "";

        // getting the scrollWidth should trigger a reflow
        // and give you what the width would be in px if 
        // original style, less any box-sizing
        var newWidth = el.scrollWidth + boxSizing;

        // so let's set this to the new width!
        el.style.width = newWidth + "px";
    }
}
* {
  font-family: sans-serif;
}
input.autoresize {
  width: 125px;
  min-width: 125px;
  max-width: 400px;
}
input[type='text'] {
  box-sizing: border-box;
  padding: 4px 8px;
  border-radius: 4px;
  border: 1px solid #ccc;
  margin-bottom: 10px;
}
<label> 
  Resizes:
  <input class="autoresize" placeholder="this will resize" type='text'>
</label>
<br/>
<label>
  Doesn't resize:
<input placeholder="this will not" type='text'>
</label>
<br/>
<label>
  Has extra space to right:
  <input value="123456789" size="9" type="text"/>
</label>

Tôi nghĩ rằng điều này sẽ hoạt động ngay cả trong IE6, nhưng đừng coi thường nó.

Tùy thuộc vào trường hợp sử dụng của bạn, bạn có thể cần phải liên kết chức năng điều chỉnh với các sự kiện khác. Ví dụ: thay đổi giá trị của đầu vào theo chương trình hoặc thay đổi thuộc tính kiểu của phần tử displaytừ none(where scrollWidth === 0) thành blockhoặc inline-block, v.v.


3

Tôi đã tìm thấy một giải pháp khác cho vấn đề này không liên quan đến JS. Trong HTML, tôi chỉ đặt một cái gì đó như:

<div>
  <input class="input" value={someValue} />
  <div class="ghost-input">someValue</div>
</div>

Tất cả những gì cần thiết là đặt khả năng hiển thị: ẩn trên đầu vào ma và chiều rộng: 100% trên chính đầu vào. Nó hoạt động vì đầu vào mở rộng đến 100% vùng chứa của nó mà chiều rộng được tính toán bởi chính trình duyệt (dựa trên cùng một văn bản).

Nếu bạn thêm một số đệm và đường viền vào trường nhập, bạn phải điều chỉnh lớp nhập ma của mình cho phù hợp (hoặc sử dụng calc () trong lớp đầu vào).


1

Plugin jQuery của tôi phù hợp với tôi:

Sử dụng:

    $('form input[type="text"]').autoFit({

    });

Mã nguồn của jquery.auto-fit.js:

;
(function ($) {
    var methods = {
        init: function (options) {
            var settings = $.extend(true, {}, $.fn.autoFit.defaults, options);
            var $this = $(this);

            $this.keydown(methods.fit);

            methods.fit.call(this, null);

            return $this;
        },

        fit: function (event) {
            var $this = $(this);

            var val = $this.val().replace(' ', '-');
            var fontSize = $this.css('font-size');
            var padding = $this.outerWidth() - $this.width();
            var contentWidth = $('<span style="font-size: ' + fontSize + '; padding: 0 ' + padding / 2 + 'px; display: inline-block; position: absolute; visibility: hidden;">' + val + '</span>').insertAfter($this).outerWidth();

            $this.width((contentWidth + padding) + 'px');

            return $this;
        }
    };

    $.fn.autoFit = function (options) {
        if (typeof options == 'string' && methods[options] && typeof methods[options] === 'function') {
            return methods[options].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof options === 'object' || !options) {
            // Default to 'init'
            return this.each(function (i, element) {
                methods.init.apply(this, [options]);
            });
        } else {
            $.error('Method ' + options + ' does not exist on jquery.auto-fit.');
            return null;
        }
    };

    $.fn.autoFit.defaults = {};

})(this['jQuery']);

Tại sao bạn bắt đầu bằng dấu chấm phẩy trong jquery.auto-fit.js ? Tại sao không có dấu chấm phẩy trong dòng "$ this.keydown (method.fit)"?
Peter Mortensen,

1
@PeterMortensen, cảm ơn bạn đã xem xét cẩn thận. Tôi đã thêm dấu chấm phẩy bên cạnh dòng bạn đề cập, nó đã bị mất. Đối với dấu chấm phẩy bắt đầu, tôi chỉ có thói quen tránh các sự cố do một số tệp khác không kết thúc bằng dấu chấm phẩy gây ra.
Jeff Tian

0

Các phần tử đầu vào hoạt động khác với các phần tử khác, điều này sẽ làm đúng như những gì bạn muốn nếu bạn cung cấp cho chúng float: left(xem http://jsfiddle.net/hEvYj/5/ ). Tôi không nghĩ rằng điều đó là khả thi nếu không tính toán nó theo một cách nào đó bằng JavaScript (tức là thêm 5px vào chiều rộng mỗi chữ cái trong hộp).


0

Giải pháp của người dùng nrabinowitz đang hoạt động tốt, nhưng tôi sử dụng keypresssự kiện thay vì keyup. Điều đó làm giảm độ trễ nếu người dùng nhập chậm.


sử dụng oninput(hoặc onpropertychangecho IE cũ) là sự kiện chính xác, vì họ phản hồi những thứ như dán bằng một cú nhấp chuột phải hoặc chọn "Tệp -> dán" từ thanh menu của trình duyệt
Joseph Nields

0

Đây là sửa đổi của tôi về giải pháp nrabinowitz ' . Tôi đã không sử dụng thuộc tính kích thước , vì nó không hoàn hảo với các phông chữ tỷ lệ như @Mark đã lưu ý. Giải pháp của tôi đặt một phần tử sau đầu vào của bạn và được trình duyệt tính chiều rộng (sử dụng jQuery).

Mặc dù tôi không kiểm tra nó, tôi cho rằng nó sẽ hoạt động chỉ khi tất cả các thuộc tính CSS ảnh hưởng đến phông chữ được kế thừa.

Các đầu vào chiều rộng thay đổi nào trên focusout sự kiện, hoạt động tốt hơn cho tôi. Nhưng bạn cũng có thể sử dụng tổ hợp phím / nhấn phím để thay đổi độ rộng của đầu vào khi nhập.

function resizeInput() {

    //Firstly take the content or placeholder if content is missing.
    var content =
        $(this).val().length > 0 ? $(this).val() : $(this).prop("placeholder");

    //Create testing element with same content as input.
    var widthTester = $("<span>"+content+"</span>").hide();

    //Place testing element into DOM after input (so it inherits same formatting as input does).
    widthTester.insertAfter($(this));

    //Set inputs width; you may want to use outerWidth() or innerWidth()
    //depending whether you want to count padding and border or not.
    $(this).css("width",widthTester.width()+"px");

    //Remove the element from the DOM
    widthTester.remove();
 }

 $('.resizing-input').focusout(resizeInput).each(resizeInput);

0

Sử dụng canvas, chúng tôi có thể tính toán chiều rộng các phần tử:

function getTextWidth(text, fontSize, fontName) {
  let canvas = document.createElement('canvas');
  let context = canvas.getContext('2d');
  context.font = fontSize + fontName;
  return context.measureText(text).width;
}

và sử dụng nó vào sự kiện đã chọn:

function onChange(e) {
  let width = getTextWidth(this.value, $(this).css('font-size'), 
  $(this).css('font-family'));
  $(this.input).css('width', width);
}

0

thử giải pháp canvas MeasureText

css:

    input{
        min-width:10px!important;
        max-width:99.99%!important;
        transition: width 0.1s;
        border-width:1px;
    }

javascript:

function getWidthOfInput(input){
    var canvas = document.createElement('canvas');
    var ctx = canvas.getContext('2d');
    var text = input.value.length ? input.value : input.placeholder;
    var style = window.getComputedStyle(input);
    ctx.lineWidth = 1;
    ctx.font = style.font;
    var text_width = ctx.measureText(text).width;
    return text_width;
}

function resizable (el, factor) {
    function resize() {
        var width = getWidthOfInput(el);
        el.style.width = width + 'px';
    }
    var e = 'keyup,keypress,focus,blur,change'.split(',');
    for (var i in e){
        el.addEventListener(e[i],resize,false);
    }
    resize();
}

$( "input" ).each( function(i){
    resizable(this);
});

0

Tôi đã giải quyết chiều rộng tạo canvas và tính toán kích thước của nó. điều quan trọng là giá trị đầu vào và canvas có chung các đặc điểm phông chữ (họ, kích thước, trọng lượng ...)

import calculateTextWidth from "calculate-text-width";

/*
 requires two props "value" and "font"
  - defaultFont: normal 500 14px sans-serif 
 */
const defaultText = 'calculate my width'
const textFont = 'normal 500 14px sans-serif'
const calculatedWidth = calculateTextWidth(defaultText, textFont)
console.log(calculatedWidth) // 114.37890625

GitHub: https://github.com/ozluy/calculate-text-width CodeSandbox: https://codesandbox.io/s/calculate-text-width-okr46

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.