Skip to content

Commit fb418e6

Browse files
author
Ahmed Radwan
committed
Using a new positioning method to avoid the conflict between fixed elements and CSS translate. Now the menu scrolls smoothly on both desk top and mobile as a fixed menu. The overflow issue on mobile is also fixed, user can't scroll right or left on mobile when the menu is active as a normal 'overflow: hidden' behavior. There's now better support for dynamically changing the size of the menu
1 parent 5a05238 commit fb418e6

File tree

2 files changed

+78
-29
lines changed

2 files changed

+78
-29
lines changed

sliiide.js

Lines changed: 77 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@
4545
var bodyResetProp = {
4646
transform: '',
4747
'overflow-x': '',
48-
'overflow-y': '',
4948
transition: '',
49+
position: ''
5050
};
5151

5252
var sliiiderResetProp = {
@@ -66,10 +66,17 @@
6666
position: 'fixed'
6767
};
6868

69+
var bodyChildrenProp = {
70+
transition: 'transform ' + settings.animation_duration + ' ' + settings.animation_curve
71+
};
72+
73+
var htmlProp = {
74+
'overflow-x': 'hidden'
75+
};
76+
6977
var bodySlidePrepare = {
70-
transition: 'transform ' + settings.animation_duration + ' ' + settings.animation_curve,
78+
position: 'relative', // to make overflow-x hidden work with mobile browsers
7179
'overflow-x': 'hidden',
72-
'overflow-y': 'hidden'
7380
};
7481

7582

@@ -112,37 +119,49 @@
112119
var Prop = {
113120

114121
left: {
115-
properties: {top: '0', left: '0', transform: 'translateX(-100%)'},
116-
activateAnimation: {transform: 'translateX(0)'},
117-
deactivateAnimation: {transform: 'translateX(-100%)'},
122+
properties: function() {
123+
var left = '-' + $sliiider.width() + 'px';
124+
return {top: '0', left: left};
125+
},
126+
activateAnimation: {transform: 'translateX(100%)'},
127+
deactivateAnimation: {transform: 'translateX(0)'},
118128
size: function (wHeight, wWidth) {
119129
return {height: wHeight};
120130
}
121131
},
122132

123133
right: {
124-
properties: {top: '0', right: '0', transform: 'translateX(100%)'},
125-
activateAnimation: {transform: 'translateX(0)'},
126-
deactivateAnimation: {transform: 'translateX(100%)'},
134+
properties: function() {
135+
var right = '-' + $sliiider.width() + 'px';
136+
return {top: '0', right: right};
137+
},
138+
activateAnimation: {transform: 'translateX(-100%)'},
139+
deactivateAnimation: {transform: 'translateX(0)'},
127140
size: function (wHeight, wWidth) {
128141
return {height: wHeight};
129142
}
130143

131144
},
132145

133146
top: {
134-
properties: {top: '0', right: '0', left:'0', transform: 'translateY(-100%)'},
135-
activateAnimation: {transform: 'translateY(0)'},
136-
deactivateAnimation: {transform: 'translateY(-100%)'},
147+
properties: function() {
148+
var top = '-' + $sliiider.height() + 'px';
149+
return {left: '0', right:'0', top: top};
150+
},
151+
activateAnimation: {transform: 'translateY(100%)'},
152+
deactivateAnimation: {transform: 'translateY(0)'},
137153
size: function (wHeight, wWidth) {
138154
return {width: wWidth};
139155
}
140156
},
141157

142158
bottom: {
143-
properties: {bottom: '0', right: '0', left:'0', transform: 'translateY(100%)'},
144-
activateAnimation: {transform: 'translateY(0)'},
145-
deactivateAnimation: {transform: 'translateY(100%)'},
159+
properties: function() {
160+
var bottom = '-' + $sliiider.height() + 'px';
161+
return {left:0, right:0 , bottom: bottom};
162+
},
163+
activateAnimation: {transform: 'translateY(-100%)'},
164+
deactivateAnimation: {transform: 'translateY(0)'},
146165
size: function (wHeight, wWidth) {
147166
return {width: wWidth};
148167
}
@@ -172,10 +191,12 @@
172191

173192
var siiize = function() {
174193
var windowSize = {};
194+
var scroll = getScrollBarWidth();
175195
windowSize.height = $(window).height();
176-
windowSize.width = $(window).width();
196+
windowSize.width = $(window).width() + scroll;
177197
newSize = Prop[settings.place].size(windowSize.height, windowSize.width);
178198
$sliiider.css(newSize);
199+
$sliiider.css(prefixCSS(Prop[settings.place].properties()));
179200
setSlideDistance();
180201
};
181202

@@ -196,18 +217,45 @@
196217

197218
var prepare = function() {
198219
$sliiider.css(prefixCSS(prepareProperties));
199-
$sliiider.css(prefixCSS(Prop[settings.place]["properties"]));
220+
$sliiider.css(prefixCSS(Prop[settings.place].properties()));
200221
setSlideDistance();
201222
};
202223

224+
var getScrollBarWidth = function() {
225+
var inner = document.createElement('p');
226+
inner.style.width = "100%";
227+
inner.style.height = "200px";
228+
229+
var outer = document.createElement('div');
230+
outer.style.position = "absolute";
231+
outer.style.top = "0px";
232+
outer.style.left = "0px";
233+
outer.style.visibility = "hidden";
234+
outer.style.width = "200px";
235+
outer.style.height = "150px";
236+
outer.style.overflow = "hidden";
237+
outer.appendChild (inner);
238+
239+
document.body.appendChild (outer);
240+
var w1 = inner.offsetWidth;
241+
outer.style.overflow = 'scroll';
242+
var w2 = inner.offsetWidth;
243+
if (w1 === w2) { w2 = outer.clientWidth; }
244+
245+
document.body.removeChild (outer);
246+
247+
return (w1 - w2);
248+
};
203249

204250
var activate = function() {
205251
siiize(); //sets the size of the slider menu and the distance the body will travel on sliding
206252
$sliiider.css('visibility','visible');
207253
if(settings.body_slide)
208254
{
209255
$body.css(prefixCSS(bodySlidePrepare));
210-
$body.css(prefixCSS(bodySlideProp[settings.place].activateAnimation));
256+
$('html').css(htmlProp);
257+
$body.children().css(prefixCSS(bodyChildrenProp));
258+
$body.children().css(prefixCSS(bodySlideProp[settings.place].activateAnimation));
211259
if((ie !== false) && (ie <= 11))
212260
{
213261
$sliiider.css(prefixCSS(Prop[settings.place].activateAnimation));
@@ -220,14 +268,14 @@
220268
var sliiiderHeight = $sliiider.height();
221269
var sliiiderOffsetTop = $sliiider.offset().top;
222270

223-
if((sliiiderOffsetTop !== scrollTop) && settings.place !== "bottom" && !(ie && ie <= 11 && settings.place ==="top"))
224-
{
225-
$sliiider.css('top', scrollTop);
226-
}
227-
if(((sliiiderOffsetTop !== scrollTop + windowHeight) && (settings.place === "bottom")))
228-
{
229-
$sliiider.css('top', scrollTop + windowHeight - sliiiderHeight).css('bottom','');
230-
}
271+
// if((sliiiderOffsetTop !== scrollTop) && settings.place !== "bottom" && !(ie && ie <= 11 && settings.place ==="top"))
272+
// {
273+
// $sliiider.css('top', scrollTop);
274+
// }
275+
// if(((sliiiderOffsetTop !== scrollTop + windowHeight) && (settings.place === "bottom")))
276+
// {
277+
// $sliiider.css('top', scrollTop + windowHeight - sliiiderHeight).css('bottom','');
278+
// }
231279
}
232280

233281
else {
@@ -244,6 +292,7 @@
244292
var hideSlider = function(e) {
245293
$sliiider.css('visibility','hidden');
246294
$body.css(bodyResetProp);
295+
$('html').css(bodyResetProp);
247296
$body.unbind('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', hideSlider);
248297
prepare();
249298
};
@@ -253,7 +302,7 @@
253302
$body.one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', hideSlider);
254303

255304
if(settings.body_slide) {
256-
$body.css(prefixCSS(bodySlideProp[settings.place].deactivateAnimation));
305+
$body.children().css(prefixCSS(bodySlideProp[settings.place].deactivateAnimation));
257306
if((ie !== false) && (ie <= 11))
258307
{$sliiider.css(prefixCSS(Prop[settings.place].deactivateAnimation));}
259308
}
@@ -272,6 +321,7 @@
272321
siiize();
273322
prepare();
274323
$(window).resize(siiize);
324+
$sliiider.resize(siiize);
275325

276326
var handleToggle = function() {
277327
if (!clicked)
@@ -296,7 +346,6 @@
296346
reset: function(name) {
297347
$body.one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', deleteProp);
298348
deactivate();
299-
// $body.unbind('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', deleteProp);
300349
},
301350
deactivate: function() {deactivate();},
302351
activate: function() {activate();}

sliiide.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)