Вот еще один подход, который работал для меня:
<style>
select.limited-width {
width: 200px;
position: static;
}
select.expanded-width {
width: auto;
position: absolute;
}
</style>
<select class="limited-width"
onMouseDown="if(document.all) this.className='expanded-width';"
onBlur="if(document.all) this.className='limited-width';"
onChange="if(document.all) this.className='limited-width';">
<option>A normal option</option>
<option>A really long option which messes everything up</option>
</select>
Переключаясь в положение: абсолютное, вы удаляете элемент из потока страниц, что помогает, если вы обнаружите, что поле выбора перемещается при его развертывании.
Я решил положиться на сниффинг document.all в качестве проверки IE, поскольку он сохраняет компактность и устраняет необходимость в отдельной функции. Если это не работает для вас, определите функцию в условных комментариях IE и вызовите ее вместо этого.
Одна маленькая ошибка, если вы выберете тот же элемент, он не будет уменьшаться снова, пока вы не переместите фокус на другой элемент, я называю это функцией; -)