separador de opções de seleção html

208

Como você cria um separador em uma tag de seleção?

New Window
New Tab
-----------
Save Page
------------
Exit
Phillip Senn
fonte
Normalmente, adiciono uma opção desabilitada com espaço em branco como rótulo.
Abhi Beckert

Respostas:

331

A abordagem da opção desativada parece ter a melhor aparência e o melhor suporte. Também incluí um exemplo de uso do optgroup.

optgroup (desta maneira meio que é péssimo):

<select>
    <optgroup>
        <option>First</option>
    </optgroup>
    <optgroup label="_________">
        <option>Second</option>
        <option>Third</option>
    </optgroup>
</select>

opção desativada (um pouco melhor):

<select>
    <option>First</option>
    <option disabled>_________</option>
    <option>Second</option>
    <option>Third</option>
</select>

E se você quiser ser realmente chique, use o caractere de desenho da caixa unicode horizontal.
(MELHOR OPÇÃO!)

<select>
    <option>First</option>
    <option disabled>──────────</option>
    <option>Second</option>
    <option>Third</option>
</select>

http://jsfiddle.net/JFDgH/2/

Alex K
fonte
21
O Unicode funcionou muito bem para mim no jsfiddle, mas quando tentei copiá-lo / colá-lo no meu código, ele não foi traduzido corretamente. Portanto, para aqueles com esse problema, a codificação HTML para o caractere de desenho da caixa unicode horizontal é & # 9472; fileformat.info/info/unicode/char/2500/index.htm e também há uma opção mais pesada em & # 9473; fileformat.info/info/unicode/char/2501/index.htm
JeffG 10/10
1
no Mobile Firefox (e possivelmente em outros navegadores móveis), a disabledopção é mostrada com um botão de opção desabilitado à direita ...
GoTo
mas os grupos de opções são renderizados de maneira diferente no PC e no celular, portanto a opção desativada ainda é a melhor solução.
GoTo
1
A codificação do arquivo html também é vital para que os caracteres "─" apareçam como uma linha, em vez de sem sentido. UFT8 com BOM pode ser uma boa escolha.
Andreas Jansson
1
@ db0 A aparência é inconsistente. grab.by/EzEi vs grab.by/EzEk (consulte o link jsfiddle).
Alex K
76

Experimentar:

<optgroup label="----------"></optgroup>
Tina Orooji
fonte
40
Em vez de colocar um rótulo nos grupos de opções, tente adicioná-lo à sua folha de estilo: optgroup + optgroup {border-top: 1px preto sólido} Muito menos aparência brega do que um monte de traços.
Laurence Gonsalves
2
Os rótulos do grupo de opções devem descrever o grupo. Se um navegador fosse implementado de acordo com a captura de tela na especificação do HTML 4.01, o usuário seria confrontado com linhas de traços e teria que examinar cada um para descobrir o que estava por trás dele.
Quentin
2
@ Laurence: O IE7 não suporta estilos CSS no optgroup ou nos elementos da opção. Pelo menos não fronteiras
grom
1
<optgroup style = "border-top: 1px pontilhado #ccc; margin: 5px 0;"> </optgroup> - parece legal pelo menos no firefox!
Ben Sinclair
1
Um grupo de opções vazio como este não é um html legal. Você receberá erros de validação se usá-lo. Prefiro a resposta de james.garriss.
Ariel
22

Este é um tópico antigo, mas como ninguém postou uma resposta semelhante, adicionarei isso, pois é o meu modo preferido de separação.

Acho que usar traços e tal é um pouco desagradável, pois pode ficar aquém da largura da caixa de seleção. Então, prefiro usar CSS para criar meus separadores ... uma simples coloração de fundo.

<select>
  <option style="background-color: #cccccc;" disabled selected>Select An Option</option>
  <option>First Option</option>
  <option>Second</option>
  <option style="font-size: 1pt; background-color: #000000;" disabled>&nbsp;</option>
  <option>Third</option>
  <option>Fourth</option>
  <option style="font-size: 1pt; background-color: #000000;" disabled>&nbsp;</option>
  <option>Fifth</option>
  <option>Sixth</option>
</select>

Dexter Blake
fonte
ótimo ! Eu usei min-height: 1px; altura máxima: 1 px; estofamento: 0; em vez do tamanho da fonte: 1pt; para uma linha 1px
kofifus
15

Se você não quiser usar o elemento optgroup, coloque os traços em um elemento opcional e atribua o atributo desativado. Será visível, mas acinzentado.

<option disabled>----------</option>
james.garriss
fonte
Oi James, eu também gosto dessa solução, mas os leitores de tela lêem "desativar opção traço traço traço ...", o que pode ser muito confuso para usuários com deficiência ... você tem uma idéia de como podemos evitar isso? obrigado!
Julio
1
É possível adicionar uma classe aos elementos visuais que você não deseja falar e adicionar um comando ARIA que oculta / desativa a classe? Talvez algo como uma das técnicas usadas aqui? asurkov.blogspot.com/2012/02/…
james.garriss
Na verdade, @Julio, você deve postar isso como uma nova pergunta. Estou curioso para saber, mas nunca tinha programado para leitores de tela antes.
James.garriss
9

Em vez do hífon comum, substituí-lo usando um símbolo de barra horizontal do conjunto de caracteres estendidos, não ficará muito bom se o usuário estiver em outro país que substitua esse caractere, mas funcione bem para mim. Existe uma variedade de chacters diferentes que você pode usar para obter ótimos efeitos e não há CSS envolvido.

<option value='-' disabled>――――</option>
user511941
fonte
8

Defina uma classe em CSS:

option.separator {
    margin-top:8px;
    border-top:1px solid #666;
    padding:0;
}

Escreva em HTML:

<select ...>
    <option disabled class="separator"></option>
</select>
Klaus Heyne
fonte
2
A resposta pode ser melhorada com um exemplo do jsfiddle. Essa parece ser a solução mais integrada, sem depender de efeitos colaterais ou hacks, mas seria bom comparar visuais de outras respostas.
raider33
Não funciona em muitos navegadores. (como de costume, entradas sendo uma dor na bunda) #
4040 Quarenta
5

Estou transformando o comentário de @Laurence Gonsalves em uma resposta, porque é o único que funciona semanticamente e não parece um hack.

Tente adicionar isso à sua folha de estilo:

optgroup + optgroup { border-top: 1px solid black } 

Muito menos brega do que um monte de traços.

Noumenon
fonte
2
Essa é realmente a maneira correta de fazer isso (o mais importante é que não adiciona conteúdo sem sentido). Eu gosto de estilo desta forma (adicionando um pouco de espaço extra verticais ao redor do separador):optgroup { padding-bottom: 8px; } optgroup:not(:first-child) { padding-top: 8px; border-top: solid 1px #666; }
Nicolas Le Thierry d'Ennequin
3

Outra maneira é usar uma imagem de fundo css 1x1 na opção que parece funcionar apenas com o Firefox e ter um fallback "----"

<option value="" disabled="disabled" class="SelectSeparator">----</option> 

.SelectSeparator
    {
      background-image:  url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAAAAACH5BAAAAAAALAAAAAABAAEAAAICTAEAOw==);
      color:black;
      background-repeat:repeat-x;
      background-position:50% 50%;
      background-attachment:scroll;
}

http://jsfiddle.net/yNecQ/6/

ou usar javascript (jquery) para:

-hide the select element and 
-show a div which can be completely styled and 
-reflect the div state onto the select for the form submit

http://tutorialzine.com/2010/11/better-select-jquery-css3/


consulte também Como adiciono uma linha horizontal em um controle de seleção html?

ebricca
fonte
1

Você pode usar o em dash "-". Não há espaços visíveis entre cada personagem.
(Em algumas fontes!)

Em HTML:

<valor da opção = "————————————” desativado> ——————————— </option>

Ou em XHTML:

<valor da opção = "———————————" disabled = "disabled"> ———————————— </option>
Tobi
fonte
1
O espaçamento entre os caracteres é determinado pela fonte e pelo mecanismo de renderização. Por exemplo, vejo espaços entre seus traços no Chrome (Windows), mas não no Safari (Mac).
Hank
1

Este é o melhor sempre.

<option>First</option>
<option disabled>_________</option>
<option>Second</option>
<option>Third</option>

Tejashree
fonte
1
 <option  data-divider="true" disabled>______________</option>

você pode fazer isso também. é fácil e faça com que o divisor selecione a lista suspensa.

DSK
fonte
0

Optei por alternativamente condicionalmente cor e fundo. Definindo uma ordem de classificação e com o vue.js, fiz algo assim:

<style>
    .altgroup_1 {background:gray; color:white;}
    .altgroup_2{background:white; color:black;}
</style>

<option :class = {
    'altgroup_1': (country.sort_order > 25),
    'altgroup_2': (country.sort_order > 50 }"
    value="{{ country.iso_short }}">
    {{ country.short_name }}
</option
STWilson
fonte