slideout icon indicating copy to clipboard operation
slideout copied to clipboard

Only allow opening menu by swiping from far left

Open garygreen opened this issue 9 years ago • 15 comments

Is this currently possible? It would be cool to be able to have an option to set the 'touch region' on the far left hand side so the menu will only be allowed to open if sliding within e.g. <= 20% of the far left hand side, similar to how Android apps work.

region

garygreen avatar Apr 14 '15 12:04 garygreen

good idea. would increase usability with issue #58

nicmare avatar Apr 16 '15 08:04 nicmare

PR #10 is a pretty nice and simple fix for this. I've forked slideout and it works perfectly with the grabWidth: 40 option

garygreen avatar Apr 16 '15 09:04 garygreen

nice. but how is about browser history? sometimes it jumps back to previous page instead of opening the menu. this effect increases when the grab area is smaller.

nicmare avatar Apr 16 '15 09:04 nicmare

Works fine for me, i use a grab width of 40

garygreen avatar Apr 16 '15 09:04 garygreen

hello everybody, grabWidth is a great thing but i have a question, how can i make it work when slideout is on the right side, not the left?

stripearmy avatar Apr 25 '15 16:04 stripearmy

I do think grabWidth is important as when user sliding vertically especially on larger phone, the slide trajectory tend to skew to the right (for right-handed), which resulted in unintentional opening of the menu.

I'm using codes from PR#10 for now. It really complete the already marvellous library.

vinlim avatar Dec 03 '15 09:12 vinlim

Is this merged already?

marysgonzalez avatar May 18 '16 15:05 marysgonzalez

Until its merged and minified, here is a minified version iwht Only grabWidth added (no closeOnClick):

  // Slideout .min.js v0.1.12 -- https://mango.github.io/slideout/
  // w/ grabWidth
  !function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.Slideout=t()}}(function(){var t,e,n;return function i(t,e,n){function o(r,a){if(!e[r]){if(!t[r]){var u=typeof require=="function"&&require;if(!a&&u)return u(r,!0);if(s)return s(r,!0);var l=new Error("Cannot find module '"+r+"'");throw l.code="MODULE_NOT_FOUND",l}var f=e[r]={exports:{}};t[r][0].call(f.exports,function(e){var n=t[r][1][e];return o(n?n:e)},f,f.exports,i,t,e,n)}return e[r].exports}var s=typeof require=="function"&&require;for(var r=0;r<n.length;r++)o(n[r]);return o}({1:[function(t,e,n){"use strict";var i=t("decouple");var o=t("emitter");var s;var r=false;var a=window.document;var u=a.documentElement;var l=window.navigator.msPointerEnabled;var f={start:l?"MSPointerDown":"touchstart",move:l?"MSPointerMove":"touchmove",end:l?"MSPointerUp":"touchend"};var h=function v(){var t=/^(Webkit|Khtml|Moz|ms|O)(?=[A-Z])/;var e=a.getElementsByTagName("script")[0].style;for(var n in e){if(t.test(n)){return"-"+n.match(t)[0].toLowerCase()+"-"}}if("WebkitOpacity"in e){return"-webkit-"}if("KhtmlOpacity"in e){return"-khtml-"}return""}();function c(t,e){for(var n in e){if(e[n]){t[n]=e[n]}}return t}function p(t,e){t.prototype=c(t.prototype||{},e.prototype)}function d(t){t=t||{};this._startOffsetX=0;this._currentOffsetX=0;this._opening=false;this._moved=false;this._opened=false;this._preventOpen=false;this._touch=t.touch===undefined?true:t.touch&&true;this.panel=t.panel;this.menu=t.menu;if(this.panel.className.search("slideout-panel")===-1){this.panel.className+=" slideout-panel"}if(this.menu.className.search("slideout-menu")===-1){this.menu.className+=" slideout-menu"}this._fx=t.fx||"ease";this._duration=parseInt(t.duration,10)||300;this._tolerance=parseInt(t.tolerance,10)||70;this._padding=this._translateTo=parseInt(t.padding,10)||256;this._grabWidth = parseInt(t.grabWidth, 10) || 0;this._orientation=t.side==="right"?-1:1;this._translateTo*=this._orientation;if(this._touch){this._initTouchEvents()}}p(d,o);d.prototype.open=function(){var t=this;this.emit("beforeopen");if(u.className.search("slideout-open")===-1){u.className+=" slideout-open"}this._setTransition();this._translateXTo(this._translateTo);this._opened=true;setTimeout(function(){t.panel.style.transition=t.panel.style["-webkit-transition"]="";t.emit("open")},this._duration+50);return this};d.prototype.close=function(){var t=this;if(!this.isOpen()&&!this._opening){return this}this.emit("beforeclose");this._setTransition();this._translateXTo(0);this._opened=false;setTimeout(function(){u.className=u.className.replace(/ slideout-open/,"");t.panel.style.transition=t.panel.style["-webkit-transition"]=t.panel.style[h+"transform"]=t.panel.style.transform="";t.emit("close")},this._duration+50);return this};d.prototype.toggle=function(){return this.isOpen()?this.close():this.open()};d.prototype.isOpen=function(){return this._opened};d.prototype._translateXTo=function(t){this._currentOffsetX=t;this.panel.style[h+"transform"]=this.panel.style.transform="translateX("+t+"px)";return this};d.prototype._setTransition=function(){this.panel.style[h+"transition"]=this.panel.style.transition=h+"transform "+this._duration+"ms "+this._fx;return this};d.prototype._initTouchEvents=function(){var t=this;this._onScrollFn=i(a,"scroll",function(){if(!t._moved){clearTimeout(s);r=true;s=setTimeout(function(){r=false},250)}});this._preventMove=function(e){if(t._moved){e.preventDefault()}};a.addEventListener(f.move,this._preventMove);this._resetTouchFn=function(e){if(typeof e.touches==="undefined"){return}t._moved=false;t._opening=false;var offset=e.touches[0].pageX;t._startOffsetX=offset;t._preventOpen=(!t.isOpen()&&(t.menu.clientWidth!==0||(t._grabWidth&&offset>t._grabWidth)));};this.panel.addEventListener(f.start,this._resetTouchFn);this._onTouchCancelFn=function(){t._moved=false;t._opening=false};this.panel.addEventListener("touchcancel",this._onTouchCancelFn);this._onTouchEndFn=function(){if(t._moved){t._opening&&Math.abs(t._currentOffsetX)>t._tolerance?t.open():t.close()}t._moved=false};this.panel.addEventListener(f.end,this._onTouchEndFn);this._onTouchMoveFn=function(e){if(r||t._preventOpen||typeof e.touches==="undefined"){return}var n=e.touches[0].clientX-t._startOffsetX;var i=t._currentOffsetX=n;if(Math.abs(i)>t._padding){return}if(Math.abs(n)>20){t._opening=true;var o=n*t._orientation;if(t._opened&&o>0||!t._opened&&o<0){return}if(o<=0){i=n+t._padding*t._orientation;t._opening=false}if(!t._moved&&u.className.search("slideout-open")===-1){u.className+=" slideout-open"}t.panel.style[h+"transform"]=t.panel.style.transform="translateX("+i+"px)";t.emit("translate",i);t._moved=true}};this.panel.addEventListener(f.move,this._onTouchMoveFn);return this};d.prototype.enableTouch=function(){this._touch=true;return this};d.prototype.disableTouch=function(){this._touch=false;return this};d.prototype.destroy=function(){this.close();a.removeEventListener(f.move,this._preventMove);this.panel.removeEventListener(f.start,this._resetTouchFn);this.panel.removeEventListener("touchcancel",this._onTouchCancelFn);this.panel.removeEventListener(f.end,this._onTouchEndFn);this.panel.removeEventListener(f.move,this._onTouchMoveFn);a.removeEventListener("scroll",this._onScrollFn);this.open=this.close=function(){};return this};e.exports=d},{decouple:2,emitter:3}],2:[function(t,e,n){"use strict";var i=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}();function o(t,e,n){var o,s=false;function r(t){o=t;a()}function a(){if(!s){i(u);s=true}}function u(){n.call(t,o);s=false}t.addEventListener(e,r,false);return r}e.exports=o},{}],3:[function(t,e,n){"use strict";var i=function(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}};n.__esModule=true;var o=function(){function t(){i(this,t)}t.prototype.on=function e(t,n){this._eventCollection=this._eventCollection||{};this._eventCollection[t]=this._eventCollection[t]||[];this._eventCollection[t].push(n);return this};t.prototype.once=function n(t,e){var n=this;function i(){n.off(t,i);e.apply(this,arguments)}i.listener=e;this.on(t,i);return this};t.prototype.off=function o(t,e){var n=undefined;if(!this._eventCollection||!(n=this._eventCollection[t])){return this}n.forEach(function(t,i){if(t===e||t.listener===e){n.splice(i,1)}});if(n.length===0){delete this._eventCollection[t]}return this};t.prototype.emit=function s(t){var e=this;for(var n=arguments.length,i=Array(n>1?n-1:0),o=1;o<n;o++){i[o-1]=arguments[o]}var s=undefined;if(!this._eventCollection||!(s=this._eventCollection[t])){return this}s=s.slice(0);s.forEach(function(t){return t.apply(e,i)});return this};return t}();n["default"]=o;e.exports=n["default"]},{}]},{},[1])(1)});

andrebu avatar Jun 05 '16 19:06 andrebu

+1

jamalx31 avatar Sep 28 '16 08:09 jamalx31

Hi guys, I am using the @iamandrebulatov fork (great by the way), but the disableTouch() is not working. Do you guys know why?

Thanks in advance

lcfm avatar Oct 31 '16 15:10 lcfm

The grabWidth option only works for left side menu...

BlueXiphoid avatar Feb 10 '17 07:02 BlueXiphoid

With mobile browsers these days using a far-left/far-right swipe approach for browser history navigation (back/forward), we almost need the complete opposite feature - ability to have like a "grab margin". In other words, if you begin swiping from within 40px from the left of the screen, it won't open the menu. But if you swipe 40px out from the left of the screen, it would open the menu.

(Swap 'non-swipeable' and 'swipeable' regions in the example image above)

samwalshnz avatar Nov 02 '17 20:11 samwalshnz

@samwalshnz do you mean for mobiles where there is basically no bezel, so you don't accidentally open the menu or something?

garygreen avatar Nov 02 '17 21:11 garygreen

@garygreen Yeah - but even phones with bezel have the same problem. For example, in Chrome (and Safari I believe) on an iPhone, if you swipe right from the left edge of the screen, it goes back a page

samwalshnz avatar Nov 02 '17 22:11 samwalshnz

+1 this feature would be really great I would be needing it too. Using a work around for the moment

bUxEE avatar Mar 31 '18 20:03 bUxEE