CSS만으로 <select> 드롭 다운을 어떻게 스타일링합니까?


1333

<select>드롭 다운 스타일을 지정하는 CSS 전용 방법이 있습니까?

<select>JavaScript 없이도 가능한 한 인간적으로 양식 을 스타일링해야합니다 . CSS에서 사용할 수있는 속성은 무엇입니까?

이 코드는 모든 주요 브라우저와 호환되어야합니다.

  • Internet Explorer 6, 7, 8
  • Firefox
  • 원정 여행

JavaScript로 만들 수 있다는 것을 알고 있습니다 : Example .

그리고 간단한 스타일링에 대해서는 이야기하지 않습니다. CSS로만 할 수있는 최선의 방법을 알고 싶습니다.

Stack Overflow 에서 비슷한 질문 을 발견했습니다 .

그리고 이것은 Doctype.com에 있습니다.


1
구글에서만 찾을 수있는 것은 아무것도 없습니다. js 솔루션
Jitendra Vyas

41
나는 그것이 합법적 인 질문이라고 생각하지만 그 대답은 "정말 아니에요"또는 "원하는 방식이 아닙니다"입니다. 그러나 아무도 (100 %) 확실하지 않습니다.이 모호한 느낌은 독자의 피부 아래에서 기어 다니며 질문의 정당성에 의문을 제기합니다.
ZJR 2009

1
@Jitendra, 나는 당신이 무엇을 받고 있는지 알고 있습니다. 질문을 더 명확하게 해주면 좋겠습니다. 또한, 나는 당신이 찾고있는 것을 발견했다고 생각합니다. 이것은 실험적이지만 확인하십시오 : cappuccino.org/aristo/showcase
jeremyosborne 2009

1
@jeremyosborne-답장을 보내 주셔서 감사합니다. 나는 자바 스크립트로 그것을 만들 수 있다는 것을 알고있다. eaxmple 링크는 JS를 기반으로합니다. 내가 알고 싶었 기 때문에이 질문을 한 이유는, 우리가 CSS로만 할 수있는 최선의 방법에 대해 아는 사람이 있기 때문입니다.
Jitendra Vyas

@Jitendra 질문을 업데이트 해 주셔서 감사합니다. 당신이 가진 제약 조건 (CSS 만 있고 JS가 아닌)으로 안정적으로 할 수있는 최선은 서체 (글꼴), 배경 및 전경 (텍스트) 색상, 테두리 크기, 모양 및 색상, 배치 및 크기 (일반적으로 유형을 통해)를 수정하는 것입니다 글꼴을 통해 설정). 그럼에도 불구하고 모든 브라우저에서 동일한 모양을 유지하려면 약간의 조정이 필요할 수 있습니다. 나는 그보다 더 나은 대답을 알기를 바랍니다. 아마도 내가 놓친 것이 있지만 그렇게 생각하지 않습니다.
jeremyosborne 2009

답변:


1027

다음은 세 가지 해결책입니다.

해결 방법 # 1-모양 : 없음-Internet Explorer 10-11 해결 방법 ( 데모 )

-

appearance: noneselect 요소에 설정된 기본 화살표를 숨기려면background-image

select {
   -webkit-appearance: none;
   -moz-appearance: none;
   appearance: none;       /* Remove default arrow */
   background-image: url(...);   /* Add custom arrow */
}

브라우저 지원 :

appearance: noneInternet Explorer 11 이상 및 Firefox 34 이상을 제외하고 브라우저 지원 기능이 우수합니다 ( caniuse ).

이 기술을 향상시키고 Internet Explorer 10 및 Internet Explorer 11에 대한 지원을 추가하여 추가 할 수 있습니다

select::-ms-expand {
    display: none; /* Hide the default arrow in Internet Explorer 10 and Internet Explorer 11 */
}

Internet Explorer 9가 중요한 경우 기본 화살표를 제거 할 수있는 방법이 없지만 (두 개의 화살표가 있음을 의미 함) 펑키 한 Internet Explorer 9 선택기를 사용할 수 있습니다.

최소한 사용자 정의 화살표를 취소하려면 기본 선택 화살표를 그대로 둡니다.

/* Target Internet Explorer 9 to undo the custom arrow */
@media screen and (min-width:0\0) {
    select {
        background-image:none\9;
        padding: 5px\9;
    }
}

모두 함께:

이 솔루션은 쉽고 브라우저 지원 기능이 뛰어나 일반적으로 충분합니다.


Internet Explorer 9 이상 및 Firefox 34 이상에 대한 브라우저 지원이 필요한 경우 계속 읽으십시오 ...

해결 방법 # 2 기본 화살표 ( 데모 ) 를 숨기려면 select 요소를 자릅니다.

-

(자세한 내용은 여기를 참조하십시오)

select로모그래퍼 사업부에서 요소를 고정 폭overflow:hidden.

그런 다음 select요소에 div보다20 픽셀 큰 폭을 지정 하십시오 .

결과적으로 요소의 기본 드롭 다운 화살표가 select( overflow:hidden컨테이너 로 인해) 숨겨 지고 원하는 배경 이미지를 div의 오른쪽에 배치 할 수 있습니다.

이 방법 의 장점 은 크로스 브라우저 (Internet Explorer 8 이상, WebKitGecko )라는 것입니다. 그러나이 방법 의 단점 은 옵션 드롭 다운이 오른쪽에서 튀어 나온다는 것입니다 (옵션 요소는 선택 요소의 너비를 갖기 때문에 우리가 숨긴 20 픽셀만큼).

여기에 이미지 설명을 입력하십시오

그러나 맞춤 선택 요소가 휴대 기기 에만 필요한 경우 각 전화가 기본적으로 선택 요소를 여는 방식으로 인해 위의 문제는 적용되지 않습니다. 모바일의 경우 이것이 최선의 해결책 일 수 있습니다.]


Firefox에서 사용자 정의 화살표가 필요한 경우- 버전 35 이전 필요하지만 이전 버전의 Internet Explorer를 지원할 필요가없는 경우 계속 읽으십시오 ...

솔루션 # 3- pointer-events속성 사용 ( 데모 )

-

(자세한 내용은 여기를 참조하십시오)

여기서 아이디어는 기본 드롭 다운 화살표 위에 요소를 오버레이하고 (사용자 정의 화살표를 작성하기 위해) 포인터 이벤트를 허용하지 않는 것입니다.

장점 : WebKit 및 Gecko에서 잘 작동합니다. 너무 좋아 보인다 (튀어 나오지 않음)option 요소를 ).

단점 : Internet Explorer (Internet Explorer 10 이하)는 지원하지 않습니다pointer-events 사용자 정의 화살표를 클릭 할 수 없습니다. 또한이 방법의 또 다른 단점은 포인터 이벤트를 비활성화했기 때문에 호버 효과 또는 손 모양 커서로 새 화살표 이미지를 대상으로 지정할 수 없다는 것입니다!

그러나이 방법을 사용하면 Modernizer 또는 조건부 주석을 사용하여 Internet Explorer를 기본 제공 화살표로 되돌릴 수 있습니다.

NB : Internet Explorer 10은 conditional comments더 이상 지원 하지 않습니다.이 방법을 사용하려면 Modernizr 을 사용해야합니다 . 그러나 여기에 설명 된 CSS 핵을 사용하여 Internet Explorer 10에서 포인터 이벤트 CSS를 제외 할 수 있습니다 .


1
이 두 가지 방법 중 어느 것이 가장 좋습니까?
Jitendra Vyas

3
설계 요구 사항에 따라 다릅니다. 드롭 다운 튀어 나와에 대해 잘 알고 있다면 크로스 브라우저이기 때문에 가장 좋습니다 (IMO allbrowsers + IE8 +는 크로스 브라우저로 간주 될 수 있음).하지만 많은 사람들이 생각합니다. 실제로 위의 진술에서 나는 aprroach # 2가 최고라는 것을 의미했습니다.
Danield

4
또한 내가 게시 한 바이올린은 조건문과 함께 접근법 # 2를 사용하여 IE가 기본 화살표를 사용할 수 있도록합니다.
Danield

3
@AlexisLeclerc div를 고정하고 같은 너비로 선택하면 Chrome과 같은 웹 브라우저에서만 작동합니다. (나는 규칙을 포함했기 때문에 -webkit-appearance : none; ) 그러나 이것은 firefox와 같은 다른 브라우저에서는 작동하지 않습니다
Danield

4
접근법 # 1에 대한 개선을 제안 할 수 있다면, 개인적으로 국경이 없거나 오른쪽에 선택이 없다는 것이 매우 성가시다. 현재 프로젝트에서 사용한 것으로 jsfiddle.net/YvCHW/1745로 바이올린을 업데이트 했습니다 . 네가 어떻게 생각하는지 내게 말해 줘!
Alexis Leclerc

233

가능하지만 불행하게도 대부분의 개발자는 WebKit 기반 브라우저에서 개발자가 요구하는 범위까지 가능합니다. 다음은 내장 개발자 도구 관리자를 통해 Chrome 옵션 패널에서 수집 한 CSS 스타일링의 예입니다. 대부분의 최신 브라우저에서 현재 지원되는 CSS 속성과 일치하도록 개선되었습니다.

select {
    -webkit-appearance: button;
    -moz-appearance: button;
    -webkit-user-select: none;
    -moz-user-select: none;
    -webkit-padding-end: 20px;
    -moz-padding-end: 20px;
    -webkit-padding-start: 2px;
    -moz-padding-start: 2px;
    background-color: #F07575; /* Fallback color if gradients are not supported */
    background-image: url(../images/select-arrow.png), -webkit-linear-gradient(top, #E5E5E5, #F4F4F4); /* For Chrome and Safari */
    background-image: url(../images/select-arrow.png), -moz-linear-gradient(top, #E5E5E5, #F4F4F4); /* For old Firefox (3.6 to 15) */
    background-image: url(../images/select-arrow.png), -ms-linear-gradient(top, #E5E5E5, #F4F4F4); /* For pre-releases of Internet Explorer  10*/
    background-image: url(../images/select-arrow.png), -o-linear-gradient(top, #E5E5E5, #F4F4F4); /* For old Opera (11.1 to 12.0) */
    background-image: url(../images/select-arrow.png), linear-gradient(to bottom, #E5E5E5, #F4F4F4); /* Standard syntax; must be last */
    background-position: center right;
    background-repeat: no-repeat;
    border: 1px solid #AAA;
    border-radius: 2px;
    box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);
    color: #555;
    font-size: inherit;
    margin: 0;
    overflow: hidden;
    padding-top: 2px;
    padding-bottom: 2px;
    text-overflow: ellipsis;
    white-space: nowrap;
}

WebKit 기반 브라우저 내의 모든 페이지에서이 코드를 실행하면 선택 상자의 모양이 바뀌고 표준 OS 화살표를 제거하고 PNG 화살표를 추가하고 레이블 앞뒤에 약간의 간격을 두어야합니다.

가장 중요한 부분은 appearance요소의 동작 방식을 변경하는 속성입니다.

Gecko는 appearanceWebKit뿐만 아니라 지원하지 않지만 모바일 브라우저를 포함한 거의 모든 WebKit 기반 브라우저에서 완벽하게 작동합니다 .


4
이봐, 나는 선택 상자가 Firefox 12에서 매우 다르게 보이기 시작했음을 알았습니다 (Chrome과 비슷합니다 (Mac이 있습니다)). FF 12는 더 많은 모양 속성을 지원하는 것 같습니다.
CWSpear

3
크롬 전용 솔루션 ... 나는 이것도 내 클라이언트도 지불하지 않을 것입니다. x- 브라우저 솔루션에 대해서는 @Dianeld의 답변을 참조하십시오.
Adrien 수

41
@AdrienBe 내 솔루션은 거의 3 년 전에 제안되었습니다. 당시에는 JavaScript 라이브러리 또는 플러그인을 사용하지 않고 선택 상자의 스타일을 변경하는 유일한 방법이었습니다. 접두사 속성을 삭제하기로 결정한 경우에도 여전히 실행 가능하지만 Webkit 기반 브라우저 (Safari, 새로운 Opera + Android)에서만 안정적으로 작동합니다. 지금은 더 나은 솔루션이있을 수 있으므로 의미없는 의견을 추가하는 대신 더 나은 솔루션으로 투표하고 나중에 "답변"날짜를 확인하십시오. 감사.
Matthew Morek

4
@MatthewMorek : 3 년 전보다 더 나은 솔루션이있었습니다. Daniel의 답변은 브라우저 간 지원 (IE8 이상, WebKit 및 Gecko 지원)과 관련하여 훨씬 낫습니다. 이 질문은 "코드는 Internet Explorer 6,7 및 8, Firefox 및 Safari와 같은 모든 주요 브라우저와 호환되어야합니다"라고 묻습니다. 이 x- 브라우저 요구 사항은 2013 년 Paul Sweatte에 의해 추가되었을 수 있습니다. ... 죄송합니다.
Adrien Be

3
추가 text-indent: 0.01px; text-overflow: "";하면 더 잘 작동합니다.
Ivan

64

선택 요소와 드롭 다운 기능 스타일을 지정하기 어렵습니다.

Chris Heilmann의 select 요소 대한 스타일 속성은 Ryan Dohery가 첫 번째 답변에 대한 주석에서 말한 내용을 확인합니다.

"선택 요소는 브라우저 크롬이 아닌 운영 체제의 일부입니다. 따라서 스타일을 지정하는 것이 매우 신뢰할 수 없으므로 반드시 시도해야하는 것은 아닙니다."


47

이미지를 사용할 수 없으며 브라우저 지원에 의해 제한되지 않은 것을 제외 하고는이 정확한 문제가있었습니다. 이것은 "사양"이어야하고 운이 좋으면 결국 어디에서나 작동하기 시작 합니다.

의사 요소는 선택 요소에 대해 작동하지 않으므로 레이어 회전 된 배경 레이어를 사용하여 드롭 다운 화살표를«잘라 내기»합니다.

편집 : 이 업데이트 버전에서는 CSS 변수와 작은 테마 시스템을 사용하고 있습니다.

:root {
  --radius: 2px;
  --baseFg: dimgray;
  --baseBg: white;
  --accentFg: #006fc2;
  --accentBg: #bae1ff;
}

.theme-pink {
  --radius: 2em;
  --baseFg: #c70062;
  --baseBg: #ffe3f1;
  --accentFg: #c70062;
  --accentBg: #ffaad4;
}

.theme-construction {
  --radius: 0;
  --baseFg: white;
  --baseBg: black;
  --accentFg: black;
  --accentBg: orange;
}

select {
  font: 400 12px/1.3 sans-serif;
  -webkit-appearance: none;
  appearance: none;
  color: var(--baseFg);
  border: 1px solid var(--baseFg);
  line-height: 1;
  outline: 0;
  padding: 0.65em 2.5em 0.55em 0.75em;
  border-radius: var(--radius);
  background-color: var(--baseBg);
  background-image: linear-gradient(var(--baseFg), var(--baseFg)),
    linear-gradient(-135deg, transparent 50%, var(--accentBg) 50%),
    linear-gradient(-225deg, transparent 50%, var(--accentBg) 50%),
    linear-gradient(var(--accentBg) 42%, var(--accentFg) 42%);
  background-repeat: no-repeat, no-repeat, no-repeat, no-repeat;
  background-size: 1px 100%, 20px 22px, 20px 22px, 20px 100%;
  background-position: right 20px center, right bottom, right bottom, right bottom;   
}

select:hover {
  background-image: linear-gradient(var(--accentFg), var(--accentFg)),
    linear-gradient(-135deg, transparent 50%, var(--accentFg) 50%),
    linear-gradient(-225deg, transparent 50%, var(--accentFg) 50%),
    linear-gradient(var(--accentFg) 42%, var(--accentBg) 42%);
}

select:active {
  background-image: linear-gradient(var(--accentFg), var(--accentFg)),
    linear-gradient(-135deg, transparent 50%, var(--accentFg) 50%),
    linear-gradient(-225deg, transparent 50%, var(--accentFg) 50%),
    linear-gradient(var(--accentFg) 42%, var(--accentBg) 42%);
  color: var(--accentBg);
  border-color: var(--accentFg);
  background-color: var(--accentFg);
}
<select>
  <option>So many options</option>
  <option>...</option>
</select>

<select class="theme-pink">
  <option>So many options</option>
  <option>...</option>
</select>

<select class="theme-construction">
  <option>So many options</option>
  <option>...</option>
</select>


5
와우, 이것은 내가 본 가장 멋진 솔루션 중 하나입니다. Mac의 최신 버전의 Chrome 및 Safari에서 작동합니다. 다른 브라우저는 어떻습니까?
Tintin81

2
의 추가와 함께 파이어 폭스에서 나를 위해 작품-moz-appearance: none;
자크

45

스타일링 선택 드롭 다운에서 가장 큰 불일치가 발견 된 것은 SafariChrome 렌더링입니다 (Firefox는 CSS를 통해 완벽하게 사용자 정의 할 수 있음). 불분명 한 인터넷 깊이를 검색 한 결과 다음과 같은 문제가 발생하여 WebKit으로 내 자격을 거의 완전히 해결했습니다.

사파리 및 구글 수정 :

select {
  -webkit-appearance: none;
}

그러나 드롭 다운 화살표는 제거됩니다. 주변 div에 배경, 음수 여백이 있거나 근처 에 선택 드롭 다운 위에 놓아 드롭 다운 화살표를 추가 할 수 있습니다 .

* 자세한 정보 및 기타 변수는 CSS 특성 : -webkit-appearance 에서 사용할 수 있습니다 .


1
그 후에 스타일을 추가하는 것을 잊지 마십시오.) 그러나 오늘이 의견을 읽게되어 매우 기쁩니다.
teewuane

1
"Firefox는 CSS를 통해 완벽하게 사용자 정의 할 수 있습니다"라는 문장을 자세히 설명해 주시겠습니까? firefox가 appearence 속성을 지원하지 않는 것 같습니다. 그러면 어떻게 firefox에서 수행됩니까?
Danield

36

<select>태그는 브라우저에서 렌더링되는 HTML 페이지의 다른 HTML 요소와 마찬가지로 CSS를 통해 스타일을 지정할 수 있습니다. 아래는 페이지에 선택 요소를 배치하고 옵션의 텍스트를 파란색으로 렌더링하는 (매우 간단한) 예입니다.

HTML 파일 예 (selectExample.html) :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <title>Select Styling</title>
  <link href="selectExample.css" rel="stylesheet">
</head>
<body>
<select id="styledSelect" class="blueText">
  <option value="apple">Apple</option>
  <option value="orange">Orange</option>
  <option value="cherry">Cherry</option>
</select>
</body>
</html>

CSS 파일 예 (selectExample.css) :

/* All select elements on page */
select {
  position: relative;
}

/* Style by class. Effects the text of the contained options. */
.blueText {
  color: #0000FF;
}

/* Style by id. Effects position of the select drop down. */
#styledSelect {
  left: 100px;
}

30
놀랍고 처음으로 인터넷에 "어머니"가 관여하는 것을 보았습니다. +1!
BaL

34
이 답변은이 질문을 해결하지 못합니다. 입력 스타일 만 선택하고 드롭 다운은
아님

14
이 답변은 크로스 브라우저 일관성을 위해 드롭 다운 목록의 스타일을 지정하는 문제를 완전히 무시합니다. 이것은 매우 낮은 노력 답변입니다.
BentOnCoding

18

블로그 게시물 방법 CSS 양식 드롭 다운 스타일 JavaScript가 작동 하지 않지만 Opera 에서는 실패합니다 .

select {
  border: 0 none;
  color: #FFFFFF;
  background: transparent;
  font-size: 20px;
  font-weight: bold;
  padding: 2px 10px;
  width: 378px;
  *width: 350px;
  *background: #58B14C;
}

#mainselection {
  overflow: hidden;
  width: 350px;
  -moz-border-radius: 9px 9px 9px 9px;
  -webkit-border-radius: 9px 9px 9px 9px;
  border-radius: 9px 9px 9px 9px;
  box-shadow: 1px 1px 11px #330033;
  background: url("arrow.gif") no-repeat scroll 319px 5px #58B14C;
}
<div id="mainselection">
  <select>
    <option>Select an Option</option>
    <option>Option 1</option>
    <option>Option 2</option>
  </select>
</div>


17

다음은 모든 최신 브라우저에서 작동하는 버전입니다. 키를 사용 appearance:none하여 기본 서식을 제거합니다. 모든 서식이 사라 졌으므로 선택과 입력을 시각적으로 구분하는 화살표를 다시 추가해야합니다.

실제 예 : https://jsfiddle.net/gs2q1c7p/

select:not([multiple]) {
    -webkit-appearance: none;
    -moz-appearance: none;
    background-position: right 50%;
    background-repeat: no-repeat;
    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAMCAYAAABSgIzaAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDZFNDEwNjlGNzFEMTFFMkJEQ0VDRTM1N0RCMzMyMkIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDZFNDEwNkFGNzFEMTFFMkJEQ0VDRTM1N0RCMzMyMkIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0NkU0MTA2N0Y3MUQxMUUyQkRDRUNFMzU3REIzMzIyQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0NkU0MTA2OEY3MUQxMUUyQkRDRUNFMzU3REIzMzIyQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuGsgwQAAAA5SURBVHjaYvz//z8DOYCJgUxAf42MQIzTk0D/M+KzkRGPoQSdykiKJrBGpOhgJFYTWNEIiEeAAAMAzNENEOH+do8AAAAASUVORK5CYII=);
    padding: .5em;
    padding-right: 1.5em
}

#mySelect {
    border-radius: 0
}
<select id="mySelect">
    <option>Option 1</option>
    <option>Option 2</option>
</select>


16

Bootstrap을 사용하여 귀하의 경우에 도달했습니다 . 이것은 가장 간단한 해결책입니다.

select.form-control {
    -moz-appearance: none;
    -webkit-appearance: none;
    appearance: none;
    background-position: right center;
    background-repeat: no-repeat;
    background-size: 1ex;
    background-origin: content-box;
    background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnMiIKICAgdmlld0JveD0iMCAwIDM1Ljk3MDk4MyAyMy4wOTE1MTgiCiAgIGhlaWdodD0iNi41MTY5Mzk2bW0iCiAgIHdpZHRoPSIxMC4xNTE4MTFtbSI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjAyLjAxNDUxLC00MDcuMTIyMjUpIgogICAgIGlkPSJsYXllcjEiPgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MzMzNiIKICAgICAgIHk9IjYyOS41MDUwNyIKICAgICAgIHg9IjI5MS40Mjg1NiIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjQwcHg7bGluZS1oZWlnaHQ6MTI1JTtmb250LWZhbWlseTpzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIj48dHNwYW4KICAgICAgICAgeT0iNjI5LjUwNTA3IgogICAgICAgICB4PSIyOTEuNDI4NTYiCiAgICAgICAgIGlkPSJ0c3BhbjMzMzgiPjwvdHNwYW4+PC90ZXh0PgogICAgPGcKICAgICAgIGlkPSJ0ZXh0MzM0MCIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo0MHB4O2xpbmUtaGVpZ2h0OjEyNSU7Zm9udC1mYW1pbHk6Rm9udEF3ZXNvbWU7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpGb250QXdlc29tZTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIj4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgzMzQ1IgogICAgICAgICBzdHlsZT0iZmlsbDojMzMzMzMzO2ZpbGwtb3BhY2l0eToxIgogICAgICAgICBkPSJtIDIzNy41NjY5Niw0MTMuMjU1MDcgYyAwLjU1ODA0LC0wLjU1ODA0IDAuNTU4MDQsLTEuNDczMjIgMCwtMi4wMzEyNSBsIC0zLjcwNTM1LC0zLjY4MzA0IGMgLTAuNTU4MDQsLTAuNTU4MDQgLTEuNDUwOSwtMC41NTgwNCAtMi4wMDg5MywwIEwgMjIwLDQxOS4zOTM0NiAyMDguMTQ3MzIsNDA3LjU0MDc4IGMgLTAuNTU4MDMsLTAuNTU4MDQgLTEuNDUwODksLTAuNTU4MDQgLTIuMDA4OTMsMCBsIC0zLjcwNTM1LDMuNjgzMDQgYyAtMC41NTgwNCwwLjU1ODAzIC0wLjU1ODA0LDEuNDczMjEgMCwyLjAzMTI1IGwgMTYuNTYyNSwxNi41NDAxNyBjIDAuNTU4MDMsMC41NTgwNCAxLjQ1MDg5LDAuNTU4MDQgMi4wMDg5MiwwIGwgMTYuNTYyNSwtMTYuNTQwMTcgeiIgLz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=");
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" />
<section class="container">
  <form class="form-horizontal">
    <select class="form-control">
      <option>One</option>
      <option>Two</option>
    </select>
  </form>
</section>

참고 : base64 항목은 fa-chevron-downSVG입니다.


12

최신 브라우저에서는 <select>CSS 로 스타일을 지정하는 것이 비교적 고통스럽지 않습니다. 가진 appearance: none유일한 까다로운 부분은 (만약 당신이 원하는 경우)에있는 화살표를 대체하고있다. data:일반 텍스트 SVG와 함께 인라인 URI 를 사용하는 솔루션은 다음과 같습니다 .

select {
  -moz-appearance: none;
  -webkit-appearance: none;
  appearance: none;
  
  background-repeat: no-repeat;
  background-size: 0.5em auto;
  background-position: right 0.25em center;
  padding-right: 1em;
  
  background-image: url("data:image/svg+xml;charset=utf-8, \
    <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 60 40'> \
      <polygon points='0,0 60,0 30,40' style='fill:black;'/> \
    </svg>");
}
<select>
  <option>Option 1</option>
  <option>Option 2</option>
</select>

<select style="font-size: 2rem;">
  <option>Option 1</option>
  <option>Option 2</option>
</select>

나머지 스타일 (테두리, 패딩, 색상 등)은 매우 간단합니다.

이것은 방금 시도한 모든 브라우저 (Firefox 50, Chrome 55, Edge 38 및 Safari 10)에서 작동합니다. Firefox에 대한 한 가지 참고 사항은 #데이터 URI에서 문자 를 사용하려면 (예 fill: #000:) 이스케이프해야한다는 점 fill: %23000입니다.


1
CSS 속성 대신 태그 의 height및 / 또는 width속성을 사용 하여 SVG의 크기를 조정할 수도 <svg>있습니다 background-size.
gitaarik

10
select  {
    outline: 0;
    overflow: hidden;
    height: 30px;
    background: #2c343c;
    color: #747a80;
    border: #2c343c;
    padding: 5px 3px 5px 10px;
    -moz-border-radius: 6px;
    -webkit-border-radius: 6px;
    border-radius: 10px;
}

select option {border: 1px solid #000; background: #010;}

현재 Chrome에서 해당 항목을 선택할 수 없습니다.
Vitaly Zdanevich

9

사용자 정의 CSS 스타일 선택

Internet Explorer (10 및 11), Edge, Firefox 및 Chrome 에서 테스트

select::-ms-expand {
  display: none;
}
select {
  display: inline-block;
  box-sizing: border-box;
  padding: 0.5em 2em 0.5em 0.5em;
  border: 1px solid #eee;
  font: inherit;
  line-height: inherit;
  -webkit-appearance: none;
  -moz-appearance: none;
  -ms-appearance: none;
  appearance: none;
  background-repeat: no-repeat;
  background-image: linear-gradient(45deg, transparent 50%, currentColor 50%), linear-gradient(135deg, currentColor 50%, transparent 50%);
  background-position: right 15px top 1em, right 10px top 1em;
  background-size: 5px 5px, 5px 5px;
}
<select name="">
  <option value="">Lorem</option>
  <option value="">Lorem Ipsum</option>
</select>

<select name="" disabled>
  <option value="">Disabled</option>
</select>

<select name="" style="color:red;">
  <option value="">Color!</option>
  <option value="">Lorem Ipsum</option>
</select>


약간 더 적응성 (그러나 모든 브라우저에서 테스트 된 것은 아님) :background-position: right 15px center, right 10px center;
Robin Stewart

8

clip속성을 사용하여 select요소 의 테두리와 화살표를 자른 다음 래퍼에 고유 한 대체 스타일을 추가하십시오.

    <!DOCTYPE html>
    <html>
      <head>
        <style>
          select { position: absolute; clip:rect(2px 49px 19px 2px); z-index:2; }
          body > span { display:block; position: relative; width: 64px; height: 21px; border: 2px solid green;  background: url(http://www.stackoverflow.com/favicon.ico) right 1px no-repeat; }
        </style>
      </head>
      <span>
        <select>
          <option value="">Alpha</option>
          <option value="">Beta</option>
          <option value="">Charlie</option>
        </select>
      </span>
    </html>

버튼을 클릭 가능하게하려면 불투명도가 0 인 두 번째 선택을 사용하십시오.

    <!DOCTYPE html>
    <html>
      <head>
        <style>
          #real { position: absolute; clip:rect(2px 51px 19px 2px); z-index:2; }
          #fake { position: absolute; opacity: 0; }
    
          body > span { display:block; position: relative; width: 64px; height: 21px; background: url(http://www.stackoverflow.com/favicon.ico) right 1px no-repeat; }
        </style>
      </head>
      <span>
        <select id="real">
          <option value="">Alpha</option>
          <option value="">Beta</option>
          <option value="">Charlie</option>
        </select>
        <select id="fake">
          <option value="">Alpha</option>
          <option value="">Beta</option>
          <option value="">Charlie</option>
        </select>
      </span>
    </html>

좌표는 웹킷과 다른 브라우저마다 다르지만 @media 쿼리가이를 처리 할 수 있습니다.

참고 문헌


1
적어도 크롬에서 나를 위해 잘 작동합니다 : 위치 : 절대; 클립 : rect (2px 85px 128px 2px); z- 지수 : 2; 왼쪽 여백 : 18px; 오른쪽 여백 : 18px; 여백 : 7px 자동; 색깔 : # 555; 글꼴 크기 : 상속; 배경색 : 투명;
BrianFreud

1
선택의 경계를 제어 할 수 없으므로 IE7에서 화살표의 절반 만 자르는 것을 알았습니다.
CpILL


1
@PaulSweatte, 와우, 이것은 20 번째 네크로맨서입니다 ! 축하합니다. 당신은 또한 금색 네크로맨서 배지에 대한 나의 모든 질문을 차지했습니다 .
니모

5

트릭 을 사용 :after하고 :before수행 하는 아주 좋은 예는 CSS3 | CSSDeck


1
예, 그러나 해당 요구 사항은 Internet Explorer 6,7 및 8과 호환되어야합니다.
Jitendra Vyas

2
예 IE와 호환되지 않지만 찾고있는 현대적인 솔루션을 찾고있는 사람과 공유하는 것을 좋아했습니다.
Ahmad Ajmi

5

이 요소를 수정하는 것은 권장되지 않지만 다른 HTML 요소와 마찬가지로 시도해보십시오.

예제 편집 :

/* Edit select */
select {
    /* CSS style here */
}

/* Edit option */
option {
    /* CSS style here */
}

/* Edit selected option */
/* element  attr    attr value */
option[selected="selected"] {
    /* CSS style here */
}
<select>
    <option >Something #1</option>
    <option selected="selected">Something #2</option>
    <option >Something #3</option>
</select>

2
@MikkoP : 수정을 제안 할 때 좀 더 설명적인 수정 요약을 제공 하시겠습니까? "메시지 개선"은 검토 자에게 높은 수준의 요약으로 도움이되지 않습니다. 감사.
Jean-François Corbett

1
@ Jean-FrançoisCorbett 좀 더 구체적으로 노력하겠습니다 :)
MikkoP

1
옵션 요소의 스타일을 지정할 수 없습니다 (SO 답변 : stackoverflow.com/a/7208814/703717 참조 )
Danield

4
label {
    position: relative;
    display: inline-block;
}
select {
    display: inline-block;
    padding: 4px 3px 5px 5px;
    width: 150px;
    outline: none;
    color: black;
    border: 1px solid #C8BFC4;
    border-radius: 4px;
    box-shadow: inset 1px 1px 2px #ddd8dc;
    background-color: lightblue;
}

선택한 요소에 배경색을 사용하고 이미지를 제거했습니다.


4

예. 다음과 같이 태그 이름으로 HTML 요소의 스타일을 지정할 수 있습니다.

select {
  font-weight: bold;
}

물론 다른 클래스와 마찬가지로 CSS 클래스를 사용하여 스타일을 지정할 수도 있습니다.

<select class="important">
  <option>Important Option</option>
  <option>Another Important Option</option>
</select>

<style type="text/css">
  .important {
    font-weight: bold;
  }
</style>

6
나는 이것에 대해 이야기하고 있지 않다. 드롭 다운 화살표를 다른 것으로 바꾸고 싶다
Jitendra Vyas

5
드롭 다운 화살표는 다른 이미지에 스타일을 지정할 수 없으며 OS에서 제어합니다. 정말로 필요한 경우 가장 좋은 방법은 DHTML 드롭 다운 위젯을 사용하는 것입니다.
Ryan Doherty

3
CSS를 통해서만 CSS 속성을 변경할 수 있습니다. 여백, 패딩, 글꼴 속성, 배경색 등을 변경할 수 있습니다. 완전히 다르게 보이게하려면 기본적으로 JavaScript를 통해 런타임에 그래픽으로 바꿔야합니다. ).
Dave Ward

4

이 토론에서 내가 가장 좋아하는 아이디어를 기반으로 한 솔루션이 있습니다. 이를 통해 추가 마크 업없이 <select> 요소를 직접 스타일링 할 수 있습니다.

Internet Explorer 8 이상에서 안전한 대체 기능으로 Internet Explorer 10 이상에서 작동합니다. 이러한 브라우저의 한 가지주의 사항은 배경 이미지가 기본 확장 컨트롤 뒤에 숨길 수있을 정도로 작아야한다는 것입니다.

HTML

<select name='options'>
  <option value='option-1'>Option 1</option>
  <option value='option-2'>Option 2</option>
  <option value='option-3'>Option 3</option>
</select>

SCSS

body {
  padding: 4em 40%;
  text-align: center;
}

select {
  $bg-color: lightcyan;
  $text-color: black;
  appearance: none; // Using -prefix-free http://leaverou.github.io/prefixfree/
  background: {
    color: $bg-color;
    image: url("https://s3-us-west-2.amazonaws.com/s.cdpn.io/1255/caret--down-15.png");
    position: right;
    repeat: no-repeat;
  }
  border: {
    color: mix($bg-color, black, 80%);
    radius: .2em;
    style: solid;
    width: 1px;
    right-color: mix($bg-color, black, 60%);
    bottom-color: mix($bg-color, black, 60%);
  }
  color: $text-color;
  padding: .33em .5em;
  width: 100%;
}

// Removes default arrow for Internet Explorer 10 (and later)
// Internet Explorer 8/9 gets the default arrow which covers the caret
// image as long as the caret image is smaller than and positioned
// behind the default arrow
select::-ms-expand {
    display: none;
}

코드 펜

http://codepen.io/ralgh/pen/gpgbGx



3

쉬운 방법이 있습니다.

이 바이올린을 확인하고 오버 스타일을 용서하십시오 : https://jsfiddle.net/dkellner/7ac9us70/

속임수 : <select> 태그가 "size"라는 속성을 가져 오자마자 고정 된 높이 목록으로 작동하며, 어떤 이유로 갑자기 스타일을 지정할 수 있습니다. 엄밀히 말하면 고정 목록은 부작용이지만 "드롭 다운 모양"에 사용하기 때문에 더 도움이됩니다.

최소한의 예 :

<style>

    .stylish span   {position:relative;}
    .stylish select {position:absolute;left:0px;display:none}

</style>
...
<div class="stylish">
    <label> Choose your superhero: </label>
    <span>
        <input onclick="$(this).closest('div').find('select').slideToggle(110)"><br>
        <select size=15 onclick="$(this).hide().closest('div').find('input').val($(this).find('option:selected').text());">

            <optgroup label="Fantasy"></optgroup>
            <option value="1">  Gandalf        </option>
            <option value="2">  Harry Potter   </option>
            <option value="3">  Jon Snow       </option>

            <!-- ... and so on -->

        </select>
    </span>
</div>

(간단하게 유지하기 위해 jQuery를 사용하여 수행했지만 그 없이도 동일한 작업을 수행 할 수 있습니다)

사이드 노트

  • 이 솔루션은 단순한 선택 이상의 기능을 제공합니다. 값도 수동으로 편집 할 수 있습니다. 기본 선택 제한 방식을 선호하는 경우 읽기 전용 속성을 사용하십시오.

  • 스타일링 가능성을 최대화하기 위해 <optgroup> 태그는 자식 주위 에 있지 않으며 앞에 이동 됩니다. 의도적이며 시각적으로 명확하며 걱정하지 않아도됩니다.

  • Javascripts : 예 OP가 "Javascript 없음"이라고 말했지만 플러그인으로 귀찮게하지 말아야 한다는 것을 알고 있습니다 . 이 라이브러리에는 라이브러리가 필요하지 않습니다. 내가 말했듯이 jQuery조차도 예제의 명확성을위한 것입니다.



2

드롭 다운에 호버 스타일을 추가 할 수도 있습니다.

select {position:relative; float:left; width:21.4%; height:34px; background:#f9f9e0; border:1px solid #41533f; padding:0px 10px 0px 10px; color:#41533f; margin:-10px 0px 0px 20px; background: transparent; font-size: 12px; -webkit-appearance: none; -moz-appearance: none; appearance: none; background: url(https://alt-fit.com/images/global/select-button.png) 100% / 15% no-repeat #f9f9e0;}
select:hover {background: url(https://alt-fit.com/images/global/select-button.png) 100% / 15% no-repeat #fff;}
<html>
<head>
</head>
<body>
<select name="type" class="select"><option style="color:#41533f;" value="Select option">Select option</option>
<option value="Option 1">Option 1</option>
<option value="Option 2">Option 2</option>
<option value="Option 3">Option 3</option>
</select>
</body>
</html>


2

다니엘의 답변 에서 세 번째 방법 호버 효과 및 기타 마우스 이벤트와 함께 작동하도록 향상시킬 수 있습니다. "버튼"요소가 마크 업에서 선택 요소 바로 다음에 오도록하십시오. 그런 다음 + CSS 선택기를 사용하여 타겟팅하십시오.

HTML :

<select class="select-input">...</select>
<div class="select-button"></div>

CSS :

.select-input:hover+.select-button {
    <Hover styles here>
}

그러나 "단추"가 아닌 선택 요소 위를 가리킬 때 호버 효과가 표시됩니다.

이 방법을 Angular와 함께 사용하여 프로젝트가 어쨌든 Angular 응용 프로그램이기 때문에 전체 선택 요소를 다루고 Angular가 선택한 옵션의 텍스트를 "button"-요소에 표시합니다. 이 경우 선택의 아무 곳이나 가리킬 때 호버 효과가 적용되는 것이 완벽합니다.

JavaScript 없이는 작동하지 않으므로이 작업을 수행하고 사이트가 JavaScript없이 작동해야하는 경우 스크립트가 개선에 필요한 요소와 클래스를 추가해야합니다. 이렇게하면 JavaScript가없는 브라우저는 올바르게 업데이트되지 않는 스타일이 지정된 배지 대신 스타일이 지정되지 않은 일반 스타일을 선택하게됩니다.


1
모든 다운 보트의 이유를 알고 싶어서 개선 방법을 알 수 있습니다! 🙂
애드리안 슈미트

1

CSS 및 HTML 전용 솔루션

Chrome, Firefox 및 Internet Explorer 11과 호환되는 것 같지만 다른 웹 브라우저에 대한 의견을 남겨주십시오.

Danield의 답변 에서 제안한 것처럼 예상 한 동작을 얻으려면 div (x-browser 호환성을 위해 두 개의 div)로 선택을 래핑하십시오.

http://jsfiddle.net/bjap2/ 참조

HTML :

<div class="sort-options-wrapper">
    <div class="sort-options-wrapper-2">
        <select class="sort-options">
                <option value="choiceOne">choiceOne</option>
                <option value="choiceOne">choiceThree</option>
                <option value="choiceOne">choiceFour</option>
                <option value="choiceFiveLongTestPurpose">choiceFiveLongTestPurpose</option>
        </select>
    </div>
    <div class="search-select-arrow-down"></div>
</div>

두 개의 div 래퍼에 주목하십시오.

또한 원하는 위치 (절대 위치)에 화살표 아래 버튼을 배치하기 위해 추가 div가 추가되었음을 확인하십시오. 여기에서 왼쪽에 놓습니다.

CSS

.sort-options-wrapper {
    display: inline-block;
    position: relative;
    border: 1px solid #83837F;
}

/* This second wrapper is needed for x-browser compatibility */
.sort-options-wrapper-2 {
    overflow: hidden;
}

select {
    margin-right: -19px; /* That's what is hiding the default-provided browser arrow */
    padding-left: 13px;
    margin-left: 0;
    border: none;
    background: none;

    /* margin-top & margin-bottom must be set since some
       browsers have default values for select elements */
    margin-bottom: 1px;
    margin-top: 1px;
}

select:focus {
    outline: none; /* Removing default browsers outline on focus */
}
.search-select-arrow-down {
    position: absolute;
    height: 10px;
    width: 12px;
    background: url(http://i.imgur.com/pHIYN06.png) scroll no-repeat 2px 0px;
    left: 1px;
    top: 5px;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.