Good, adapting here was as below.
But does it have a way to optimize this code?
I’m guessing it’s not well written, although it’s working properly.
$(document).ready(function(e) {
// entrega o primeiro elemento da select option à div .selecionada
$(".selectOptions .selecionada").html($(".selectOptions select > option:first-child").html());
/*popula as li's*/
$(".selectOptions select > option").each(function() {
//Não exibe a primeira li pois esta já está sendo exibida na .selecionada
if ($(this).is(':first-child')) $(".selectOptions ul").append("<li value='" + this.value + "' style='display:none;'>" + this.text + "</li>");
else $(".selectOptions ul").append("<li style='display:block;' value='" + this.value + "'>" + this.text + "</li>");
});
//contador de vezes que abre e fecha a ul
contador = 0;
$(".selectOptions .selecionada").click(function(e) {
quantasLis = $(".selectOptions ul li").length;
if (contador % 2 == 0) {
$(".selectOptions .selecionada").addClass("setaCima").removeClass("setaBaixo");
$(".selectOptions ul").css("display", "block");
$(".selectOptions ul li").css("display", "none").slideDown(400);
if (quantasLis > 4) {
$(".selectOptions ul").css('height', '175px');
$(".selectOptions ul").css("overflow-y", "scroll");
} else {
$(".selectOptions ul").css('height', (quantasLis*35)+'px');
$(".selectOptions ul").css("overflow-y", "auto");
}
janela = $(window).height();
selecionadaPosicao = $(".selectOptions .selecionada").offset().top;
selecionadaAltura = $(".selectOptions .selecionada").height();
ulAltura = $(".selectOptions ul").height();
janelaScroll = $(window).scrollTop(); // distância que a página foi rolada
posicaoFinal = ulAltura + $(".selectOptions .selecionada").outerHeight();
total = selecionadaPosicao + selecionadaAltura + ulAltura - janelaScroll;
if (total >= janela)
$(".selectOptions ul").css("bottom", posicaoFinal, "important");
else
$(".selectOptions ul").css("bottom", "0", "important");
} else {
$(".selectOptions .selecionada").addClass("setaBaixo").removeClass("setaCima");
$(".selectOptions ul li").slideUp(400, function() {
$(".selectOptions ul").css("overflow-y", "hidden");
});
}
contador++;
e.stopPropagation();
});
/*ai clicar na li, busca correspondência na select option e o checa (marca)*/
$('.selectOptions ul li').on('click', function(evt) {
/*Joga a li selecionada na label .selecionada*/
$(".selectOptions .selecionada").html($(this).html());
/*Joga a li selecionada ao topo da ul*/
$($(this).closest('ul')).prepend($(this));
// Armazena nome do maos que quer selecionar
var li = $(this).attr("value");
// Guarda em opcao o elemento que retornar do filtro que vai testar entre as
// options possÃveis
var opcao = $('.selectOptions select option').filter(function() {
// testa entre as options qual delas tem o mesmo conteúdo que o desejado
return $(this).attr('value') === li;
});
// Redefine o atributo do elemento encontrado pra selecionado.
opcao.attr('selected', true);
});
// ao clicar em qualquer coissa, fecha a ul caso ela esteja aberta
$(document).on('click', function(e) {
if (
$(".selectOptions ul").css("overflow-y") == "auto" ||
$(".selectOptions ul").css("overflow-y") == "scroll") {
$(".selectOptions .selecionada").trigger("click");
}
});
});
It depends on what you call the "end of the screen"... to do this calculation, you need to define what you consider "the button at the end of the screen", because the button may be EXACTLY at the end or a few pixels above.
– Sam
@Dcdsam, first of all, thanks again for the force. So, as you scroll the screen up, the button goes down, of course. And when the button reaches the bottom of the screen, not at the bottom of the page because a page only ends at the bottom of html, but at the bottom of the visible part of the screen, then I have the position I want to calculate.
– Carlos Rocha