Jump to content


Photo

Estabelecer Tempo No Hover


  • Faça o login para participar
33 replies to this topic

#1 marcosfj1

marcosfj1

    Turista

  • Usuários
  • 53 posts
  • Sexo:Masculino

Posted 25/03/2011, 13:00

Bom apesar desse forum andar mto parado, vim aqui na esperança de com este topico seja diferente e alguem consiga me dar um luz de como resolver meu problema

Vamos la

O q eu quero é o seguinte eu tenho uma lista de departamentos, ai qdo o cara passa o mouse em cima do nome desse departamento abre-se em baixo um lista com cada marca referente aquele departamento. Bem isso esta funcionando, porem este processo de abrir estava mto rapido, queria q fosse mais assim, colocou o mouse em cima do nome do departamente e depois de uns 2 segundos abrisse as opcoes.

Pesquisando vi q tinha q ser utilizado um funcao JavaScript, a setTimeOut(); que é responsavel por setar um tempo para que a outra funcao JavaScript aconteca...bom ai seguindo o q um cara me passou eu fiz este controle, porem agora nao esta mais abrindo as opcoes de marca....vou postar meu codigo para vcs verem como tudo é feito:

Primeiro o CSS:
#menu_categoria ul {     
	margin: 0;    
	padding: 0;   
	list-style: none;    
	width: 185px;  
	    
}

#menu_categoria ul li { 
	position: relative;   
}

#menu_categoria li ul  {     
	position: relative;    
	left: 5px;    
	display: none; 
	padding:1px; 
}

#menu_categoria ul li a{ 
	display: block; 
	text-decoration: none; 
	color: #777; 
	background: #fff; 
	padding:4px; 	 
}


#menu_categoria ul {     
	margin: 0;    
	padding: 0;   
	list-style: none;    
	width: 185px; 
	/*border-bottom: 1px solid #ccc;*/  
	    
}
#menu_categoria .itemOver li:hover ul, li.over ul { display: block; }

Eu fiz este CSS baseado em uma explicacao de um tutorial do Maujor, a unica coisa q tive que alterar foi esta ultima linha onde criei este itemOver para que controlasse o mostrar as opcoes por JavaScript

Bom agora vem o JavaScript:
<script language="JavaScript">

function mouse_over_menu(objDiv) 
{ 
        window.setTimeout(open_menu, 1500, objDiv );
} 
function open_menu(objDiv) 
{ 
        objDiv.className = 'itemOver'; 
 
}
</script>

Reparem que na funcao open_menu() eu chamo o itemOver....e na funcao mouse_over_menu() eu coloco q esta funcao será executada a cada 1500 milesegundos....esta foi a funcao q um amigo fez dizendo q daria certo

Agora a geração do menu, que é feito de modo dinamico com PHP:
<div id="menu_categoria" class="boxed" >
  <h2 class="title">Departamentos</h2>
  <div style="margin:5px;" onmouseover="CHAMADA DA FUNCAO">
  
<?

	//
	$sql = "BUSCO DEPARTAMENTOS ATIVOS";
	$req = mysql_query($sql);

	//
	if (mysql_num_rows($req)) {

?>
    <ul class="semMargem" id="nav" >
      <?
	
	//
	while ($cp = mysql_fetch_array($req)) {
	
		//
		$nome = $cp['nome'];
		if ($cp['id_produto_categoria'] == $_GET['categoria'])
			$nome = '<b>'.$cp['nome'].'</b>';
					
?>
   //ATRAVES DO LI MOSTRO TODOS OS DEPARTAMENTOS
      <li  ><a  class="categoria" href="?l=produto&amp;categoria=<?=$cp['id_produto_categoria'] ?>" title="<?=$cp['nome'] ?>" ><?=$nome ?></a></li>
     
<?

	//
	if ($cp['id_produto_categoria'] OR $_GET['categoria']) {
	
		//
		echo '<ul style="margin-bottom:5px;" >';
		
		
		$sql = "BUSCO TODAS AS MARCAS REFERENTES AOS DEPARTAMENTOS ";
		$req2 = mysql_query($sql);
		
		//
		while ($cp2 = mysql_fetch_array($req2)) {
			
			//
			$nome = $cp2['nome'];
			if ($cp2['id_produto_marca'] == $_GET['marca'])
				$nome = '<b>'.$cp2['nome'].'</b>';

?>
         //MOSTRO AS MARCAS QUE CADA DEPARTAMENTO POSSUI....AQUI ACONTECE A MAGICA OU SEJA QDO O CARA PARA O MOUSE EM CIMA DE UM DEPARTAMENTO ESTA LINHA QUE SERÁ MOSTRADA
      	<li ><a  class="marca" style="color:#06C;" href="?l=produto&amp;categoria=<?=$cp['id_produto_categoria'] ?>&amp;marca=<?=$cp2['id_produto_marca'] ?>" title="<?=$cp2['nome'] ?>" ><?=$nome ?></a></li>
<? 
	
		}
		
		echo '</ul>';
		
	}

?>
      
      
      <? } ?>
    </ul>

Como podem ver na DIV eu chamo a funcao....agora vem o problema:
-Se eu chamo:
<div style="margin:5px;" onmouseover="open_menu(this);">
Blz passo o mouse sobre o nome do departamento, e aparece as marcas relacionadas a ele....porem claro nao é setado o tempo para chamar a funcao

-Mas se eu chamo:
<div style="margin:5px;" onmouseover="mouse_over_menu(this);">
OU seja chamei a funcao que chama a outra e determina um tempo para que seja executada...NAO FUNCIONA...ele simplesmente deixa de abrir as opcoes de cada departamento....entao pra mim que nao sei nada de JS mostra q o erro deve estar nessa funcao, mas nao sei o q pode ser

Alguem sabe me ajudar???? Queria mto conseguir fazer isso :(

Detalhe qdo eu passo o mouse em cima do departamento, aparece uns erros na barra de status do IE e ao ver o que esta la é: 'undefined' é nulo e nao é um objeto


POR FAVOR ALGUEM ME AJUDA
==================================================================
Quer conhecer um site Diferente?
FORA DA TELA
==================================================================

#2 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 25/03/2011, 13:54

Esse uso da função setTimeOut não é o mais compatível entre os navegadores. Dê um id pra div a ser aberta e passe esse valor como parâmetro, em vez de uma referência direta ao elemento. Daí seu código fica:

function mouse_over_menu(div_id) 
{ 
        window.setTimeout("open_menu('" + div_id + "')", 1500);
} 
function open_menu(div_id) 
{ 
        document.getElementById(div_id).className = 'itemOver'; 
 
}

<div style="margin:5px;" id="div_dep" onmouseover="mouse_over_menu('div_dep');">


#3 marcosfj1

marcosfj1

    Turista

  • Usuários
  • 53 posts
  • Sexo:Masculino

Posted 25/03/2011, 14:53

Vou tentar aqui e já falo o q aconteceu

Cara primeiramente....MTO OBRIGADO mesmo coloquei exatamente o q vc passou e deu certo sim, parei o mouse sobre um departamento q ele segurou o tempo q eu pedi antes de abrir

Masssss

Tem um problema hehe

Eu tenho uma lista:
Departamento 1
Departamento 2
Departamento 3
Departamento 4
Departamento 5

Bom se eu paro no Departamento 3 ele espera o tempo certo q eu determinei....porem se eu mudo pro Departamento 4 ele já nao espera...parece q nao zera o tempo teria um jeito de zerar este tempo a cada chamada da funcao?

Valeu
==================================================================
Quer conhecer um site Diferente?
FORA DA TELA
==================================================================

#4 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 25/03/2011, 17:19

Você precisa salvar o identificador do timeout e limpá-lo no caso de um mouseout.

var id_timeout = null;
function mouse_over_menu(div_id) 
{ 
        id_timeout = window.setTimeout("open_menu('" + div_id + "')", 1500);
} 
function open_menu(div_id) 
{ 
        id_timeout = null;
        document.getElementById(div_id).className = 'itemOver'; 
 
}
function limpa_timeout(){
        if(id_timeout){
                window.clearTimeout(id_timeout);
                id_timeout = null;
        }
}

<div style="margin:5px;" id="div_dep" onmouseover="mouse_over_menu('div_dep');" onmouseout="limpar_timeout()">


#5 marcosfj1

marcosfj1

    Turista

  • Usuários
  • 53 posts
  • Sexo:Masculino

Posted 25/03/2011, 17:43

Cara primeiro valeu mesmo ai ter criado o codigo pra me ajudar, se nao fosse vc eu tava perdido

Mas dessa vez nao deu certo...eu estava em um DEPARTAMENTO mudei para outro e ele nao contou os 2 segundos novamente

Detalhe: agora no erro da barra de status qdo vejo, esta la escrito OBJETO ESPERADO

Bom o q eu estou pensando é o seguinte, talvez eu tenha q colocar as opcoes de onmouseover e onmouseout em outro lugar, pq a DIV ela esta la o tempo todo, mas nao tenho ctz do q estou falando....Pq assim este codigo todo de CSS e JS eu nao sei nada eu apenas me virei com base em ajudas e tutoriais na net, mas eu to perdido, qto a onde colocar os ids onde chamar as funcoes.

Peço por favor que olhe meu codigo, esta no meu primeiro POST, deve ter algo errado com o CSS talvez....acho isso ate pq o meu menu nao vem fechado no chrome e firefox, ele ja vem com as opcoes de cada departamento abertas.

Eu realmente to perdido cara, a 3 dias to lutando pra ver como fazer isso, mas nao to mais conseguindo ver onde estao os problemas....como eu sei q o PHP ta certo, e vc me passou o JS eu acredito q esteja no CSS o problema

Se for possivel me ajuda?

OU se tiver algum menu pronto desse estilo me passa o codigo, as vezes eu consigo adptar


Valeu

Edição feita por: marcosfj1, 25/03/2011, 17:45.

==================================================================
Quer conhecer um site Diferente?
FORA DA TELA
==================================================================

#6 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 25/03/2011, 17:52

Passe um link. É melhor.

#7 marcosfj1

marcosfj1

    Turista

  • Usuários
  • 53 posts
  • Sexo:Masculino

Posted 25/03/2011, 17:54

Nao esta hospedado cara....entao nem tem como passar

Quer eu te mando um print pra vc ver?

Ou eu zip os arquivos e mando pra vc baixar e testar ai se quiser

Edição feita por: marcosfj1, 25/03/2011, 17:55.

==================================================================
Quer conhecer um site Diferente?
FORA DA TELA
==================================================================

#8 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 25/03/2011, 20:33

Como suas divs são geradas automaticamente, certifique-se de que o id delas é único. Coloque um contador ou coisa assim junto do nome. Depois mostre como está o código. Só a parte que interessa.

#9 marcosfj1

marcosfj1

    Turista

  • Usuários
  • 53 posts
  • Sexo:Masculino

Posted 28/03/2011, 09:00

Bom na verdade a DIV nao é gerada automaticamente, sao as ULs e LIs.....vou colocar meu codigo todo tentando ser o mais claro possivel:

=============================================================================================================
Os erros que atualmente estao acontecendo
1 - Qdo o mouse esta sobre um dos departamentos q fica passando entre eles quero diminuir o tempo da função de abertura das marcas que estao dentro dos departamentos
2 - As marcas referentes a cada departamento já estao vindo abertas no FireFox e Chrome, enquanto que no IE elas veem da forma correta fechadas e somente sao abertas ao posicionar o mouse sobre o departamento
=============================================================================================================

O CODIGO:

CSS:
#menu_categoria ul li { 
	position: relative;   
}

#menu_categoria li ul  {     
	position: relative;    
	left: 25px;    
	display: none; 
	padding:1px; 
}

#menu_categoria ul li a{ 
	display: block; 
	text-decoration: none; 
	color: #777; 
	background: #fff; 
	padding:4px; 	 
}
/* Fix IE. Hide from IE Mac \*/
* html ul li { float: left; }
* html ul li a { height: 1%; }
/* End */

#menu_categoria ul {     
	margin: 0;    
	padding: 0;   
	list-style: none;    
	width: 185px; 
	/*border-bottom: 1px solid #ccc;*/  
	    
}
/*
#menu_categoria li:hover ul, li.over ul { display: block; }
*/
#menu_categoria .itemOver li:hover ul, li.over ul { display: block; }



#menu_categoria .categoria {
	display: block;
	padding: 0 0 0 9px;
	background: url(../../imagem/marca_menu.gif) no-repeat left center;
	text-decoration: none;
	color:#333333;
	font-size:12px;
}
#menu_categoria .ativo .categoria {
	color:#000;
}
#menu_categoria .marca {
	font-size:11px;
	color:#666;
	text-decoration:none;
	padding-left:7px;
	width: 143px; 
}

#menu_categoria a:hover { 
        font-size:12px; 
        color:#666; 
        text-decoration:underline; 
        font-weight: bold;        
}

Este CSS me baseia para fazer ele no site do Maujor ( http://maujor.com/tu...l/ddownmenu.php ), a diferença é que o meu menu é dinamico, ou seja eu pego os Departamentos e Marcas do banco de dados, já no site ele cria manualmente o menu. Alem disso como nao sei mto de CSS talvez eu tenha me perdido entre tantos ULs e LIs e posso esta tratando de forma errada eles no CSS

JAVASCRIPT:

<script type="text/javascript"> 

var id_timeout = null;
function mouse_over_menu(div_id) 
{         
	id_timeout = window.setTimeout("open_menu('" + div_id + "')", 2500);
	
} 
function open_menu(div_id) 
{         
	id_timeout = null;        
	document.getElementById(div_id).className = 'itemOver';  
}

function limpa_timeout()
{        
	if(id_timeout)
		{                
		window.clearTimeout(id_timeout);                
		id_timeout = null;        
		}
}


</script>

Bom este JS foi construido com a ajuda, alias total ajuda do amigo LeoB, o intuito desse JS é fazer um função que controle o tempo de execução da função de abrir os menu qdo o mouse esta sobre o departamento. O lado bom é que deu certo sim, ao colocar o mouse sobre um departamento ele segura pelo tempo que eu determei (no caso 2500 milesegundos), porem apos correr este tempo ao andar de um departamento a outro passando o mouse ele já nao respeita este tempo, mesmo novamente o amigo LeoB tendo tentado me passar um funcao para limpar este timeout e comecar de novo. E aqui nao sei o pq nao respeita a funcao

PHP, geração do MENU:
<body>
<div id="menu_categoria" class="boxed" >
  <h2 class="title">DEPARTAMENTOS</h2>
  <div style="margin:5px;" id="div_dep" onmouseover="mouse_over_menu('div_dep');" onmouseout="limpar_timeout()">

<?

	//
	$sql = "SELECT *
			FROM departamento			
                        ORDER BY nome";
	$req = mysql_query($sql);

	//
	if (mysql_num_rows($req)) {

?>
    <ul class="semMargem" >
      <?
	
	//
	while ($cp = mysql_fetch_array($req)) {
	
		//
		$nome = $cp['nome'];
		if ($cp['id_produto_categoria'] == $_GET['categoria'])
			$nome = '<b>'.$cp['nome'].'</b>';
					
?>
      <li  ><a  class="categoria" href="?l=produto&amp;categoria=<?=$cp['id_produto_categoria'] ?>" title="<?=$cp['nome'] ?>" ><?=$nome ?></a></li>
     
<?

	//
	if ($cp['id_produto_categoria'] OR $_GET['categoria']) {
	
		//
		echo '<ul style="margin-bottom:5px;" >';
		
		
		$sql = "SELECT PM.nome, PM.id_produto_marca
				FROM marca ";
		$req2 = mysql_query($sql);
		
		//
		while ($cp2 = mysql_fetch_array($req2)) {
			
			//
			$nome = $cp2['nome'];
			if ($cp2['id_produto_marca'] == $_GET['marca'])
				$nome = '<b>'.$cp2['nome'].'</b>';

?>
      	<li ><a  class="marca" style="color:#06C;" href="?l=produto&amp;categoria=<?=$cp['id_produto_categoria'] ?>&amp;marca=<?=$cp2['id_produto_marca'] ?>" title="<?=$cp2['nome'] ?>" ><?=$nome ?></a></li>
<? 
	
		}
		
		echo '</ul>';
		
	}

?>
      
      
      <? } ?>
    </ul>
<? } ?>    
  </div>
</div>
</body>

Bom nao há mto segredo nesse codigo eu faço um consulta no banco e trago os departamentos, faço uma consulta novamente e trago as marcas relacionadas aquele departamento (claro eu resumia consulta aqui) isso esta funcionando perfeitamente

==========================================================================================================

Bem é dessa forma que estou tentando fazer acontecer este Menu DropDown com tempo de houver em cada execução....se alguem conseguir me ajudar a resolver os dois problemas ou ao menos um dos dois já estara mto bom....ou entao se alguem tiver algum modelo pronto que saiba me orientar para fazer a adptação para meu caso nao tem problema, nao me importo de comecar de novo

Valeu
==================================================================
Quer conhecer um site Diferente?
FORA DA TELA
==================================================================

#10 dudesign

dudesign

    Turista

  • Usuários
  • 31 posts
  • Sexo:Masculino
  • Localidade:Estado de São Paulo

Posted 28/03/2011, 09:26

E ai Marcos, tranquiloa cara?
Primeiro, pra que ter este tempo? kkkk
E outra você quer fazer mais ou menos assim?
http://www.botecodig...nfona/index.php
Dudesigner

MSN:
eduardobarrosvilla@hotmail.com

#11 marcosfj1

marcosfj1

    Turista

  • Usuários
  • 53 posts
  • Sexo:Masculino

Posted 28/03/2011, 09:29

Cara gostei desse ai tbm

Acho mais interessante do que co mouse houver

Vou mostrar ele pro meu chefe ver se ele gosta

ai se me ensina a fazer este

guenta ai
==================================================================
Quer conhecer um site Diferente?
FORA DA TELA
==================================================================

#12 dudesign

dudesign

    Turista

  • Usuários
  • 31 posts
  • Sexo:Masculino
  • Localidade:Estado de São Paulo

Posted 28/03/2011, 09:31

neste menu é utilizado JQuery, só pra você ter uma idéia para fazer este efeito de abrir e fechar foi utilizado isso:

$(document).ready(function(){
     $("dd").hide();
     $("dt a").click(function(){
        $("dd:visible").slideUp("slow");
        $(this).parent().next().slideDown("slow");
        return false;
     });
});

É bem fácil de aprender...

Edição feita por: dudesign, 28/03/2011, 09:34.

Dudesigner

MSN:
eduardobarrosvilla@hotmail.com

#13 marcosfj1

marcosfj1

    Turista

  • Usuários
  • 53 posts
  • Sexo:Masculino

Posted 28/03/2011, 09:42

hahaha bem mais tranquilo....e mto bom nao a carregamento de pagina, nem ficar sofrendo com posicionamento de mouse vou ver aqui e ja falo

OU cara valeu ai a força

Mas mostrei aqui pro meu chefe, e nos tocamos de algo importante....se eu colocar qualquer uma dessa opcoes eu vou perder um detalhe....pois cada departamento tem sua vitrine, entao se eu colocar isso e jogar o cara direto pra marca daquele departamento o cara nunca vai entrar na vitrine do departamento hahhaa

Quebrei minha cabeça atoa com isso

valeu a força mas largmos mao hehe

Imagina o tanto q to feliz de ter ficado 4 dias pra resolver algo e ele falar q nao quer hehe

abraço
==================================================================
Quer conhecer um site Diferente?
FORA DA TELA
==================================================================

#14 dudesign

dudesign

    Turista

  • Usuários
  • 31 posts
  • Sexo:Masculino
  • Localidade:Estado de São Paulo

Posted 28/03/2011, 09:49

hahaha bem mais tranquilo....e mto bom nao a carregamento de pagina, nem ficar sofrendo com posicionamento de mouse vou ver aqui e ja falo

OU cara valeu ai a força

Mas mostrei aqui pro meu chefe, e nos tocamos de algo importante....se eu colocar qualquer uma dessa opcoes eu vou perder um detalhe....pois cada departamento tem sua vitrine, entao se eu colocar isso e jogar o cara direto pra marca daquele departamento o cara nunca vai entrar na vitrine do departamento hahhaa

Quebrei minha cabeça atoa com isso

valeu a força mas largmos mao hehe

Imagina o tanto q to feliz de ter ficado 4 dias pra resolver algo e ele falar q nao quer hehe

abraço



eu poderia ter um chefe assim... kkkk
pelo menos aqui se eu falar que não dá certo, já nem faz kkkk
bom seria legal você já ter começado com JQuery, se quiser dar uma pesquisada em como foi feito este menu segue o link:
http://www.botecodig...ona-com-jquery/

Valew, se precisar me chame
Abraço
Dudesigner

MSN:
eduardobarrosvilla@hotmail.com

#15 marcosfj1

marcosfj1

    Turista

  • Usuários
  • 53 posts
  • Sexo:Masculino

Posted 28/03/2011, 15:42

Bom cara vou seguir sua dica e tentar com Jquery o problema q nao tenho nocao de como fazer hehe, mas vamos la

Meu CSS e JS:
<style>
 
     ul { width: 300px; }
     ul,li { margin: 0; }
</style>

<script type="text/javascript"> 
$(document).ready(function(){
    $("li").hide();
    $("ul li a").click(function(){
       $("li:visible").slideUp("slow");
       $(this).parent().next().slideDown("slow");
       return false;
    });
}); 

</script>

O CSS pelo q eu vi é apenas para colorir hehe....o lugar q acontece é o Jquery....ai comei com a LI escondido para na mostrar as marcas...e ao clicar no UL LI A que é o departamento, ai ele mostra chamando a funcao....mas xxxxxx tudo q nao aparece mais nada haha

Olha meu PHP...lembrando o menu é dinamico

<div id="menu_categoria" class="boxed">
  <h2 class="title">DEPARTAMENTOS</h2>
  <div style="margin:5px;">
<?

	//
	$sql = "SELECT *
			PEGA OS DEPARTAMENTOS";
	$req = mysql_query($sql);

	//
	if (mysql_num_rows($req)) {

?>
    <ul class="semMargem">
      <?
	
	//
	while ($cp = mysql_fetch_array($req)) {
	
		//
		$nome = $cp['nome'];
		if ($cp['id_produto_categoria'] == $_GET['categoria'])
			$nome = '<b>'.$cp['nome'].'</b>';
					
?>
      <li><a class="categoria" href="?l=produto&amp;categoria=<?=$cp['id_produto_categoria'] ?>" title="<?=$cp['nome'] ?>" ><?=$nome ?></a></li>
     
<?

	//
	if ($cp['id_produto_categoria'] OR $_GET['categoria']) {
	
		//
		echo '<li><ul style="margin-bottom:5px;">';
		
		//
		$sql = "SELECT PEGA AS MARCAS DE ACORDO COM O DEPARTAMENTO ";
		$req2 = mysql_query($sql);
		
		//
		while ($cp2 = mysql_fetch_array($req2)) {
			
			//
			$nome = $cp2['nome'];
			if ($cp2['id_produto_marca'] == $_GET['marca'])
				$nome = '<b>'.$cp2['nome'].'</b>';

?>
      	<li><a class="marca" style="color:#06C;" href="?l=produto&amp;categoria=<?=$_GET['categoria'] ?>&amp;marca=<?=$cp2['id_produto_marca'] ?>" title="<?=$cp2['nome'] ?>" ><?=$nome ?></a></li>
<? 
	
		}
		
		echo '</ul></li>';
		
	}

?>
      
      
      <? } ?>
    </ul>
<? } ?>    
  </div>
</div>

Eu acho q eu to me perdendo nesses ULs e LIs se puder me ajuda ai ver qual seria a ordem certa

valeu
==================================================================
Quer conhecer um site Diferente?
FORA DA TELA
==================================================================




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq