J'ai vu cette zone de sélection très simple sur youtube, où les options de sélection sont visibles en survol (au lieu de cliquer), comme le montre la capture d'écran suivante.
J'essaie de créer un effet similaire dans la zone de sélection simple suivante. Quelqu'un peut-il s'il vous plaît aider comment cela peut être fait? Merci.
<select name="size">
<option value="small">Small</option>
<option value="medium">Medium</option>
<option value="large">Large</option>
</select>
Voici une façon de le faire, même si je préférerais une approche plus plug-in (plutôt que de coder en dur le code HTML ul
):
$('#selectUl li:not(":first")').addClass('unselected');
// Used to hide the 'unselected' elements in the ul.
$('#selectUl').hover(
function(){
// mouse-over
$(this).find('li').click(
function(){
$('.unselected').removeClass('unselected');
// removes the 'unselected' style
$(this).siblings('li').addClass('unselected');
// adds 'unselected' style to all other li elements
var index = $(this).index();
$('select option:selected').removeAttr('selected');
// deselects the previously-chosen option in the select
$('select[name=size]')
.find('option:eq(' + index + ')')
.attr('selected',true);
// assumes a 1:1 relationship between the li and option elements
});
},
function(){
// mouseout (or mouseleave, if they're different, I can't remember).
});
Edited pour inclure une alert
démontrant les modifications apportées à la valeur de l'élément select
: JS Fiddle demo .
Edited pour inclure les fichiers CSS et HTML utilisés dans la démo:
<select name="size">
<option value="small">Small</option>
<option value="medium">Medium</option>
<option value="large">Large</option>
</select>
<ul id="selectUl">
<li>small</li>
<li>medium</li>
<li>large</li>
</ul>
select {
opacity: 0.5;
}
ul {
width: 8em;
line-height: 2em;
}
li {
display: list-item;
width: 100%;
height: 2em;
border:1px solid #ccc;
border-top-width: 0;
text-indent: 1em;
background-color: #f90;
}
li:first-child {
border-top-width: 1px;
}
li.unselected {
display: none;
background-color: #fff;
}
ul#selectUl:hover li.unselected {
background-color: #fff;
}
ul#selectUl:hover li,
ul#selectUl:hover li.unselected {
display: list-item;
}
ul#selectUl:hover li {
background-color: #fc0;
}
ul#selectUl li:hover,
ul#selectUl li.unselected:hover {
background-color: #f90;
}
Cela force le menu à masquer les éléments unselected
jusqu'à ce que la ul
soit survolé, puis affiche toutes les options et utilise l'événement click()
pour affecter le nom de la classe unselected
aux éléments non cliqués. ce qui permet à l’élément cliqué d’être toujours visible lors du mouseout.
Le code CSS ci-dessus reflète la modification la plus récente, afin de rendre plus visible la sélection actuellement sélectionnée et :hover
-, li
.
Edité parce que je me suis un peu ennuyé. Et comme je n'avais rien de mieux à faire, j'ai donc créé un plug-in simple:
(function($) {
$.fn.selectUl = function(){
var $origSelect = $(this);
var newId = $(this).attr('name') + '-ul';
var numOptions = $(this).children().length;
$('<ul id="' + newId + '" class="plainSelect" />')
.insertAfter($(this));
for (var i = 0; i < numOptions; i++) {
var text = $(this).find('option').eq(i).text();
$('<li />').text(text).appendTo('#' + newId);
}
if ($(this).find('option:selected')) {
var selected = $(this).find('option:selected').index();
$('#' + newId)
.find('li')
.not(':eq(' + selected + ')')
.addClass('unselected');
}
$('#' + newId + ' li')
.hover(
function(){
$(this).click(
function(){
var newSelect = $(this).index();
$(this)
.parent()
.find('.unselected')
.removeClass('unselected');
$(this)
.parent()
.find('li')
.not(this)
.addClass('unselected');
$($origSelect)
.find('option:selected')
.removeAttr('selected');
$($origSelect)
.find('option:eq(' + newSelect + ')')
.attr('selected',true);
});
},
function(){
});
// assuming that you don't want the 'select' visible:
$(this).hide();
return $(this);
}
})(jQuery);
$('#sizes').selectUl();
JS Fiddle démo, y compris le 'plug-in' .
Remarques:
select
ce que vous pouvez certainement faire et fonctionne bien), il _ (faitvisse avec le flux de page un peu (ou beaucoup), mais cela peut être modifié dans le CSS (j'imagine, même si je n'ai pas encore essayé).dl
d'être utilisés à la place de la ul
actuelle, ce qui permettrait d'expliquer les options disponibles.Edited parce que j’ai pensé qu’il devrait y avoir un élément de "guidage" visible, et aussi pour essayer d’expliquer un peu comment tout cela fonctionne.
Étant donné le html:
<select name="sizes" id="sizes" class="makePlain" title="Select a size:">
<option value="xxs">XX-Small</option>
<option value="xs">X-Small</option>
<option value="s">Small</option>
<option value="m">Medium</option>
<option value="l">Large</option>
<option value="xl">X-Large</option>
<option value="xxl">XX-Large</option>
</select>
Utilisez jQuery pour appeler le plugin:
$('#sizes').selectUl();
Cela prend la sélection ci-dessus et crée une ul
avec le balisage suivant:
<ul id="sizes-ul" class="plainSelect">
<li class="guidance">Select a size:</li>
<li>XX-Small</li>
<li class="unselected">X-Small</li>
<li class="unselected">Small</li>
<li class="unselected">Medium</li>
<li class="unselected">Large</li>
<li class="unselected">X-Large</li>
<li class="unselected">XX-Large</li>
</ul>
Le CSS utilisé (dans la démo):
ul.plainSelect {
/* targets those 'ul' elements created by the plug-in */
border: 1px solid #000;
}
ul.plainSelect li {
/* this styles the 'selected' li 'option' element */
background-color: #f90;
display: list-item;
}
ul.plainSelect li.guidance {
/* this is the 'Select a Reason' guidance/explanation from the image in the question */
border-bottom: 1px solid #000;
padding: 0.3em;
font-weight: bold;
font-size: 1.2em;
background-color: #fff;
}
ul.plainSelect li.unselected {
/* hides the 'unselected' options, and removes the background-color for contrast */
background-color: #fff;
display: none;
}
ul.plainSelect:hover li,
ul.plainSelect:hover li.unselected {
/* ensures that the 'li' elements pop-up when the list is hovered over, */
/* and act/display like 'li' elements */
display: list-item;
}
Il est impossible d'ouvrir une boîte select
de la manière la plus claire que vous décrivez. Ce n'est pas un hasard si l'image que vous avez fournie ne ressemble en rien à une boîte de sélection normale. En effet, il s’agit probablement d’une liste ul
dont le style ressemble à ce qu’elle se présente, qui se révèle en survol, ce qui est effectivement possible.
J'ai créé un exemple plus sur jsfiddle de la façon dont cela pourrait être fait.
Si vous souhaitez le faire de cette manière, j'ai une façon simple et non javascript de le faire sur mon projet actuel en fait (regardez le menu "Je veux" en haut). Comme @Marcus l'a dit, il ne s'agit pas d'une zone de sélection, mais d'une liste non ordonnée (<ul>
).
Le code HTML est simple:
<div id="iWantToMenuContainer">
<ul id="i-want-to" class="menu">
<li><a href="http://cumberlandme.info/contact">contact the town office</a></li>
<li><a href="http://cumberlandme.info/upcoming-events">find out what’s happening</a></li>
<li><a href="http://cumberlandme.info/online-services">get permits and services applications</a></li>
</ul>
</div>
la partie importante est le css, essentiellement les 2 premières règles. La div semble se développer à cause du overflow:visible
sur :hover
.
#iWantToMenuContainer {
overflow:hidden;
}
#iWantToMenuContainer:hover {
overflow:visible
}
#iWantToMenuContainer ul {
border:1px solid #b6c2b9;
background:#fff;
padding:1px 20px 3px 5px
}
#iWantToMenuContainer a:link,#iWantToMenuContainer a:visited {
display:block;
background: #fff;
}
#iWantToMenuContainer a:hover {
background:#e6e6e6
}
Au travail en ce moment, donc je ne peux pas vérifier youtube, mais d'après le style, je suppose que le contrôle "select" n'est pas un contrôle de sélection réel. Très probablement, il est implémenté comme un menu déroulant de navigation mais au lieu de naviguer vers une URL sur un clic, il remplace le contenu et la valeur d'une étiquette d'entrée. Ensuite, sur le formulaire de soumission, il peut récupérer la valeur de l'étiquette.
Lien vers le plugin jquery mis à jour Plugin $ .selectUI