2016-09-12 9 views
0

яваскрипта Рассмотрим следующий фрагмент HTML:Сделать ширина входного тега без

<input><ul> 

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

Я хочу оставить тег ввода по умолчанию, а затем сделать ширину списка соответствующей ширины. Я мог бы, конечно, использовать getComputedStyle для JavaScript. Теоретически это вызовет проблемы, если пользователь отключит JavaScript, но на практике я фактически кодирую (очень минималистичный) виджет автозаполнения (например, в Википедии, но менее причудливый), поэтому он не будет работать без JavaScript в любом случае.

Но все же: это возможно? Я ничего не знаю о CSS, так что простите меня, если это будет очевидно.

+0

Интересный вопрос. Вы можете использовать встроенный стиль блока (добавление обертки, которая является встроенным блоком вокруг списка и ввода), но если текст элемента списка слишком длинный, он расширит ширину. Что вы хотите сделать в этом сценарии? https://jsfiddle.net/s8dujmto/ –

ответ

1

Обычно, вы могли бы сделать это с оберточной элементом, установленным в display:table или display:table-cell (это не имеет значения, анонимный объект будет создан для другой) вместе с очень малая указанная ширина. Используемая ширина обертки будет вынуждена быть по крайней мере такой же широкой, как и поле ввода, а затем список будет соответствовать этому.

(Демонстрационная CSS и HTML разметки заимствованы из ответа Джозефа Marikle в)

.wrapper { 
 
    display: table; 
 
    width:1px; 
 
} 
 

 
/* for demo only */ 
 
ul{list-style-type:none;padding:0;margin:0;background:#ae0}.wrapper{margin-bottom:1em;}
<div class="wrapper"> 
 
    <input> 
 
    <ul> 
 
    <li>test 1</li> 
 
    <li>test 2</li> 
 
    <li>test 3</li> 
 
    </ul> 
 
</div> 
 
<br> 
 
<div class="wrapper"> 
 
    <input> 
 
    <ul> 
 
    <li>test 1</li> 
 
    <li>test 2 tetts 3 stsdgsdf stsdgsdf</li> 
 
    <li>test 3</li> 
 
    </ul> 
 
</div>

+0

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

+0

Попробуйте 'white-space: nowrap', чтобы предотвратить обертывание –

-1

попробовать

<ul style = "width: 40px"> // изменение 40px шириной соответствия

+0

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

+1

Попробуйте установить ширину ввода так же, как и ширину ul. Было бы проще исправить это демо, попробуйте использовать jsfiddle или codepen;) –

+0

Но тогда, если я нахожу, что браузер A имеет ширину по умолчанию 144px, а Browser B имеет ширину по умолчанию 72px, а Browser C имеет по умолчанию ширина 288 пикселей? Есть много странных браузеров: lynx, мобильные браузеры и т. Д. Не говоря уже о том, что есть пользователи, которые меняют настройки браузера по умолчанию, используют пользовательские таблицы стилей и так далее. –

1

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

.wrapper { 
 
    display: inline-flex; 
 
    flex-direction: column; 
 
} 
 

 
/* for demo only */ 
 
ul{list-style-type:none;padding:0;margin:0;background:#ae0}.wrapper{margin-bottom:1em;}
<div class="wrapper"> 
 
    <input> 
 
    <ul> 
 
    <li>test 1</li> 
 
    <li>test 2</li> 
 
    <li>test 3</li> 
 
    </ul> 
 
</div> 
 
<br> 
 
<div class="wrapper"> 
 
    <input> 
 
    <ul> 
 
    <li>test 1</li> 
 
    <li>test 2 tetts 3 stsdgsdf stsdgsdf</li> 
 
    <li>test 3</li> 
 
    </ul> 
 
</div>

+0

Это ОЧЕНЬ интересный эффект, который вы создали. Я никогда не видел виджета автозаполнения, который работает таким образом, но теперь я задаюсь вопросом, может быть, ваш путь лучше, а все остальные делают это «неправильно». Ваш путь имеет ширину по умолчанию ширины входного тега, но если список имеет несколько широких элементов, то он растягивается, а тег ввода растягивается вместе с ними. Однако я беспокоюсь, что это может быть немного дезориентирующим. Тэги ввода обычно не растягиваются и не сжимаются. Тем не менее, если никто не придет к ответу ближе к тому, что я спросил, я соглашусь с этим. Это действительно здорово. –

+0

@MarkVY Я бы не сказал, что каждый делает это неправильно как таковое.Это больше похоже на flexbox - это кровоточащий край того, что приемлемо в производственном кодексе сейчас. Только недавно основные платформы, такие как twitter bootstrap и Semantic UI (я думаю?), Полагались на него. Для действительно хорошей обратной совместимости вам нужно будет использовать javascript. Просто нет другого способа, который я знаю, чтобы сделать это надежно без flexbox или javascript. –

+0

Нет, я не имею в виду о flexbox. Я имею в виду эффект, когда тег ввода растягивается для размещения самого широкого элемента списка. Я никогда не видел виджета автозаполнения, который это делает. (См., Например, Wikipedia или Google: оба они исправлены, даже если предложение не подходит.) –