patternjavascriptMinor
Adjust bootstrap dropdown menu based on page width
Viewed 0 times
adjustdropdownbootstrapmenuwidthpagebased
Problem
I'm using Twitter Bootstrap's navbar. While testing different screen resolutions, I noticed that on lower resolutions, sometimes the submenu would get cut off by the right side of the page.
In the code below, when a dropdown is opened, I'm getting the width of the dropdown menu and dropdown submenu, adding those together and checking them against the width of the window. If the width is greater than the window width, I add the class
In this jsFiddle, you can see what I'm talking about by increasing/decreasing the width of the Results section. When you increase the width of the Results section far enough, the submenu for 'Dropdown 2' will open to the right. When you decrease the size of the Results section enough that the submenu would get cut off, the 'pull-right' class is applied and it extends to the left.
For the most part, this code is doing what it should, but does anyone have any suggestions on how to improve it?
JavaScript
Please let me know if I need to better my explanation or if any other details are needed.
In the code below, when a dropdown is opened, I'm getting the width of the dropdown menu and dropdown submenu, adding those together and checking them against the width of the window. If the width is greater than the window width, I add the class
pull-right so the dropdown menu and/or dropdown submenu will extend to the left and not get cut off by the right side of the page.In this jsFiddle, you can see what I'm talking about by increasing/decreasing the width of the Results section. When you increase the width of the Results section far enough, the submenu for 'Dropdown 2' will open to the right. When you decrease the size of the Results section enough that the submenu would get cut off, the 'pull-right' class is applied and it extends to the left.
For the most part, this code is doing what it should, but does anyone have any suggestions on how to improve it?
JavaScript
$('.dropdown-toggle').click(function() {
var dropdownList = $('.dropdown-menu');
var dropdownOffset = $(this).offset();
var offsetLeft = dropdownOffset.left;
var dropdownWidth = dropdownList.width();
var docWidth = $(window).width();
var subDropdown = $('.dropdown-menu').eq(1);
var subDropdownWidth = subDropdown.width();
var isDropdownVisible = (offsetLeft + dropdownWidth <= docWidth);
var isSubDropdownVisible = (offsetLeft + dropdownWidth + subDropdownWidth <= docWidth);
if (!isDropdownVisible || !isSubDropdownVisible) {
$('.dropdown-menu').addClass('pull-right');
} else {
$('.dropdown-menu').removeClass('pull-right');
}
});Please let me know if I need to better my explanation or if any other details are needed.
Solution
I came across this post searching for a fix to a slightly different problem. I have long entries in a drop-down menu that get cut off on small screen sizes.
I found that if I allow the content in the dropdown to wrap it automatically gets adjusted to the page width:
If you don't want it to wrap if there is enough space, add no-wrap back in with a media query. Because it is so simple I figured I leave this here for others, even though it does not directly apply to the cascading dropdown in your example.
I found that if I allow the content in the dropdown to wrap it automatically gets adjusted to the page width:
.dropdown-menu > li > a {
white-space: normal;
}If you don't want it to wrap if there is enough space, add no-wrap back in with a media query. Because it is so simple I figured I leave this here for others, even though it does not directly apply to the cascading dropdown in your example.
Code Snippets
.dropdown-menu > li > a {
white-space: normal;
}Context
StackExchange Code Review Q#31501, answer score: 5
Revisions (0)
No revisions yet.