Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

problema con bootstrap collapse y scroll

3 de mayo de 2017

Hola, estoy tratando de implementar un menu bootstrap con la clase collapse, pero no consigo que me funcione. Al cargar la pagina desde el movil el menu se despliega pero al clicar en el enlace el menu permanece abierto, en lugar de cerrarse automaticamente.

Tampoco consigo que funcione el scroll, la pagina se desplaza instantaneamente.

La pagina en cuestion se puede ver aqui (en construccion): www.f1losdominguitos.com/stg Solo tiene operativo el enlace de login del menu, el cual deberia desplazarnos suavemente hasta la zona de inicio de sesion.

Lo curioso es que en una plantilla que me he descargado si que funciona correctamente, y a pesar de que intento implementarla igual, no me funciona. Dicha plantilla que funciona esta aqui: www.f1losdominguitos.com/promo.

Agradeceria cualquier ayuda, seguro que es una tonteria pero me esta desquiciando un poquito :)

Gracias y saludos.


Respuestas

#1

Buenos días.

Debes incluir el javascript "js/creative.js" que es el encargado de realizar justamente eso que pides. Puedes incluirlo justo debajo de bootstrap.js.

Para realizar el scroll debes ponerle la clase page-scroll a los enlaces dentro del menú, así el script sabrá que lo que quieres hacer es scroll y te llevará a la página indicada.

// jQuery for page scrolling feature - requires jQuery Easing plugin
    $('a.page-scroll').bind('click', function(event) {
        var $anchor = $(this);
        $('html, body').stop().animate({
            scrollTop: ($($anchor.attr('href')).offset().top - 50)
        }, 1250, 'easeInOutExpo');
        event.preventDefault();
    });

Y con este código, se cierra el menú una vez pulsado el enlace

// Closes the Responsive Menu on Menu Item Click
    $('.navbar-collapse ul li a').click(function() {
        $('.navbar-toggle:visible').click();
    });

Un saludo.

@SoutlinK

3 mayo 2017, 8:14
#2

Muchas gracias por tu respuesta, pero me sigue sin funcionar. He incluido en el head el script que me indicas, junto con las demas dependencias:

<script src="js/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/creative.js"></script>
<script src="js/jquery.easing.min.js"></script>
<script src="js/jquery.fittext.js"></script>
<script src="js/wow.min.js"></script>

El fichero esta ubicado en su lugar, pero aun asi he probado tambien a incluir el codigo javascript tal cual me lo has pegado, pero no va.

y este es el codigo del menu:

<nav class="navbar navbar-default navbar-fixed-top" style="margin:0;" role="navigation">
 <div class="container-fluid">  
  <div class="navbar-header">
   <!--<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">-->
   <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
    <span class="sr-only">Desplegar navegación</span>
    <span class="icon-bar"></span>
    <span class="icon-bar"></span>
    <span class="icon-bar"></span>
   </button>
   <span class="navbar-brand"><b>F1 LOS DOMINGUITOS</b></span>
  </div>
 
 <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
   <ul class="nav navbar-nav navbar-left">
     <li><a class="page-scroll" href="#">Inicio</a></li>
     <li><a class="page-scroll" href="#">Foro</a></li>
     <li><a class="page-scroll" href="#">Escuderías</a></li>
     <li><a class="page-scroll" href="#">Clasificación</a></li>
     <li>&nbsp;</li>
     <li><a class="page-scroll" href="#dcha">Login</a></li>
  </ul>
 </div>
</div>  
</nav>

@doberk

3 mayo 2017, 9:22
#3

Buenos días. El problema es que tienes un error en la consola de javascript

Uncaught TypeError: $(...).fitText is not a function

Esto te está diciendo que no encuentra la funcion fitText. Para solucionarlo o bien incluyes la libreria jquery.fitText o bien comentas las siguientes lineas en el creative.js

// Fit Text Plugin for Main Header
    $("h1").fitText(
        1.2, {
            minFontSize: '35px',
            maxFontSize: '65px'
        }
    );

Un saludo

@SoutlinK

3 mayo 2017, 9:46
#4

Muchas gracias por tu tiempo SoutlinK, pero sigue fallando. He comentado las lineas que me indicas pero no hay diferencia en el comportamiento.

Edito:

Finalmente he podido resolverlo añadiendo esta funcion:

$(document).on('click','.navbar-collapse.in',function(e) {
        if( $(e.target).is('a') && $(e.target).attr('class') != 'dropdown-toggle' ) {
                $(this).collapse('hide');
        }
    });

La funcion la he introducido en el creative.js

Aun me quedaria resolver el tema del scroll, que por algun motivo tampoco funciona.

@doberk

3 mayo 2017, 11:31
#5

Hola @doberk

Sigues teniendo un error de javascript

Uncaught ReferenceError: WOW is not defined

No tienes incluida la librería WOW. Esta librería se usa para lanzar efectos de css a medida que se hace scroll.

O bien incluyes la librería o comentas la linea

// Initialize WOW.js Scrolling Animations
    new WOW().init();

@SoutlinK

3 mayo 2017, 15:28
#6

He procedido tambien a comentarla, porque he visto que es comercial. Pero de todas maneras no ocurre nada.

Me sorprende que la ausencia de estas librerias pueda ser la que provoque el fallo, porque como te decia al principio del hilo, esta otra pagina utiliza las mismas librerias y las mismas clases, y sin embargo funciona perfectamente sin añadir javascript adicional ni comentar nada del codigo:

http://www.f1losdominguitos.com/promo

De nuevo gracias por tu tiempo.

@doberk

3 mayo 2017, 15:43
#7

Tu no tenias las librerías añadidas (al menos al momento de ver el código). Ahora las tienes añadidas pero en mal orden. Estas incluyendo primero el creative.js y luego las librerías necesarias. Cuando se carga el creative.js llama a las librerías, pero como estas no están cargadas da error.

Fijate en la web original

<!-- http://www.f1losdominguitos.com/promo/ -->
<!-- jQuery -->
    <!--<script src="js/jquery.js"></script>-->
 
    <!-- Bootstrap Core JavaScript -->
    <script src="js/bootstrap.min.js"></script>
 
    <!-- Plugin JavaScript -->
    <script src="js/jquery.easing.min.js"></script>
    <script src="js/jquery.fittext.js"></script>
    <script src="js/wow.min.js"></script>
 
    <!-- Custom Theme JavaScript -->
    <script src="js/creative.js"></script>
 
</body>
 
</html>

Y tu no las añades en tu web pero no en orden:

<!-- Javascript -->
    <script src="js/jquery.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
    <script src="js/creative.js"></script>
    <script src="js/jquery.easing.min.js"></script>
    <script src="js/jquery.fittext.js"></script>
    <script src="js/wow.min.js"></script

Además te recomiendo que lleves la carga de javascript a la parte baja de la web, como hace la plantilla orignal, justo antes del

Un saludo.

@SoutlinK

3 mayo 2017, 16:23
#8

Disculpa mi ignorancia en javascript, no he tenido en cuenta que existen dependencias entre los ficheros. Los he ido cargando en cualquier orden como si fueran CSS.

Los he colocado en el orden correcto pero sigo sin ver resultados, no se realiza el scroll suave.

Respecto a poner el javascript al final del documento, he leido que es lo mas recomendable para maximizar los tiempos de carga de la pagina, pero tambien que algun elemento podria no funcionar 100% si se dibuja en pantalla antes de cargar el javascript correspondiente, y que colocando los scripts en el head se evita cualquier posible error. Quiza cuando la pagina este acabada y vea que todo funciona correctamente los baje al final de la pagina.

@doberk

3 mayo 2017, 22:02
#9

Hola.

Ya casi lo tienes!

Si te fijas en tu menú tienes el siguiente código

<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                    <ul class="nav navbar-nav navbar-left">
                        <li>
                            <a class="page-scroll" href="#">Inicio</a>
                        </li>
                        <li>
                            <a class="page-scroll" href="#">Foro</a>
                        </li>
                        <li>
                            <a class="page-scroll" href="#">Escuderías</a>
                        </li>
                        <li>
                            <a class="page-scroll" href="#">Clasificación</a>
                        </li>
                        <li>&nbsp;</li>
                        <li>
                            <a class="page-scroll" href="#login">Login</a>
                        </li>
                    </ul>
                </div>

Como ves, tu enlace a login hace referencia a "#login". Pero en tu web no tienes ningún elemento que tenga id="login"

Tu lo estás llamando "drcha"

Simplemente cambiando el id del div por "login" ya debería tener tu código funcionando.

Un saludo.

@SoutlinK

4 mayo 2017, 8:16
#10

Bueno, eso es porque estuve haciendo unas pruebas y al final lo deje con prisa y no reverti bien todos los cambios. Ese fallo evitaria que al pinchar el enlace la pagina se desplara. Y si que se desplaza (ya he corregido el error), pero lo hace de golpe, sin transicion suave.

Gracias por tu ayuda, me esta siendo muy util :)

@doberk

5 mayo 2017, 1:02
#11

Hola, eso es por que estás cargando los javascripts arriba, y cuando se ejecuta

// jQuery for page scrolling feature - requires jQuery Easing plugin
    $('a.page-scroll').bind('click', function(event) {
        var $anchor = $(this);
        $('html, body').stop().animate({
            scrollTop: ($($anchor.attr('href')).offset().top - 50)
        }, 1250, 'easeInOutExpo');
        event.preventDefault();
    })

todavía no hay ningún enlace con clase page-scroll en la web (por que aun no se ha cargado)

Optiones:

  1. Llevar los javascript a la parte inferior de la página, justo antes del , así te aseguras que cuando se ejecuten los scripts ya tienes contenido en la web. Además mejora la carga de la página.
  2. Meter las funciones del creative.js dentro de un jQuery(function() {});. Esa función es un shorchut de jQuery(document).ready(function() { });, una función que hace que el jQuery ejecute todo lo que lleve dentro una vez esté preparado el documento (o el selector que le pases)

Un saludo

@SoutlinK

5 mayo 2017, 7:26
#12

Pues efectivamente, Soutlink, tienes razon. Al pasar los javascript a la parte inferior ya funciona perfectamente.

Muchas gracias por tu ayuda, me ha servido de mucho y he aprendido un monton. Seguiré construyendo el sitio y aprendiendo el manejo de javascript :)

@doberk

5 mayo 2017, 9:14