問題:
選択したアイテムの中には、完全に表示するために、145pxの指定された幅を超えるものが必要なものがあります。
Firefoxの動作:選択をクリックすると、最も長い要素の幅に調整されたドロップダウン要素リストが表示されます。
IE6およびIE7の動作:選択をクリックすると、145px幅に制限されたドロップダウン要素リストが表示され、長い要素を読み取ることができなくなります。
現在のUIでは、このドロップダウンを145pxに合わせて、より長い説明のあるホスト項目にする必要があります。
IEの問題を解決するためのアドバイスはありますか?
リストが展開されている場合でも、上部の要素の幅は145ピクセルのままである必要があります。
ありがとうございました!
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>
IE 8の場合、単純なCSSベースのソリューションがあります。
select:focus {
width: auto;
position: relative;
}
(selectboxが固定幅のコンテナの子である場合、positionプロパティを設定する必要があります。)
残念ながらIE 7以下は:focusセレクターをサポートしていません。
私はこの問題について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"));
});
}
});
}
}
以下に、役立つスクリプトを示します。
JavaScriptを使用しないシンプルなソリューションの場合、要件に応じて、テキストを保持している<option>にタイトル属性を追加するだけで十分な場合があります。
<option value="242" title="Very long and extensively descriptive text">
Very long and extensively descriptive text
</option>
これにより、<select>の幅に関係なく、<option>にカーソルを合わせるとツールチップ形式でカットオフテキストが表示されます。
IE7 +で動作します。
JavaScriptは無料ではありませんが、jQueryを使用してかなり小さくすることができました
$('#del_select').mouseenter(function () {
$(this).css("width","auto");
});
$('#del_select').mouseout(function () {
$(this).css("width","170px");
});
このプラグインをjqueryに使用するだけです;)
http://plugins.jquery.com/project/skinner
$(function(){
$('.select1').skinner({'width':'200px'});
});
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"));
});
}
}
なぜドロップダウンリストにマウスオーバーイベントが必要なのでしょうか?以下は、ドロップダウンリストの動作方法について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'バインディングのドロップダウンリストのmin-widthプロパティに設定します。
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;
}
完全なjQueryプラグインが利用可能です。デモページをご覧ください: http://powerkiki.github.com/ie_expand_select_width/
免責事項:私はそのことをコーディングしました、パッチは歓迎します
for (i=1;i<=5;i++){
idname = "Usert" + i;
document.getElementById(idname).style.width = "100%";
}
この方法を使用して、幅が正しく表示されないときにドロップダウンリストを表示しました。
IE6、Firefox、Chromeで動作します。
同様の解決策は、jqueryを使用してフォーカス(またはmouseenter)時の自動幅を設定し、ぼかし(またはmouseleave)時の元の幅を設定することで見つけることができます http://css-tricks.com/select-cuts-off -options-in-ie-fix / 。
別のアプローチ:
合計4つの単純なJavaScriptコマンド。
このための非常に簡単な修正が見つかりました。の中に <select>
html要素はこれらのプロパティを追加します:
onmouseover="autoWidth(this)"
onblur="resetWidth(this)"
そのため、ユーザーがクリックすると幅が自動的に拡大し、ユーザーが選択ボックスから移動すると、幅は元にリセットされます。
私のレイアウトでは、ハックを望んでいませんでした(幅は拡大せず、自動でクリックしてから元に戻りません)。それは私の既存のレイアウトを壊しました。他のブラウザと同じように正常に動作するようにしたかっただけです。
私はこれがまさにそのようであることがわかった:-
http://www.jquerybyexample.net/2012/05/fix-for-ie-select-dropdown-with-fixed.html
これにはさらに別の貢献があります。あなたが役に立つと思うかもしれないとしばらく前に書きました: http://dpatrickcaldwell.blogspot.com/2011/06/giantdropdown-jquery-plugin-for-styling.html
これは、非表示のselect要素によって裏付けられたスタイル設定可能な順序なしリストを作成するjqueryプラグインです。
ソースはgithubにあります: https://github.com/tncbbthositg/GiantDropdown
SELECTではできないULの動作とスタイルを処理できます。選択リストはまだ存在しているため、他のすべては同じである必要があります。これは非表示になっていますが、ULはそれをバッキングデータストアとして使用します(使用する場合)。
オプションが選択された後(つまり、選択して新しいページにジャンプする)、奇妙なビューを気にしない場合の回避策:
<!-- 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();'>
<!-- '▼(▼)' produces a fake dropdown indicator -->
<option value=''>Jump to ... ▼</option>
<option value='1'>http://stackoverflow.com/questions/682764/select-dropdown-with-fixed-width-cutting-off-content-in-ie</option>
...
</select>
</div>
実際に機能するソリューションを次に示します。
IEで幅を設定し、ページレイアウトを混乱させず、このページの他のソリューションのように選択オプションの上にマウスを置いてもドロップダウンを閉じません。
ただし、選択フィールドの設定と一致するように_margin-right
_値と幅の値を変更する必要があります。
また、$('select')
を$('#Your_Select_ID_HERE')
に置き換えて、特定の選択フィールドのみに影響を与えることができます。同様に、本体onload
で関数fixIESelect()
を呼び出すか、以下のコードで行ったようにDOM ready
を使用してjQuery経由で呼び出す必要があります。
_//////////////////////////
// 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();
});
_
純粋な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>
私はこれをページに動的に追加した選択で動作するようにしたかったので、多くの実験の後、クラス「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]-->
_
注意点がいくつかあります。
jQuery(document).on
の代わりにjQuery('table#System_table').on
に対して "on"をしなければなりませんでしたmouseleave
」ではなく「blur
」を使用するように記載されているにもかかわらず、IE7では、ドロップダウンリストでマウスを下に移動すると、 mouseleave
イベントではなく、blur
ではありません。Jquery BalusC's ソリューションは私によって改善されました。使用:Brad Robertson's comment here 。
これを.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's 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');
})
}
}
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>
Javascriptは無料ではありません、私も恐れており、私のソリューションにはjsライブラリが必要ですが、すべてを使用するのではなく、必要なファイルのみを使用できます。すでにプロジェクトにYUIを使用している人や、使用するもの。ご覧ください: http://ciitronian.com/blog/programming/yui-button-mimicking-native-select-dropdown-avoid-width-problem/
私のブログ投稿では、他のソリューションについても説明しています。stackoverflowで参照されています。私が独自のSELECT要素を作成した理由は、単純な理由で、マウスオーバーエキスパンドイベントが嫌いです。たぶんそれが他の誰かにも役立つなら!