Я написал этот ответ для другого потока, который только что был закрыт как дубликат этого. Проблема с этими ответами заключается в том, что они немного сложны и используют жестко закодированные значения дополнений, которые могут быть ненадежными. Вот мое решение, которое не требует каких-либо жестко закодированных.
Несмотря на то, что CSS и HTML не существует, достаточно простой способ сделать это - создать скрытый выберите, установите его только для выбранного значения, и возьмите эту ширину и установите ее на видимый выбор.
Выбор манекена в основном просто надежный метод для измерения того, насколько он должен быть.
Добавьте эту логику к «изменению», и она должна быть хорошей и вручную запускать ее один раз, затем вы должны быть хорошими.
const select = document.querySelector('select');
select.addEventListener('change', function() {
const dummySelect = document.createElement('select');
dummySelect.classList.add('dummy');
const dummyOption = document.createElement('option');
dummyOption.innerHTML = this.value;
dummySelect.appendChild(dummyOption);
document.body.appendChild(dummySelect);
select.style.width = `${dummySelect.offsetWidth}px`;
document.body.removeChild(dummySelect);
});
// Trigger for the first time
select.dispatchEvent(new Event('change'));
select {
display: inline;
}
.dummy {
position: absolute;
left: -10000px;
}
<select>
<option>A</option>
<option>A much longer title</option>
<option>Middleground</option>
</select>
Это указатель на указатель. Для более подробной информации вы можете проверить: Указатель на указатель
РЕДАКТИРОВАТЬ Это может быть полезно, например, для динамического выделения многомерных массивов:
Как:
#include <stdlib.h>
int **array;
array = malloc(nrows * sizeof(int *));
if(array == NULL)
{
fprintf(stderr, "out of memory\n");
exit or return
}
for(i = 0; i < nrows; i++)
{
array[i] = malloc(ncolumns * sizeof(int));
if(array[i] == NULL)
{
fprintf(stderr, "out of memory\n");
exit or return
}
}
Это означает, что переменная разыменовывается дважды. Предположим, у вас есть указатель на указатель на символ, например:
char ** variable = ...;
Если вы хотите получить доступ к значению, на которое указывает указатель, вы должны разыменовываем его дважды:
** переменная
это указатель на указатель. например, если * x означает, что он будет содержать адрес некоторой переменной, чем, если я скажу, что m = & amp; x, чем m, отображается как int ** m
Это указатель на указатель. Вы можете использовать это, если хотите указать на array
или const char *
(строку). Кроме того, в Objective-C с какао это часто используется для указания на NSError*
.
Указатель на указатель при объявлении переменной.
Удаление двойного указателя при использовании вне объявления.
** переменная - двойное разыменование. Если переменная является адресом адреса, полученное выражение будет lvalue по адресу, хранящемуся в переменной *.
Это может означать разные вещи, если является частью объявления:
переменная типа ** будет означать, с другой стороны, указатель на указатель, то есть переменную, которая может содержать адрес другого переменная, которая также является указателем, но на этот раз на переменную типа 'type'
** - указатель на указатель. Иногда они используются для массивов строк.
В объявлении это означает, что это указатель на указатель:
int **x; // declare x as a pointer to a pointer to an int
При использовании он задерживает его дважды:
int x = 1;
int *y = &x; // declare y as a pointer to x
int **z = &y; // declare z as a pointer to y
**z = 2; // sets the thing pointed to (the thing pointed to by z) to 2
// i.e., sets x to 2
Это означает, что переменная является указателем на указатель.
Вы можете использовать cdecl для объяснения C-типов.
Здесь есть онлайн интерфейс: http://cdecl.org/ . Введите "int ** x" в текстовое поле и проверьте результат.