WebKit의 CSS에서 <select> 및 : after 문제


123

의사 : after (2 부분과 이미지없이 선택 상자의 스타일을 지정하기 위해)를 사용하여 선택 상자에 스타일을 추가하고 싶습니다. HTML은 다음과 같습니다.

<select name="">
  <option value="">Test</option>
</select>

그리고 그것은 작동하지 않습니다. 이유를 모르겠고 W3C 사양에서 답을 찾지 못했습니다. CSS는 다음과 같습니다.

select {
  -webkit-appearance: none;
  background: black;
  border: none;
  border-radius: 0;
  color: white;
}

select:after {
  content: " ";
  display: inline-block;
  width: 24px; height: 24px;
  background: blue;
}

그래서 정상입니까, 아니면 트릭이 있습니까?


나는 이것이 가능 하지 않을 것이라고 생각 합니다. 그렇지 않으면 양식의 내용을 너무 쉽게 변경할 수 있습니다. 어떤 것에 대한 디스플레이 가격을 변경하는 간단한 CSS를 상상해보십시오. 실제보다 더 저렴하게 보여줄 수 있으며, 사람들이 예상보다 더 많은 것을 사도록 속일 수 있습니다. (누군가가 페이지 / userstylesheet의 CSS에 대한 액세스 권한이있는 경우 또는 물론, 그들은 아마 ... 다른 방법으로 동일한 기능을 수행 할 수있다)
Synetech

22
@Synetech-이것은 올바르지 않습니다. 페이지 작성자는 페이지 스타일의 모든 측면을 완벽하게 제어해야합니다. 사용자를 오도하는 데 사용될 있기 때문에 특정 요소의 스타일링을 방지하려는 브라우저 제조업체 는 시스템을 속이거나 오탐을 생성하는 방법이 거의 무한하기 때문에 효과적이지 않습니다.
Jonathan Cross

답변:


132

나는 이것을 광범위하게 확인하지 않았지만 select브라우저 자체가 아니라 브라우저가 실행되는 OS에서 요소가 생성되는 방식으로 인해 (아직?) 불가능하다는 인상을 받았습니다.


62
지금은 2019이고 여전히 동일합니다
플라시도

40
지금은 2020 년이고 여전히 똑같습니다
Joeri Minnekeer

3
한 시간 전에이 10 년 된 게시물에 대한 귀하의 의견을 봤다면 한 시간의 시간을 절약했을 것입니다. : C
ericek111

66

내 선택의 배경이 화살표 색상과 동일하기 때문에 같은 것을 찾고있었습니다. 앞서 언급했듯이 select 요소에서 : before 또는 : after를 사용하여 아무것도 추가하는 것은 아직 불가능합니다. 내 해결책은 코드 앞에 다음을 추가 한 래퍼 요소를 만드는 것이 었습니다.

.select-wrapper {
    position: relative;
}

.select-wrapper:before {
    content: '\f0d7';
    font-family: FontAwesome;
    color: #fff;
    display: inline-block;
    position: absolute;
    right: 20px;
    top: 15px;
    pointer-events: none;
}

그리고 이것은 내 선택

select {
    box-sizing: border-box;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    width: 100%;
    padding: 10px 20px;
    background: #000;
    color: #fff;
    border: none;
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
}

select::-ms-expand {
    display: none;
}

새 화살표에 FontAwesome.io를 사용했지만 원하는 다른 것을 사용할 수 있습니다. 분명히 이것은 완벽한 솔루션은 아니지만 필요에 따라 충분할 수 있습니다.


4
이것은 시각적으로 완벽합니다. 하지만 그 아이콘을 클릭 할 수없고 요소를 선택하면 열리지 않습니다.
Schovi

11
포인터 이벤트 : 없음; 처리해야합니다. 위의 코드에 문제가 있습니다. 혼란을 없애기 위해 위의 sass를 css로 변경하겠습니다.
sroy

어떤 의사 선택자 (이전 대 이후)가 사용되는 것이 문제입니까?
eddiegroves

당신은 하나 또는 다른 사용할 수 있습니다
sroy

2
이것은 훌륭한 솔루션이지만 구현할 때 어떤 이유로 든 : before working 및 NOT : after를 발견했습니다. 이유를 모르겠습니다.
Lee Probert 2015-07-23

32

내 경험에 따르면 <select>랩퍼 로 포장하지 않는 한 작동하지 않습니다 . 그러나 대신 할 수있는 것은 배경 이미지 SVG를 사용하는 것입니다. 예

    .archive .options select.opt {
    -moz-appearance: none;
    -webkit-appearance: none;
    padding-right: 1.25EM;
    appearance: none;
    position: relative;
    background-color: transparent;
    background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1.1' height='10px' width='15px'%3E%3Ctext x='0' y='10' fill='gray'%3E%E2%96%BE%3C/text%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-size: 1.5EM 1EM;
    background-position: right center;
    background-clip: border-box;
    -moz-background-clip: border-box;
    -webkit-background-clip: border-box;
}

    .archive .options select.opt::-ms-expand {
        display: none;
    }

IE 때문에 적절한 URL 인코딩에주의하십시오. 당신은 사용해야합니다 charset=utf8(다만 utf8당신의 인생을 단순화하는 대신를 단락 SVG 속성 값, 사용 아포스트로피 ( ')를 큰 따옴표 ( ")를 사용하지 마십시오). URL 인코딩의 (%의 3E).에서 케이스를 인쇄 havee UTF-8 표현 (예 : BabelMap이 도움이 될 수 있음)을 얻어야하는 비 ASCII 문자는 URL 인코딩 형식으로 제공해야합니다. 예를 들어 ▾ ( U+25BE검은 색 아래쪽을 가리키는 작은 삼각형) UTF-8 표현은 다음과 같습니다. \xE2\x96\xBE이는 %E2%96%BEURL 인코딩 된 경우.


1
이것은 멋지고 우아한 솔루션입니다
JosFabre

1
이것은 내가 찾던 것과 정확히 일치하는 추가 HTML이 필요하지 않은 환상적이고 간단하며 우아한 솔루션입니다! 감사! 이것은 IMO에서 선택한 답변이어야합니다.
KyleFarris


13

같은 문제에 직면했습니다. 아마도 해결책이 될 수 있습니다.

<select id="select-1">
    <option>One</option>
    <option>Two</option>
    <option>Three</option>
</select>
<label for="select-1"></label>

#select-1 {
    ...
}

#select-1 + label:after {
    ...
}

레이블을 선택 요소 위에 배치하는 데 필요한 스타일을 추가 할 수 있습니까?
bafromca 2014 년

7

이 솔루션은 sroy의 솔루션과 유사하지만 웹 글꼴 대신 CSS 삼각형을 사용합니다.

.select-wrapper {
  position: relative;
  width: 200px;
}
.select-wrapper:after {
  content: "";
  width: 0;
  height: 0;
  border-left: 5px solid transparent;
  border-right: 5px solid transparent;
  border-top: 6px solid #666;
  position: absolute;
  right: 8px;
  top: 8px;
  pointer-events: none;
}
select {
  background: #eee;
  border: 0 !important;
  border-radius: 0;
  -webkit-appearance:none;
  -moz-appearance:none;
  appearance:none;
  text-indent: 0.01px;
  text-overflow: "";
  font-size: inherit;
  line-height: inherit;
  width: 100%;
}
select::-ms-expand {
  display: none;
}
<div class="select-wrapper">
  <select>
    <option value="1">option 1</option>
    <option value="2">option 2</option>
    <option value="3">option 3</option>
  </select>
</div>


6

마크 업 수정이 옵션이 아닌 경우 어떻게합니까?

다음은 래퍼에 대한 요구 사항이없는 솔루션입니다. 배경 이미지에 SVG를 사용합니다. 채우기 색상을 변경하는 방법을 이해 하려면 HTML 엔티티 디코더 를 사용해야 할 수 있습니다 .

-moz-appearance: none;
-webkit-appearance: none;
appearance: none;

background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23000000%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E');
background-repeat: no-repeat;
background-position: right .7em top 50%;
background-size: .65em auto;

CSS-Tricks 에서 핀치 .


이것은 좋은 속임수입니다. 우리가 여전히 2020 년에 스타일 선택을 할 수 없다는 사실이 매우 짜증납니다.
ramijames

5

이것은 내가 font-awesome을 사용하여 만든 현대적인 솔루션 입니다. 간결성을 위해 공급 업체 확장은 생략되었습니다.

HTML

<fieldset>
    <label for="color">Select Color</label>
    <div class="select-wrapper">
        <select id="color">
            <option>Red</option>
            <option>Blue</option>
            <option>Yellow</option>
        </select>
        <i class="fa fa-chevron-down"></i>
    </div>
</fieldset>

SCSS

fieldset {
    .select-wrapper {
        position: relative;

        select {
            appearance: none;
            position: relative;
            z-index: 1;
            background: transparent;

            + i {
                position: absolute;
                top: 40%;
                right: 15px;
            }
        }
    }

선택 요소에 정의 된 배경색이있는 경우이 스 니펫이 기본적으로 선택 요소 뒤에 Chevron 아이콘을 배치하므로 작동하지 않습니다 (아이콘 상단을 클릭하여 선택 작업을 시작할 수 있음).

그러나 선택 래퍼의 스타일을 선택 요소와 동일한 크기로 지정하고 배경의 스타일을 지정하여 동일한 효과를 얻을 수 있습니다.

CodePen 에서 일반 레이블과 "자리 표시 자"레이블 및 테두리 및 너비와 같은 기타 정리 된 스타일을 사용하여 어둡고 밝은 테마 선택 상자에이 코드를 보여주는 작업 데모를 확인하십시오 .

추신 이것은 내가 올해 초에 또 다른 중복 질문에 게시 한 답변입니다.


1
<div class="select">
<select name="you_are" id="dropdown" class="selection">
<option value="0" disabled selected>Select</option>
<option value="1">Student</option>
<option value="2">Full-time Job</option>
<option value="2">Part-time Job</option>
<option value="3">Job-Seeker</option>
<option value="4">Nothing Yet</option>
</select>
</div>

선택을 스타일링하기 위해 선택 영역 외부에 div를 추가하지 않는 이유는 무엇입니까?

CSS에서 스타일

.select{
    width: 100%;
    height: 45px;
    position: relative;
}
.select::after{
    content: '\f0d7';
    position: absolute;
    top: 0px;
    right: 10px;
    font-family: 'Font Awesome 5 Free';
    font-weight: 900;
    color: #0b660b;
    font-size: 45px;
    z-index: 2;

}
#dropdown{
    -webkit-appearance: button;
       -moz-appearance: button;
            appearance: button;
            height: 45px;
            width: 100%;
        outline: none;
        border: none;
        border-bottom: 2px solid #0b660b;
        font-size: 20px;
        background-color: #0b660b23;
        box-sizing: border-box;
        padding-left: 10px;
        padding-right: 10px;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.