Выберите раскрывающийся список с фиксированной шириной, обрезая содержимое в IE - PullRequest
54 голосов
/ 25 марта 2009

выпуск:

Некоторые элементы в выбранном элементе требуют более указанной ширины в 145 пикселей для полного отображения.

Поведение Firefox : при нажатии на кнопку выбора открывается раскрывающийся список элементов, настроенный по ширине самого длинного элемента.

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

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

Любые советы по решению проблемы с IE?

Верхний элемент должен оставаться шириной 145px даже при расширении списка.

Спасибо!

Css:

select.center_pull {
    background:#eeeeee none repeat scroll 0 0;
    border:1px solid #7E7E7E;
    color:#333333;
    font-size:12px;
    margin-bottom:4px;
    margin-right:4px;
    margin-top:4px;
    width:145px;
}

Вот выбранный входной код (в настоящее время нет определения стиля backend_dropbox)

<select id="select_1" class="center_pull backend_dropbox" name="select_1">
<option value="-1" selected="selected">Browse options</option>
<option value="-1">------------------------------------</option>
<option value="224">Option 1</option>
<option value="234">Longer title for option 2</option>
<option value="242">Very long and extensively descriptive title for option 3</option>
</select>

Полная HTML-страница, если вы хотите быстро протестировать в браузере:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>dropdown test</title>

<style type="text/css">
<!--
select.center_pull {
    background:#eeeeee none repeat scroll 0 0;
    border:1px solid #7E7E7E;
    color:#333333;
    font-size:12px;
    margin-bottom:4px;
    margin-right:4px;
    margin-top:4px;
    width:145px;
}
-->
</style>
</head>

<body>
<p>Select width test</p>
<form id="form1" name="form1" method="post" action="">
<select id="select_1" class="center_pull backend_dropbox" name="select_1">
<option value="-1" selected="selected">Browse options</option>
<option value="-1">------------------------------------</option>
<option value="224">Option 1</option>
<option value="234">Longer title for option 2</option>
<option value="242">Very long and extensively descriptive title for option 3</option>
</select>
</form>
</body>
</html>

Ответы [ 23 ]

29 голосов
/ 22 декабря 2010

Для IE 8 существует простое решение на основе чистого CSS:

select:focus {
    width: auto;
    position: relative;
}

(Необходимо установить свойство position, если поле выбора является дочерним для контейнера с фиксированной шириной.)

К сожалению, IE 7 и менее не поддерживают: селектор фокуса.

10 голосов
/ 30 декабря 2010

Я сделал Google по этой проблеме, но не нашел лучшего решения, поэтому создал решение, которое отлично работает во всех браузерах.

просто вызовите функцию badFixSelectBoxDataWidthIE () при загрузке страницы.

function badFixSelectBoxDataWidthIE(){
    if ($.browser.msie){
      $('select').each(function(){
    if($(this).attr('multiple')== false){
      $(this)
          .mousedown(function(){
               if($(this).css("width") != "auto") {
                   var width = $(this).width();
                   $(this).data("origWidth", $(this).css("width"))
                          .css("width", "auto");
                   /* if the width is now less than before then undo */
                   if($(this).width() < width) {
        $(this).unbind('mousedown');
                       $(this).css("width", $(this).data("origWidth"));
                   }
               }
           })
           /* Handle blur if the user does not change the value */
           .blur(function(){
               $(this).css("width", $(this).data("origWidth"));

           })
           /* Handle change of the user does change the value */
           .change(function(){
               $(this).css("width", $(this).data("origWidth"));

           });
        }
      });
    }
    }
7 голосов
/ 10 февраля 2011

Для простого решения без Javascript добавление атрибута title к вашим

s, содержащим текст, может быть достаточно, в зависимости от ваших требований.
<option value="242" title="Very long and extensively descriptive text">
  Very long and extensively descriptive text
</option>

Это покажет обрезанный текст в виде всплывающей подсказки при наведении на

, независимо от ширины
7 голосов
/ 25 марта 2009

Вот небольшой скрипт, который должен вам помочь:

http://www.icant.co.uk/forreview/tamingselect/

3 голосов
/ 06 октября 2011

Просто вы можете использовать этот плагин для jquery;)

http://plugins.jquery.com/project/skinner

$(function(){
          $('.select1').skinner({'width':'200px'});
});
3 голосов
/ 17 июля 2009

Боюсь, не без javascript, но мне удалось сделать его довольно маленьким, используя jQuery

$('#del_select').mouseenter(function () {

    $(this).css("width","auto");

});

$('#del_select').mouseout(function () {

    $(this).css("width","170px");

}); 
2 голосов
/ 02 мая 2012

Небольшое, но, надеюсь, полезное обновление кода от MainMa & user558204 (спасибо, ребята), которое удаляет ненужный каждый цикл, сохраняет копию $ (this) в переменной в каждом обработчике событий, так как он используется более одного раза, также объединили события размытия и изменения, поскольку они выполняли одно и то же действие.

Да, он все еще не совершенен, так как изменяет размер элемента select, а не только выпадающих опций. Но, эй, это вытащило меня из себя, мне (очень, очень, к сожалению) все еще приходится поддерживать доминантную IE6-базу пользователей по всему бизнесу.

// IE test from from: https://gist.github.com/527683
var ie = (function () {
  var undef, v = 3, div = document.createElement('div'), all = div.getElementsByTagName('i');
  while (
    div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
    all[0]
  );
  return v > 4 ? v : undef;
} ());


function badFixSelectBoxDataWidthIE() {
  if (ie < 9) {
    $('select').not('[multiple]')
      .mousedown(function() {
        var t = $(this);
        if (t.css("width") != "auto") {
          var width = t.width();
          t.data("ow", t.css("width")).css("width", "auto");

          // If the width is now less than before then undo
          if (t.width() < width) {
            t.unbind('mousedown');
            t.css("width", t.data("ow"));
          }
        }
      })

      //blur or change if the user does change the value
      .bind('blur change', function() {
        var t = $(this);
        t.css("width", t.data("ow"));
      });
  }
}
1 голос
/ 21 сентября 2012

Зачем кому-то хотеть навести курсор мыши на событие в выпадающем списке? Вот способ манипулирования IE8 для способа работы выпадающего списка:

Во-первых, давайте удостоверимся, что мы только передаем нашу функцию в IE8:

    var isIE8 = $.browser.version.substring(0, 2) === "8.";
    if (isIE8) {
       //fix me code
    }

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

        var isIE8 = $.browser.version.substring(0, 2) === "8.";
    if (isIE8) {
        $('select').wrap('<div class="wrapper" style="position:relative; display: inline-block; float: left;"></div>').css('position', 'absolute');

        //helper function for fix
        ddlFix();
    }

Теперь о событиях. Поскольку IE8 генерирует событие после фокусировки по любой причине, IE закрывает виджет после рендеринга при попытке расширения. Обходной путь будет заключаться в привязке к 'focusin' и 'focusout' классу, который будет автоматически расширяться на основе самого длинного текста опции. Затем, чтобы обеспечить постоянную минимальную ширину, которая не сжимается после значения по умолчанию, мы можем получить текущую ширину списка выбора и установить ее для свойства минимальной ширины выпадающего списка в 'onchange' переплет:

    function ddlFix() {
    var minWidth;

    $('select')

    .each(function () {
        minWidth = $(this).width();
        $(this).css('min-width', minWidth);
    })
    .bind('focusin', function () {
        $(this).addClass('expand');
    })
    .change(function () {
        $(this).css('width', minWidth);
    })
    .bind('focusout', function () {
        $(this).removeClass('expand');
    });
}

Наконец, обязательно добавьте этот класс в таблицу стилей:

 select:focus, select.expand {
    width: auto;
}
1 голос
/ 20 августа 2012

Доступен полноценный плагин jQuery, ознакомьтесь с демонстрационной страницей: http://powerkiki.github.com/ie_expand_select_width/

отказ от ответственности: я закодировал эту штуку, исправления приветствуются

1 голос
/ 04 мая 2011
for (i=1;i<=5;i++){
   idname = "Usert" + i;
   document.getElementById(idname).style.width = "100%";

}

Я использовал этот способ для отображения выпадающего списка, когда ширина отображается неправильно.

Это работает для IE6, Firefox и Chrome.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...