Usuwanie zaokrąglonych rogów z elementu <select> w Chrome / Webkit


143

Arkusz stylów klienta użytkownika dla przeglądarki Chrome zapewnia promień obramowania wynoszący 5 pikseli we wszystkich rogach <select>elementu. Próbowałem się tego pozbyć, stosując promień 0px w moim zewnętrznym arkuszu stylów, a także wbudowany w sam element; Wypróbowałem oba border-radius:0pxi -webkit-border-radius:0px;wypróbowałem jeszcze bardziej szczegółowy border-top-left-radius:0px(wraz z jego odpowiednikiem -webkit).

Żaden nie działa.

Kiedy badam element w narzędziach programistycznych webkit, styl obliczony nadal podaje promień jako 5px. Ale jeśli kliknę strzałkę ekspandera obok niego, aby zobaczyć szczegóły, brzmi: element.style - 0px. A poniżej pokazuje zewnętrzną specyfikację css, którą podałem, 0px, wraz ze specyfikacją arkusza stylów agenta użytkownika wynoszącą 5 pikseli. Oba te ostatnie są przekreślone, tak jak powinny.

Jakieś pomysły?


Czy możesz również wysłać kod? Jeszcze lepiej, jeśli opublikujesz go za pomocą jsfiddle.net.
— ngen

1
Właściwie nie mam żadnego border-radius jako domyślnego stylu w Chrome 10 na Win7, może to jest inna wersja lub system operacyjny?
— Wesley Murch,

Brak zaokrąglonych rogów również w Chrome 12 na Windows 7.
— andyb,

1
Powinienem był wspomnieć, że jest na Mac OS X.
— maxedison

Odpowiedzi:


244

To działa dla mnie (style pierwszy wygląd, a nie lista rozwijana):

select {
  -webkit-appearance: none;
  -webkit-border-radius: 0px;
}

http://jsfiddle.net/fMuPt/


179
Czy jest jakiś sposób, aby usunąć zaokrąglone rogi, ale zachować strzałki po prawej stronie?
— Adam

3
musisz dodać strzałki np. jako obraz tła z pozycją 100% 50% i atrybutem bez powtórzeń. Użyłem również obrazu zakodowanego w base64 w css, aby uniknąć dodatkowych żądań http.
— Karl Adler,

26
@Adam Udało mi się, jeśli użyjesz border: 0i dodasz konspekt, taki jak:outline: 1px inset black; outline-offset:-1px
— Filipe Pereira

1
@FilipePereira Nice Podoba mi się, chociaż muszę dodać, że przesunięcie konturu nie jest obsługiwane przez IE.
— Tim,

6
Eliminuje to strzałki po prawej stronie, co w niedopuszczalny sposób szkodzi użytkownikowi. Zamiast tego nadaj styl menu rozwijanemu, background-color: #yourbga border-style: nonenastępnie utwórz element div bezpośrednio przed nim za pomocą position: absolutei border-bottom: 1px solid #youpicki display: inline. Strzały zachowane, nienaruszone UX, lepsza naprawa.
— devigner

90

Tylko moje rozwiązanie z rozwijanym obrazem (inline svg)

select.form-control {
    -webkit-appearance: none;
    -webkit-border-radius: 0px;
    background-image: url("data:image/svg+xml;utf8,<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='24' height='24' viewBox='0 0 24 24'><path fill='%23444' d='M7.406 7.828l4.594 4.594 4.594-4.594 1.406 1.406-6 6-6-6z'></path></svg>");
    background-position: 100% 50%;
    background-repeat: no-repeat;
}

Używam bootstrap, dlatego użyłem select.form-control
You can use select{or select.your-custom-class{zamiast.


4
To jedyna odpowiedź, która rozwiązała mój problem, chociaż pamiętaj o używaniu tła zamiast obrazu tła, ponieważ kolor wypełnienia svg zastąpi dowolny kolor tła, który ustawiłeś dla danych wejściowych.
— Lucas M

Zgoda, zagłosuj na tę odpowiedź! Nie rozumiem pozostałych głosów dotyczących niepełnej odpowiedzi. Masz jakąś radę dotyczącą używania fontawesome icon zamiast inline svg?
— Nicolas Thery

FontAwesome to zbiór ikon, ale potrzebujesz tylko jednej ikony. Musisz więc wyodrębnić jedną z ikon FA za pomocą jakiegoś narzędzia, takiego jak icomoon.io. Następnie wyeksportuj tę ikonę jako plik svg lub png i połącz ją ze swoim css
— Afzal Hossain

Niezłe rozwiązanie, ale w mojej sytuacji dodałem kolor tła: biały;
— Viktor Bogutskii

Należy jednak pamiętać, że po ustawieniu width: auto;dodana strzałka svg nakłada się na zawartość zaznaczenia. Wymaga to dodatkowego wypełnienia po prawej stronie 16 pikseli. To wypełnienie jest jednak widoczne we wszystkich przeglądarkach, przełamując projekt w innych przeglądarkach. Nie mam jeszcze na to rozwiązania ...
— Klaas van der Weij

31

Jeśli chcesz kwadratowe obramowania i nadal chcesz mieć małą strzałkę ekspandera, polecam:

select.squarecorners{
     border: 0;
     outline: 1px solid #CCC;
     background-color: white;
}

2
Problemem jest to, że można zastąpić domyślny outlinetemat :focus. Jeśli zamierzasz użyć tej odpowiedzi, powinieneś zmienić swój select:focusstyl, aby wizualnie pokazać, że selectelement staje się aktywny lub zmieniony :focuspo kliknięciu.
— Devin McInnis

@ jordan314 Sprawdź zaokrąglone rogi na tym zdjęciu . Border-radius: 0; nie ma wpływu na zaznaczenie znacznika. Przynajmniej na Chrome OSX.
— Jammer

1
@ 7immy to dziwne, jestem też na Chrome OS X i oto zrzut ekranu z powyższego fiddle imgur.com/r6ce6Yv
— jordan314

1
@ jordan314 A co powiesz na to? jsfiddle.net/78xa6qud/2 . Myślę, że ujdzie nam to na sucho, jeśli tło zaznaczenia i tło za nim mają ten sam kolor.
— Jammer

@ 7immy ah tak, myślę, że to zastrzeżenie.
— jordan314

7

Kilka dobrych rozwiązań tutaj, ale ten nie potrzebuje SVG, zachowuje obramowanie przez outlinei ustawia go w jednej linii na przycisku.

select {
  height: 20px;
  -webkit-border-radius: 0;
  border: 0;
  outline: 1px solid #ccc;
  outline-offset: -1px;
}
<select>
 <option>Apple</option>
 <option>Ball</option>
 <option>Cat</option>
</select>


6

Podczas gdy górna odpowiedź usuwa obramowanie, usuwa również strzałkę, co bardzo utrudnia, jeśli nie uniemożliwia użytkownikowi zidentyfikowanie elementu jako zaznaczonego.

Moim rozwiązaniem było po prostu umieszczenie białego div (z border-radius: 0px) za zaznaczeniem. Ustaw jego pozycję na wartość bezwzględną, jej wysokość na wysokość zaznaczenia i powinieneś być gotowy!


4

Rozwiązanie z niestandardową strzałką rozwijaną w prawo, używa tylko CSS (bez obrazów)

select {
  -webkit-appearance: none;
  -webkit-border-radius: 0px;
  background-image: linear-gradient(45deg, transparent 50%, gray 50%), linear-gradient(135deg, gray 50%, transparent 50%);
  background-position: calc(100% - 20px) calc(1em + 2px), calc(100% - 15px) calc(1em + 2px), calc(100% - 2.5em) 0.5em;
  background-size: 5px 5px, 5px 5px, 1px 1.5em;
  background-repeat: no-repeat;

  -moz-appearance: none;
  display: block;
  padding: 0.3rem;
  height: 2rem;
  width: 100%;
}
<html>

<body>
  <br/>
  <h4>Example</h4>
  <select>
    <option></option>
    <option>Hello</option>
    <option>World</option>
  </select>
</body>

</html>


Pozycjonowanie w tle, które działało lepiej dla moich potrzeb, to: background-position: calc(100% - 4px) center, 100% center;Przenosi strzałkę na środek zaznaczenia i do końca w prawo. Wielkie dzięki za wspaniały początek!
— Brandon

3

Jednym ze sposobów, aby zachować prostotę i uniknąć mieszania się ze strzałkami i innymi tego typu funkcjami, jest umieszczenie go w elemencie div z tym samym kolorem tła co znacznik wyboru.


1
Zgadzam się, jest to zdecydowanie najprostsze, najbardziej niezawodne i przenośne rozwiązanie.
— John Henckel,

1

Należy unikać eliminowania strzał. Rozwiązaniem, które zachowuje strzałki rozwijane, jest najpierw usunięcie stylów z listy rozwijanej:

.myDropdown {
  background-color: #yourbg;
  border-style: none;
}

Następnie utwórz div bezpośrednio przed listą rozwijaną w kodzie HTML:

<div class="myDiv"></div>
<select class="myDropdown...">...</select>

I stylizuj element div w ten sposób:

.myDiv {
  background-color: #yourbg;
  border-style: none;
  position: absolute;
  display: inline;
  border: 1px solid #acolor;
}

Display inline zapobiegnie przechodzeniu elementu div do nowego wiersza, pozycja bezwzględna usunie go z przepływu strony. Efektem końcowym jest ładne, wyraźne podkreślenie, które możesz stylizować, jak chcesz, a lista rozwijana nadal zachowuje się tak, jak oczekiwałby użytkownik.


1

Wstawiony box-shadow załatwia sprawę.

select{
  -webkit-appearance: none;
  box-shadow: inset 0px 0px 0px 4px;
  border-radius: 0px;
  border: none;
  padding:20px 150px 20px 10px;
}

Próbny


0

Z jakiegoś powodu wpływa na to kolor obramowania ??? Kiedy używasz standardowego koloru, rogi pozostają zaokrąglone, ale jeśli zmienisz kolor nawet nieznacznie, zaokrąglenie zniknie.

select.regularcolor {
    border-color: rgb(169, 169, 169);
}

select.offcolor {
    border-color: rgb(170, 170, 170);
}

https://jsfiddle.net/hLg70o70/2/


Hmm nie jestem pewien co do OSX. Po prostu spróbowałem ponownie w systemie Windows (wersja Chrome 45.0) i nadal działa.
— Wydaje

Dzieje się tak, ponieważ ustawienie obramowania powoduje, że przeglądarka wyrenderuje samą kombi, zamiast korzystać z podstawowej wersji dostarczonej przez system operacyjny.
— Kong

0

dobrze, mam rozwiązanie. mam nadzieję, że może ci pomóc :)

select{
      border-image: url(http://www.w3schools.com/cssref/border.png) 30 stretch;
      width: 120px;
      height: 36px;
      color: #999;
  }
<select>
  <option value="1">Hi</option>
  <option value="2">Bye</option>
</select>


0

Oto sposób na zrobienie tego;

  1. Utwórz obraz tła, który wygląda jak lista rozwijana.
  2. Wyłącz wygląd przeglądarki
  3. Wyrównaj obraz tła na wybranym komponencie
  .control select {  
    border-radius: 0px;
    appearance: none;
    -webkit-appearance: none;
    -moz-appearance: none;
    background-image: url("<your image>");
    background-repeat: no-repeat;
    background-position: 100%;
    background-size: 20px;
  }

-1

Użyłem rozwiązania jordan314, ale potem dodałem do wyboru klasę „border-light”. Jeśli masz domyślną klasę border-light zdefiniowaną w css, możesz jej bezpośrednio użyć. Po prostu definiuje obramowanie jako białe). Zmieniłem ramkę na kwadrat / usunąłem promień i zachowałem strzałkę.

Oto co zrobiłem:

<select class="form-control border border-light" id="type">
   <option>Select</option>
   <option value="mobile">Apple</option>
 </select>

jeśli nie masz predefiniowanego border-light, po prostu dodaj swój css:

<style>
.border-light{
         border-color:#f8f9fa!important
     }

 #type {
   border:0;
   outline:1px solid #ddd;
   background-color:white;
 }
</style>


-10

Ustaw CSS jako

border-radius:0px !important
-webkit-border-radius:0px !important
border-top-left-radius:0px !important

Spróbuj, czy to działa.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.