과거 IE가 브라우저 시장을 지배한 탓에 HTTP 표준이 있음에도 불구하고 IE는 이상하게도 표준을 자꾸만 벗어나 있었습니다. 하지만, 이제는 IE도 표준을 무시할 수 없는 탓에 IE도 정신을 차리고 표준을 준수하려고 많이 노력하는 것이 보입니다.

이런 과정에서 발생하는 찌끄레기 중 개발자를 귀찮게 하는 것이 있으니 IE8 부터 등장하는 호환성 모드입니다. IE8 부터 표준에 대한 지원을 강화함에 따라 이전 전용 코드들에 대해서 문제가 발생하는데 이를 해결하기 위한 일종의 땜빵(?)이 호환성 모드입니다. 개발자를 귀찮게 하는 호환성 모드에 대해서 살펴보고자 합니다.

IE8 이후의 버전에서는 F12로 개발자 모드 창을 띄울 수 있습니다. 개발자 모드 창에서 보면 “브라우저 모드”와 “문서 모드” 2가지가 있는 것을 볼 수가 있습니다. “브라우저 모드”는 현재 브라우저의 기본 셋팅을 정의하는 것이고, “문서 모드”는 콘텐츠를 랜더링하는 방식을 정의하는 것입니다.

즉, “문서 모드”에 IE7 로 지정이 되어 있다면, 나의 브라우저가 IE8,9,10 이라 할지라도 콘텐츠를 랜더링하는데 사용되는 방식이 IE7을 따르겠다라는 의미가 됩니다.

이러한 값들에 대한 설정은 호환성 보기 메뉴를 통해서 지정할 수도 있으며, 윈도우 레지스트리

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_NATIVE_DOCUMENT_MODE]

에서도 그 값을 설정할 수 있습니다. 하지만, 이러한 설정을 일반 사용자가 이해하고 설정할리 만무하니 콘텐츠를 제작하는 사람은 자신의 콘텐츠가 사용자 브라우저에서 어떻게 랜더링될 지 결정할 수 있어야 합니다. 이와 같은 이유로 <head> 내에 <meta> 태그를 통해서 콘텐츠를 랜더링 할 “문서 모드”를 지정할 수 있는 코드가 생기게 됩니다.

“문서 모드”는 <head> 태그 내에 아래와 같이 설정하면 위에서 얘기한 사용자의 설정보다 우선하여 적용되게 됩니다.

<meta http-equiv="X-UA-Compatible" content="IE=edge" />

설정의 세부값은 아래와 같습니다.

1.  Quirks Mode 설정
<meta http-equiv="X-UA-Compatible" content="IE=5" />
2. Internet Explorer 7 Standards 모드
<meta http-equiv="X-UA-Compatible" content="IE=7" />
3. Internet Explorer 8 Standards 모드
<meta http-equiv="X-UA-Compatible" content="IE=8" />
4. 가장 최신 Internet Explorer 버전의 Standards 모드
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />

추가로 사용자의 PC에 Chrome Browser 가 설치되어 있다면 아래와 같이 설정하여 Chrome Frame 을 이용하여 랜더링 하도록 지정할 수도 있습니다.

<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />

위와 같이 <head> 태그 내에 랜더링 모드를 설정하였음에도 불구하고 원하는대로 “문서 모드”가 변경되지 않는 경우가 발생할 수 있습니다. 아래와 같은 두 경우에 해당한다면 위에서 설정한 랜더링 모드 설정은 무용지물이 되게 됩니다.

  1. !DOCTYPE 을 지정하지 않은 경우
  2. Web Server 에서 Custom Header 를 보내는 경우

즉, 문서에는 반드시 !DOCTYPE 이 지정되어야 하며 !DOCTYPE 이 지정되지 않을 경우 자동으로 쿼크모드(Quirks Mode) 로 동작하게 됩니다. 또한, 웹 서버에서 Response Header 를 보낼 때 Custom Header 를 보내게 되면 <head> 내에 포함된 랜더링 모드는 무시되게 되며, 사용자 PC 에 설정된 호환성 모드를 따르게 됩니다.

Web Server 를 IIS7 을 사용할 경우 사이트를 만들게 되면 Default 로 HTTP Response Header 에 “X-Powered-By” 항목으로 “ASP.NET” 또는 “Inherit” 등의 값들이 설정되어 있을 수 있습니다. 이렇게 추가된 Header 는 원하지 않는 결과를 부를 수 있으니 삭제를 하여야 합니다.

 

Custom Header

 

참조문서 : http://msdn.microsoft.com/ko-kr/library/ie/hh920756(v=vs.85).aspx



출처 - http://blog.hwm.or.kr/archives/50






IE8이 등장하면서 새로운 기능 한가지를 추가했습니다. 바로 호환성 보기인데 주소표시줄 옆에 있는 아이콘을 눌러 보신 분도 계실꺼라 생각합니다. 이는 구 버전의 IE를 기준으로 만들어진 웹문서를 IE8이 접근했을때 사용하기 위한 모드인데 브라우저는 버전업이 될때마다 그 이전 버전의 버그픽스 및 표준화에 동참하기 때문입니다. 

개발자들이 웹문서를 작성할때 버그를 껴안고 그를 우회하는 방식을 사용하기에 버그가 있는 브라우저와 그 버그가 해결되어진 브라우저의 렌더링이 달라져서 의도치 않게 레이아웃등이 깨질수 있는 것이지요. 이를 방지하기 위해 개발자들은 새 meta 태그(X-UA-Compatible)를 사용해서 IE8에게 어느 랜더링 엔진을 사용할 것인지 전달해야 합니다.

<meta http-equiv="X-UA-Compatible" content="IE=edge">

이 것을 아파치나 IIS 같은 웹 서버에서 구성하여 HTTP 헤더를 통해 정보를 지정해도 됩니다.


위의 content 값에 지정할수 있는 값은 아래와 같습니다.

속성값

해석

IE=5

관용모드(quirks mode)로 지정된 DOCTYPE에 상관없이 IE5 렌더링 방식이 사용됩니다

IE=7

IE7 표준모드로 지정된 DOCTYPE에 상관없이 IE7 표준 모드 렌더링 방식이 사용됩니다

IE=EmulateIE7

IE7 에뮬레이션 모드로 지정된 DOCTYPE에 따라 IE7 표준모드나 관용모드로 렌더링됩니다

IE=8 

IE8 표준모드로 지정된 DOCTYPE에 상관없이 IE8 표준모드로 렌더링됩니다 

IE=EmulateIE8 

IE8 에뮬레이션 모드로 지정된 DOCTYPE에 따라 IE8 표준모드나 관용모드로 렌더링됩니다 

IE=edge

최신모드로 지정된 DOCTYPE에 상관없이 IE8 이상 버전에서 항상 최신 표준 모드로 렌더링됩니다 

마이크로소프트는 실험적인 프로젝트가 아닌 이상 IE=edge 모드를 지정할 것을 권장합니다.


구식 콘텐츠를 위한 특정 렌더링 엔진을 사용하려면 앞서 나열한 content 속성의 다양한 값 중 하나를 지정하면 됩니다. 만약 X-UA-Compatible이 지정된 meta 태그가 없다면 사용자가 호환성 뷰를 선택했는지, 개발자의 사이트가 마이크로소프트 호환성 정보 관리 사이트 목록에 있는지(트래픽이 많은 사이트만 해당)등의 요인에 따라 달라집니다.    



출처 - http://webdir.tistory.com/38






X-UA-Compatible Meta Tag Description and Uses:

The X-UA-Compatible meta tag allows web authors to choose what version of Internet Explorer the page should be rendered as. It is used by Internet Explorer 8 to specify if a page should be rendered as IE 7 (compatibility view) or IE 8 (standards view).

You specify the user agent and version to use in the contents of the tag:

"IE=EmulateIE7"

The options you have for the content are:

  • "IE=5"
  • "IE=EmulateIE7"
  • "IE=7"
  • "IE=EmulateIE8"
  • "IE=8"
  • "IE=EmulateIE9"
  • "IE=9"
  • "IE=edge"

Emulating the version tells the browser to use the DOCTYPE to determine how to render content. pages without a DOCTYPE will be rendered in quirks mode.

If you tell it to use the browser version without emulating (i.e."IE=7") the browser will render the page in standards mode whether or not there is a DOCTYPE declaration.

"IE=edge" tells Internet Explorer to use the highest mode available to that version of IE. Internet Explorer 8 can support up to IE8 modes, IE9 can support IE9 modes and so on.

X-UA-Compatible Meta Tag Type:

The X-UA-Compatible meta tag is a http-equiv meta tag.

X-UA-Compatible Meta Tag Format:

Emulate IE 7

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7">

Display as IE 8 with or without a DOCTYPE

<meta http-equiv="X-UA-Compatible" content="IE=8">

Quirks Mode (IE 5)

<meta http-equiv="X-UA-Compatible" content="IE=5">

X-UA-Compatible Meta Tag Recommended Uses:

Use the X-UA-Compatible meta tag on web pages where you suspect that Internet Explorer 8 will attempt to render the page in an incorrect view. Such as when you have an XHTML document with an XML declaration. The XML declaration at the top of the document will throw the page into compatibility view but the DOCTYPE declaration should force it to be rendered in standards view.


source - http://webdesign.about.com/od/metataglibraries/p/x-ua-compatible-meta-tag.htm









'Development > HTML' 카테고리의 다른 글

html - a tag에서 점선테두리 없애기  (0) 2015.06.15
html - role attribute  (0) 2014.05.06
html - content type  (0) 2014.04.15
HTML DOM  (0) 2014.03.06
html - 웹킷(webkit)  (1) 2013.12.10
Posted by linuxism
,


Background-color displaying incorrectly in IE8 and IE9


I have a megamenu that works perfectly in Chrome, Firefox and IE10. However in versions IE9 and below there is a problem with the background-color property of the menu bar - instead of being a dark gray, it is showing as white. I am using a custom css file to modify the T3v3 framework css file and the bootstrap css file The URL in question is www.minsteadtt.org - it is using the T3v3 framework. The css for the property in question is as follows:

.t3-mainnav {
  background-image: none;
  background-color: #676767; 
  border: none;
  font-size: .9em;
}

Can anyone explain why the dark gray property is not registering in IE8 and 9?


Add filter: none; to your t3-mainnav class. That should fix it!

.t3-mainnav {
  background-image: none;
  background-color: #676767; 
  border: none;
  font-size: .9em;
  filter: none !important;

}


source - http://stackoverflow.com/questions/19127161/background-color-displaying-incorrectly-in-ie8-and-ie9


'Development > CSS' 카테고리의 다른 글

css - z-index  (0) 2014.05.15
css - position absolute center  (0) 2014.05.04
css - placeholder color  (0) 2014.04.27
css3 - transition  (1) 2014.04.27
css - 미디어쿼리(media query) @media  (0) 2013.11.19
Posted by linuxism
,


Chrome supports the placeholder attribute on input[type=text] elements (others probably do too).

But the following CSS doesn't do diddly squat to the placeholder's value:

CSS:

input[placeholder], [placeholder], *[placeholder] {
   color:red !important;
}

HTML:

<input type="text" placeholder="Value" />

Value will still remain grey instead of red.

Is there a way to change the color of the placeholder text?

I'm already using the jQuery placeholder plugin for the browsers that don't support the placeholder attribute natively.

share|improve this question
158 
Quick heads-up (not a solution, just a FYI): if I recall correctly, input[placeholder] just matches <input> tags that have a placeholder attribute, it doesn't match the placeholder attribute itself. –  pinkgothic Apr 9 '10 at 19:58 
3 
Yah, the thought crossed my mind that this may be like trying to style an element's "title" attribute. So +1 for thinking alike! –  David Murdoch Apr 9 '10 at 20:01
add comment
up vote1947down voteaccepted

Implementation

There are three different implementations: pseudo-elements, pseudo-classes, and nothing.

IE up to version 9 and Opera up to version 12 do not support any CSS selector for placeholders.

The discussion about the best implementation is still going on. Note the pseudo-elements act like real elements in the Shadow DOM. A padding on an input will not get the same background color as the pseudo-element.

CSS selectors

User agents are required to ignore a rule with an unknown selector. See Selectors Level 3:

group of selectors containing an invalid selector is invalid.

So we need separate rules for each browser. Otherwise the whole group would be ignored by all browsers.

::-webkit-input-placeholder { /* WebKit browsers */
    color:    #999;
}
:-moz-placeholder { /* Mozilla Firefox 4 to 18 */
    color:    #999;
}
::-moz-placeholder { /* Mozilla Firefox 19+ */
    color:    #999;
}
:-ms-input-placeholder { /* Internet Explorer 10+ */
    color:    #999;
}

Usage notes

  • Be careful to avoid bad contrasts.
  • Note that placeholder text is just cut off if it doesn’t fit – size your input elements in em and test them with big minimum font size settings. Don’t forget translations: some languages need more roomfor the same word.
  • Browsers with HTML support for placeholder but without CSS support for that (like Opera) should be tested too.
  • Some browsers use additional default CSS for some input types (emailsearch). These might affect the rendering in unexpected ways. Use the properties -webkit-appearance and -moz-appearance to change that. Example:
    [type="search"] {
        -moz-appearance:    textfield;
        -webkit-appearance: textfield;
        appearance: textfield;
    }
share|improve this answer
24 
Don't forget to add textarea placeholder support as well! –  philfreo Jun 16 '11 at 0:25
50 
@philfreo Uhm, is my explanation not good enough? If you combine the selectors the whole rule is ignored by both rendering engines due to the unknown selector. –  toscho Jun 21 '11 at 1:13
7 
Note also that although Webkit considers this to have rather strong specificity, Mozilla does not. You are likely to have to pop a few !importants in there to get things to show up. –  dmnc Sep 5 '11 at 14:38
10 
@toscho: thanks for the great answer. I just needed a little demonstration of it "live", so your example can also be reached here: jsfiddle.net/Sk8erPeter/KyVXK. Thanks again. –  Sk8erPeter Jan 27 '13 at 1:39
45 
Firefox's placeholder appears to be defaulting with a reduced opacity. For anyone else hard-refreshing and wondering why the heck this doesn't appear to be working ("why is my white text still grey.."), use opacity:1–  jwinn Apr 3 '13 at 18:33
show 24 more comments
*::-webkit-input-placeholder {
    color: red;
}
*:-moz-placeholder {
    /* FF 4-18 */
    color: red;
}
*::-moz-placeholder {
    /* FF 19+ */
    color: red;
}
*:-ms-input-placeholder {
    /* IE 10+ */
    color: red;
}

This will style all input and textarea placeholders.

JSFiddle Demo

Do not group these rules and make a separate rule for every selector (one invalid selector in a group makes the whole group invalid)

share|improve this answer
   
MSDN doc you linked to, states its only supported in Internet Explorer 10. Still a good find, but not very useful till IE10 userbase becomes significant (we may be looking at a time-frame of years for that). – danishgoel Mar 14 '12 at 20:44 
   
Realistically, you are going to want to style placeholders across the site uniformly, not style every individual input by ID. –  BadHorsie Sep 10 '13 at 11:03
3 
After FF19 you have to use ::-moz-placeholder –  coelho Oct 6 '13 at 13:22 
   
+1 for demo fiddle –  Pilot Mar 29 at 18:01
add comment

You may also want to style textareas:

input::-webkit-input-placeholder, textarea::-webkit-input-placeholder {
  color: #636363;
}
input:-moz-placeholder, textarea:-moz-placeholder {
  color: #636363;
}
share|improve this answer
add comment

In addition to toscho's answer I've noticed some webkit inconsistencies between Chrome 9-10 and Safari 5 with the CSS properties supported that are worth noting.

Specifically Chrome 9 and 10 do not support background-colorbordertext-decoration and text-transform when styling the placeholder.

The full cross-browser comparison is here.

share|improve this answer
add comment

For bootstrap LESS users, there is a mixin .placeholder:

// Placeholder text
// -------------------------
.placeholder(@color: @placeholderText) {
  &:-moz-placeholder {
    color: @color;
  }
  &:-ms-input-placeholder {
    color: @color;
  }
  &::-webkit-input-placeholder {
    color: @color;
  }
}
share|improve this answer
add comment

this will work fine. DEMO HERE

input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { 
    color:    #666;
}
input:-moz-placeholder, textarea:-moz-placeholder { 
    color:    #666;
}
input::-moz-placeholder, textarea::-moz-placeholder { 
    color:    #666;
}
input:-ms-input-placeholder, textarea:-ms-input-placeholder { 
    color:    #666;
}
share|improve this answer
add comment

In FF and IE, the normal input text color overrides the color property of placeholders. So, we need to

::-webkit-input-placeholder { 
    color: red; text-overflow: ellipsis; 
}
:-moz-placeholder { 
    color: #acacac !important; text-overflow: ellipsis; 
}
::-moz-placeholder { 
    color: #acacac !important; text-overflow: ellipsis; 
} /* for the future */
:-ms-input-placeholder { 
    color: #acacac !important; text-overflow: ellipsis; 
}
share|improve this answer
add comment

Cross-browser solution:

/* all elements */
::-webkit-input-placeholder { color:#f00; }
::-moz-placeholder { color:#f00; } /* firefox 19+ */
:-ms-input-placeholder { color:#f00; } /* ie */
input:-moz-placeholder { color:#f00; }

/* individual elements: webkit */
#field2::-webkit-input-placeholder { color:#00f; }
#field3::-webkit-input-placeholder { color:#090; background:lightgreen; text-transform:uppercase; }
#field4::-webkit-input-placeholder { font-style:italic; text-decoration:overline; letter-spacing:3px; color:#999; }

/* individual elements: mozilla */
#field2::-moz-placeholder { color:#00f; }
#field3::-moz-placeholder { color:#090; background:lightgreen; text-transform:uppercase; }
#field4::-moz-placeholder { font-style:italic; text-decoration:overline; letter-spacing:3px; color:#999; }

Credit: David Walsh

share|improve this answer
add comment

I don't remember where I've found this code snippet on the internet (it wasn't written by me, don't remember where I've found it, nor who wrote it).

$('[placeholder]').focus(function() {
        var input = $(this);
        if (input.val() == input.attr('placeholder')) {
            input.val('');
            input.removeClass('placeholder');
        }
    }).blur(function() {
        var input = $(this);
        if (input.val() == '' || input.val() == input.attr('placeholder')) {
            input.addClass('placeholder');
            input.val(input.attr('placeholder'));
        }
    }).blur();
    $('[placeholder]').parents('form').submit(function() {
        $(this).find('[placeholder]').each(function() {
            var input = $(this);
            if (input.val() == input.attr('placeholder')) {
                input.val('');
            }
        })
    });

Just load this javascript and then edit your placeholder with CSS by calling this rule:

form .placeholder {
   color: #222;
   font-size: 25px;
   /* etc */
}
share|improve this answer
   
This is the old way of doing it, which I've used quite a bit. The disadvantage is that the placeholder text disappears when you focus. I've found this to be annoying when the UI doesn't also include labels next to the input. Over the past several months I've started replacing this method with using placeholder text, which I think is a UX improvement. –  Redtopia Dec 10 '13 at 19:31 
   
The other problem with code like this is your serverside code has to deal with placeholder text as empty input, which has problems with edge cases where you want to enter a town called "Town". Instead of checking values against the placeholder text you should really use a data-modified flag on the input, and then clear the input on form submit if the flag is not set. And for AJAX interfaces you may not even have a form, so you should be able to associate an arbitrary submission event with the input. This is one of those really simple situations that isn't. –  Whelkaholism Mar 7 at 13:16 
add comment

How about this

<input type="text" value="placeholder text" onfocus="this.style.color='#000'; 
this.value='';" style="color: #f00;"/>

No CSS or placeholder, but you get the same functionality.

share|improve this answer
3 
what happens if someone clicks again after writing something.. the original text they wrote will be gone! – Lucky Soni May 2 '13 at 10:04
   
@LuckySoni you could do this, but I personally prefer the first one. <input type="text" value="placeholder text" onfocus="if(!this.haswriting){this.style.color='#000'; this.value='';}" onblur="if(!this.value){this.style.color='#f00'; this.value='placeholder text'; this.haswriting=false;}else{this.haswriting=true};" style="color: #f00;"/> – user1729061 May 18 '13 at 18:25 
3 
Even your second version doesn't provide the same functionality. If the user submits the <form> with this input the placeholder text will be sent to the server. I seen so many sites do this wrong. –  lqc May 30 '13 at 8:35
1 
@lqc Yes, it's amazing how many developers out there pay no attention to detail and usability. –  BadHorsieSep 10 '13 at 11:05
add comment


source - http://stackoverflow.com/questions/2610497/change-an-inputs-html5-placeholder-color-with-css



Posted by linuxism
,