トップ回答者
IE11でのチェックボックスの装飾の仕方について

質問
-
いつもお世話になっております。
チェックボックスの背景色を変える方法が分からないのですが、
ご存知の方がおられましたら、
ご教授を頂けますでしょうか。
【ご質問】
以下のコードを
IE10 or IE11を使用してチェックを入れると
動作が異なります。
IE10の場合、
チェックボックスにチェックを入れると
チェックボックスの周りが赤くなります。
IE11の場合、
チェックボックスにチェックを入ても
チェックボックスの周りが赤くなりません。
IE11の場合でも、
IE10と同じようにチェックボックスの周りを赤く表示したいのですが、
方法はありますでしょうか?
【コード】
<HTML>
<HEAD>
<TITLE></TITLE>
<SCRIPT language=JavaScript>
<!--
function changeColor(chkID){
Myid=document.getElementById(chkID);
if(Myid.checked == true){
Myid.style.backgroundColor = '#ff0000';
}
else{
Myid.style.backgroundColor = '#FFFFFF';}
}
// -->
</SCRIPT>
</HEAD>
<BODY>
<FORM>
<INPUT type="checkbox" id = "c_box1" onclick="changeColor('c_box1')">りんご</div>
<INPUT type="checkbox" id = "c_box2" onclick="changeColor('c_box2')">ぶどう</div>
<INPUT type="checkbox" id = "c_box3" onclick="changeColor('c_box3')">なし</div>
</FORM>
</BODY>
</HTML>
以上です。
よろしくお願いいたします。
回答
-
IE10まではDOCTYPE宣言が無かったり、完全ではない場合、IE5互換モードでの表示がされていました。IE11では市場での要望を受け明示的に互換表示が指定されていない限り標準モードで表示されるように変更されました。
なぜこのような話が出てくるかというと、「チェックボックスの周り」はmargin領域であり、標準モードではmargin領域はbackground-colorでは塗られません。つまりそもそもとして
<input type="checkbox" style="background-color: red;">
が赤くなりません。
15年以上前のHTMLを大切に守り続けていきたい気持ちもわからなくもないですが、ぜひ標準モードに移行することをお勧めします。
- 回答の候補に設定 Hebikuzure aka Murachi AkiraMVP, Moderator 2014年2月27日 7:06
- 回答としてマーク IE10で互換表示後 画面をフレーム分割した際の横スクロールバーについて 2014年2月28日 3:13
-
ご連絡ありがとうございます。
<input type="checkbox" style="background-color: red;">の記述では、
周りは赤くならない事は分かりました。
別の方法として、以下のコードを考えたのですが、
<span>タグを追加する必要があるので
時間が掛かってしまいます。
何かタグを追加せずに
チェックボックスの周りを赤くする方法はありますでしょうか?
【コード】
<HTML>
<HEAD>
<TITLE></TITLE>
<style type="text/css">
<!--
.checkbox_line {
border: solid 3px red;
}
-->
</style>
<SCRIPT language=JavaScript>
<!--
function changeColor(chkID){
Myid=document.getElementById(chkID);
if(Myid.checked == true){
Myid.parentNode.className = "checkbox_line";
}
else{
Myid.parentNode.className = "";
}
}
// -->
</SCRIPT>
</HEAD>
<BODY>
<FORM>
<span><INPUT type="checkbox" id = "c_box1" onclick="changeColor('c_box1')"></span>りんご
<span><INPUT type="checkbox" id = "c_box2" onclick="changeColor('c_box2')"></span>ぶどう
<span><INPUT type="checkbox" id = "c_box3" onclick="changeColor('c_box3')"></span>なし
</FORM>
</BODY>
</HTML>
以上です。
よろしくお願いいたします。
- 回答としてマーク IE10で互換表示後 画面をフレーム分割した際の横スクロールバーについて 2014年2月28日 3:14
すべての返信
-
IE10まではDOCTYPE宣言が無かったり、完全ではない場合、IE5互換モードでの表示がされていました。IE11では市場での要望を受け明示的に互換表示が指定されていない限り標準モードで表示されるように変更されました。
なぜこのような話が出てくるかというと、「チェックボックスの周り」はmargin領域であり、標準モードではmargin領域はbackground-colorでは塗られません。つまりそもそもとして
<input type="checkbox" style="background-color: red;">
が赤くなりません。
15年以上前のHTMLを大切に守り続けていきたい気持ちもわからなくもないですが、ぜひ標準モードに移行することをお勧めします。
- 回答の候補に設定 Hebikuzure aka Murachi AkiraMVP, Moderator 2014年2月27日 7:06
- 回答としてマーク IE10で互換表示後 画面をフレーム分割した際の横スクロールバーについて 2014年2月28日 3:13
-
ご連絡ありがとうございます。
<input type="checkbox" style="background-color: red;">の記述では、
周りは赤くならない事は分かりました。
別の方法として、以下のコードを考えたのですが、
<span>タグを追加する必要があるので
時間が掛かってしまいます。
何かタグを追加せずに
チェックボックスの周りを赤くする方法はありますでしょうか?
【コード】
<HTML>
<HEAD>
<TITLE></TITLE>
<style type="text/css">
<!--
.checkbox_line {
border: solid 3px red;
}
-->
</style>
<SCRIPT language=JavaScript>
<!--
function changeColor(chkID){
Myid=document.getElementById(chkID);
if(Myid.checked == true){
Myid.parentNode.className = "checkbox_line";
}
else{
Myid.parentNode.className = "";
}
}
// -->
</SCRIPT>
</HEAD>
<BODY>
<FORM>
<span><INPUT type="checkbox" id = "c_box1" onclick="changeColor('c_box1')"></span>りんご
<span><INPUT type="checkbox" id = "c_box2" onclick="changeColor('c_box2')"></span>ぶどう
<span><INPUT type="checkbox" id = "c_box3" onclick="changeColor('c_box3')"></span>なし
</FORM>
</BODY>
</HTML>
以上です。
よろしくお願いいたします。
- 回答としてマーク IE10で互換表示後 画面をフレーム分割した際の横スクロールバーについて 2014年2月28日 3:14
-
こういう感じでどうでしょうか。
jQueryとか使えるならもっと楽ですが。
<html>
<head>
<style>
.checkbox_line {
border: solid 3px red;
}
</style>
<script>
function changeColor(c_box) {
var wrapper;
var clone = c_box.cloneNode();
if (c_box.checked) {
clone.setAttribute('checked', 'checked');
wrapper = document.createElement('span');
wrapper.setAttribute('class', 'checkbox_line');
wrapper.appendChild(clone);
c_box.parentNode.insertBefore(wrapper, c_box);
c_box.parentNode.removeChild(c_box);
}
else {
clone.removeAttribute('checked');
wrapper = c_box.parentNode;
wrapper.parentNode.insertBefore(clone, wrapper);
wrapper.parentNode.removeChild(wrapper);
}
}
</script>
</head>
<body>
<INPUT type="checkbox" id="c_box1" onchange="changeColor(this)">りんご
<INPUT type="checkbox" id="c_box2" onchange="changeColor(this)">ぶどう
<INPUT type="checkbox" id="c_box3" onchange="changeColor(this)">なし
</body>
</html>【追記】
すみません、HTML部分は変えたくないんですよね。
勝手にonchangeに変えてしまいました。
私のコードは、onclickだとうまく動かないみたいです。
クリックは良いのですが、ダブルクリックした時にバグってしまいます。- 編集済み femp 2014年2月27日 11:07 追記
-
IE5互換モードを選択されなおかつdocument.getElementById()を使用されるということはWindows ME付属のIE5.5(2000年7月公開)を想定したHTMLでしょうか。骨董的価値が非常に高いと思います。今や当時の文献は非常に少なく下手に手を加えても動作しなくなってしまいますから、このままの方が趣きもあっていいのではないでしょうか。
# fempさんも「jQueryとか使えるなら」と書かれていますが、IE5.5をサポートしていないはずですし。一応、IE9以降で使用可能なbackground-clipというスタイルでbackgroundの塗りつぶされる範囲を制御することもできますが、サンプルからもわかるように、padding / borderまでしか制御できず、marginを塗りつぶす指定はできません。(margin相殺があり、その場合にどちらbackgroundで塗ればいいのか決定できないからだと思います。)
現代のWebブラウザーで表示することを望まれるのであれば、IE6(2001年8月公開)以降でサポートされる標準モードに移行されることを強くお勧めします。もちろんIE6はWindows MEでの動作もサポートしています。