I am trying to create an effect where the menu is hidden and only shows up when the user begins to scroll. I can’t seem to find out why my code isn’t working. I have the following jQuery code:
<script src="http://code.jquery.com/jquery-1.10.2.js"> jQuery(document).scroll(function () { var y = $(this).scrollTop(); if (y > 100) { $('#top').fadeIn(); } else { $('#top').fadeOut(); } }); </script>
I also have this code which I added into a custom plugin. Please note than I’m using a child theme. I created a folder /js and added the following file menu-hide-scroll.js.
add_action( 'wp_enqueue_scripts', 'show_menu_scroll_script' ); function show_menu_scroll_script() { wp_register_script( 'child-theme-script', get_stylesheet_directory_uri() . '/js/menu-hide-scroll.js', array('jquery') ); wp_enqueue_script('child-theme-script'); }
CSS
#top {display:none;}
I am a beginner and at this point I’m stuck hopefully someone would help me out.
Advertisement
Answer
There’s a couple issues and minor points I’d like to make.
First of all, you’ve code a weird “jQuery code” in your question. Does your .js
file contain <script src="http://code.jquery.com/jquery-1.10.2.js"> /* … */ </script>
? If so, that’s illegal, you should not have the <script>
tags inside your JavaScript files.
Second, you should be probably be making use of the document.ready
check before you start running any JS, you can pass the $
reference variable in that function argument. Then from there, you can check the $(window)
‘s scroll status (and use > 0
instead of > 100
if you want to make sure it shows as they start scrolling. Something like this:
jQuery(document).ready(function($){ $(window).on('scroll', function(){ var y = $(window).scrollTop(); if( y > 0 ){ $('#top').fadeIn(); } else { $('#top').fadeOut(); } }); });
You didn’t post your CSS, but make sure the #top
div is visible (like position: fixed; top: 0;
or something, making sure it’s visible in the window, otherwise it will “show” but not be visible since it’s off screen).
Third, pedantic, you’ll probably want to make your file names a bit more arbitrary and related to the handle. Right now you call it child-theme-script
but the file name would indicate the only thing it does is hide the menu related to scrolling. Future you will appreciate a bit more concise naming convention one way or the other!
Fourth, you don’t need to use wp_register_script()
unless you’re doing fancy work like dequeueing/enqueueing the script only if certain shortcodes are on the page, other parameters are set/not set, etc. wp_enqueue_script()
handles the script registration for you (note, I changed the file name and function name in this snippet):
add_action( 'wp_enqueue_scripts', 'load_child_theme_scripts' ); function load_child_theme_scripts() { wp_enqueue_script( 'child-theme-script', get_stylesheet_directory_uri() . '/js/child-theme-script.js', array('jquery') ); }
Here’s a quick codepen example for you on the JavaScript side: https://codepen.io/xhynk/pen/XWbmbgm