Подтвердить что ты не робот

Выберите раскрывающийся список с фиксированной шириной, отсекая содержимое в IE

Проблема:

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

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

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

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

Какие-либо рекомендации по разрешению проблемы с 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>
4b9b3361

Ответ 1

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

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

(Вам нужно установить свойство position, если selectbox является дочерним элементом контейнера с фиксированной шириной.)

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

Ответ 2

Я сделал 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"));

           });
        }
      });
    }
    }

Ответ 4

Для простого Javascript-бесплатного решения добавление атрибута title в ваш <option> s, содержащий текст, может быть достаточно, в зависимости от ваших требований.

<option value="242" title="Very long and extensively descriptive text">
  Very long and extensively descriptive text
</option>

Это покажет текст прерывания в форме подсказки при зависании <option> , независимо от ширины <select> .

Работает для IE7 +.

Ответ 5

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

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

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

});

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

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

}); 

Ответ 6

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

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

$(function(){
          $('.select1').skinner({'width':'200px'});
});

Ответ 7

Небольшое, но, надеюсь, полезное обновление кода от 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"));
      });
  }
}

Ответ 8

Я нашел довольно простое решение для этого. В элементе <select> html добавьте следующие свойства:

onmouseover="autoWidth(this)" 
onblur="resetWidth(this)" 

Поэтому всякий раз, когда пользователь нажимает на то, что ширина будет автоматически расширяться, и пользователь выйдет из поля выбора, ширина будет reset до оригинала.

Ответ 9

Другой подход:

  • вместо выбора сделать это поле редактирования, отключено, поэтому никто не может ввести что-либо вручную или изменить содержимое после выбора
  • другое скрытое редактирование, содержащее идентификатор выбранного параметра (поясняется ниже)
  • сделайте кнопку [..] и script, чтобы показать, что div ниже
  • сделать скрытый div с абсолютной позицией под или рядом с полем редактирования
  • сделайте, чтобы div содержал выбор с размером стиля = "6" (чтобы показать 6 опций и полосу прокрутки, а не раскрывающийся список) и кнопку "выбрать" и, возможно, "отменить"
  • Не устанавливайте ширину шрифта, так что все это займет ширину самого широкого варианта или кнопки плюс, возможно, какое-то дополнение по вашему выбору.
  • script кнопка "выбрать", чтобы скопировать идентификатор выбранной опции в скрытое поле редактирования, а значение - на видимое, а также снова скрыть div.

Всего 4 простых javascript команд.

Ответ 10

аналогичное решение можно найти здесь, используя jquery, чтобы установить автоматическую ширину при фокусировке (или мышином) и установить ширину orignal обратно при размытии (или мышином) http://css-tricks.com/select-cuts-off-options-in-ie-fix/.

Ответ 11

for (i=1;i<=5;i++){
   idname = "Usert" + i;
   document.getElementById(idname).style.width = "100%";

}

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

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

Ответ 12

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

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

Ответ 13

Почему кому-то нужно вывести курсор мыши над событием в раскрывающемся списке? Здесь можно использовать способ управления 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' классу, который будет автоматически расширяться на основе самого длинного текста опции. Затем, чтобы обеспечить постоянную минимальную ширину, которая не уменьшается после значения по умолчанию, мы можем получить текущую ширину списка выбора и установить ее в свойство min-width выпадающего списка в '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;
}

Ответ 14

Не боюсь, что javascript не боится, и мое решение требует библиотеки js, однако вы можете использовать только те файлы, которые вам нужны, а не использовать их все, возможно, лучше всего подходит тем, кто уже использует YUI для своих проектов или решить, какой из них использовать. Посмотрите на: http://ciitronian.com/blog/programming/yui-button-mimicking-native-select-dropdown-avoid-width-problem/

В моем сообщении в блоге также обсуждаются и другие решения, на которые ссылается здесь, на stackoverflow, почему я вернулся, чтобы создать свой собственный элемент SELECT по простой причине, мне не нравятся события с расширением мыши. Возможно, если это тоже поможет кому-то еще!

Ответ 15

Улучшено решение jQuery BalusC. Используется также: Brad Robertson комментарий здесь.

Просто поместите это в .js, используйте широкий класс для ваших желаемых комбо и не подделывайте, чтобы дать ему Id. Вызовите функцию в onload (или documentReady или что-то еще).
Как простая задница, что:)
Он будет использовать ширину, которую вы определили для комбо, как минимальную длину.

function fixIeCombos() {
    if ($.browser.msie && $.browser.version < 9) {
    var style = $('<style>select.expand { width: auto; }</style>');
    $('html > head').append(style);

    var defaultWidth = "200";

    // get predefined combo widths.
    var widths = new Array();
    $('select.wide').each(function() {
        var width = $(this).width();
        if (!width) {
        width = defaultWidth;
        }
        widths[$(this).attr('id')] = width;
    });

    $('select.wide')
    .bind('focus mouseover', function() {
        // We're going to do the expansion only if the resultant size is bigger
        // than the original size of the combo.
        // In order to find out the resultant size, we first clon the combo as
        // a hidden element, add to the dom, and then test the width.
        var originalWidth = widths[$(this).attr('id')];

        var $selectClone = $(this).clone();
        $selectClone.addClass('expand').hide();
        $(this).after( $selectClone );
        var expandedWidth = $selectClone.width()
        $selectClone.remove();
        if (expandedWidth > originalWidth) {
        $(this).addClass('expand').removeClass('clicked');
        }
    })
    .bind('click', function() {
        $(this).toggleClass('clicked'); 
    })
    .bind('mouseout', function() {
        if (!$(this).hasClass('clicked')) {
        $(this).removeClass('expand');
        }
    })
    .bind('blur', function() {
        $(this).removeClass('expand clicked');
    })
    }
}

Ответ 16

Его протестировали во всех версиях IE, Chrome, FF и Safari

//Код JavaScript

    <script type="text/javascript">
    <!-- begin hiding
    function expandSELECT(sel) {
      sel.style.width = '';
    }
    function contractSELECT(sel) {
      sel.style.width = '100px';
    }
    // end hiding -->
    </script>

// Html code

    <select name="sideeffect" id="sideeffect"  style="width:100px;" onfocus="expandSELECT(this);" onblur="contractSELECT(this);" >
      <option value="0" selected="selected" readonly="readonly">Select</option>
    <option value="1" >Apple</option>
    <option value="2" >Orange + Banana + Grapes</option>

Ответ 17

У меня есть еще один вклад в это. Я написал это некоторое время назад, что вы можете счесть полезным: http://dpatrickcaldwell.blogspot.com/2011/06/giantdropdown-jquery-plugin-for-styling.html

Это плагин jquery для создания неупорядоченного списка, поддерживаемого скрытым элементом select.

Источник находится на github: https://github.com/tncbbthositg/GiantDropdown

Вы сможете обрабатывать поведение и стили в UL, которые вы не можете с помощью SELECT. Все остальное должно быть одинаковым, потому что список выбора все еще существует, он просто скрыт, но UL будет использовать его в качестве хранилища данных резервного копирования (если хотите).

Ответ 18

Вот решение, которое действительно работает.

Он устанавливает ширину в IE и не испортит ваш макет страницы и не закрывает раскрывающийся список, когда вы наводите указатель мыши на опции выбора, такие как некоторые другие решения на этой странице.

Однако вам нужно изменить значения и значения ширины margin-right, чтобы они соответствовали вашим полям выбора.

Также вы можете заменить $('select') на $('#Your_Select_ID_HERE'), чтобы обработать только определенное поле выбора. Также вам нужно будет вызвать функцию fixIESelect() на теле onload или через jQuery с помощью DOM ready, как это было в моем коде ниже:

//////////////////////////
// FIX IE SELECT INPUT //
/////////////////////////
window.fixIESelect_clickset = false;
function fixIESelect()
{
 if ($.browser.msie)
 {
  $('select').mouseenter(function ()
  {
   $(this).css("width","auto");
   $(this).css("margin-right","-100");
  });
  $('select').bind('click focus',function ()
  {
   window.fixIESelect_clickset = true;
  });
  $('select').mouseout(function ()
  {
   if(window.fixIESelect_clickset != true)
   {
    $(this).css("width","93px");
    window.fixIESelect_clickset = false;
   }
  });
  $('select').bind('blur change',function ()
  {
   $(this).css("width","93px");
  });
 }
}
/////////////
// ONLOAD //
////////////
$(document).ready(function()
{
 fixIESelect();
});

Ответ 19

Я хотел, чтобы это работало с выборами, которые я добавил динамически на страницу, поэтому после большого количества экспериментов я в конечном итоге предоставил все варианты, которые я хотел сделать с помощью класса "fixedwidth", а затем добавил следующее CSS:

table#System_table select.fixedwidth { width: 10em; }
table#System_table select.fixedwidth.clicked { width: auto; }

и этот код

<!--[if lt IE 9]>
    <script type="text/javascript">
        jQuery(document).ready(function() {
            jQuery(document).on(
              {
                'mouseenter': function(event) {
                    jQuery(this).addClass('clicked');
                    },
                'focusout change blur': function() {
                    jQuery(this).removeClass('clicked');
                    }
              }, 'select.fixedwidth');
        });
    </script>
<![endif]-->

Несколько замечаний:

  • Несмотря на то, что мои выборки находятся в таблице, мне пришлось сделать "on" в jQuery(document).on вместо jQuery('table#System_table').on
  • Несмотря на то, что в документации jQuery указано "mouseleave" вместо "blur", я обнаружил, что в IE7, когда я переместил указатель мыши в раскрывающийся список, он получит mouseleave, но не blur.

Ответ 20

Для моего макета я не хотел взломать (без увеличения ширины, без щелчка с авто, а затем перехода к оригиналу). Это сломало мой существующий макет. Я просто хотел, чтобы он работал нормально, как и другие браузеры.

Я нашел, что это точно так: -

http://www.jquerybyexample.net/2012/05/fix-for-ie-select-dropdown-with-fixed.html

Ответ 21

Обходной путь, если вы не заботитесь о странном представлении после выбора опции (т.е. выберите переход на новую страницу):

<!-- Limit width of the wrapping div instead of the select and use 'overflow: hidden' to hide the right part of it. -->
<div style='width: 145px; overflow: hidden; border-right: 1px solid #aaa;'>
  <select onchange='jump();'>
    <!-- '&#9660;(▼)' produces a fake dropdown indicator -->
    <option value=''>Jump to ... &#9660;</option>
    <option value='1'>http://stackoverflow.com/questions/682764/select-dropdown-with-fixed-width-cutting-off-content-in-ie</option>
    ...
  </select>
</div>

Ответ 22

Чистое решение css: http://bavotasan.com/2011/style-select-box-using-only-css/

.styled-select select {
   background: transparent;
   width: 268px;
   padding: 5px;
   font-size: 16px;
   line-height: 1;
   border: 0;
   border-radius: 0;
   height: 34px;
   -webkit-appearance: none;
   }

.styled-select {
   width: 240px;
   height: 34px;
   overflow: hidden;
   background: url(http://cdn.bavotasan.com/wp-content/uploads/2011/05/down_arrow_select.jpg) no-repeat right #ddd;
   border: 1px solid #ccc;
   }
<div class="styled-select">
   <select>
      <option>Here is the first option</option>
      <option>The second option</option>
   </select>
</div>

Ответ 23

Лучшее решение: css + javascript

http://css-tricks.com/select-cuts-off-options-in-ie-fix/

var el;

$("select")
  .each(function() {
    el = $(this);
    el.data("origWidth", el.outerWidth()) // IE 8 can haz padding
  })
  .mouseenter(function(){
    $(this).css("width", "auto");
  })
  .bind("blur change", function(){
    el = $(this);
    el.css("width", el.data("origWidth"));
  });