I want to disable Pinch and Zoom on Mobile devices.
What configuration should I add to the viewport ?
Link : http://play.mink7.com/n/dawn/
EDIT: Because this keeps getting commented on, we all know that we shouldn't do this. The question was how do I do it, not should I do it.
Add this into your for mobile devices. Then do your widths in percentages and you'll be fine:
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
Add this in for devices that can't use viewport too:
<meta name="HandheldFriendly" content="true" />
this will prevent any zoom action by the user in ios safari and also prevent the "zoom to tabs" feature:
document.addEventListener('gesturestart', function(e) {
e.preventDefault();
// special hack to prevent zoom-to-tabs gesture in safari
document.body.style.zoom = 0.99;
});
document.addEventListener('gesturechange', function(e) {
e.preventDefault();
// special hack to prevent zoom-to-tabs gesture in safari
document.body.style.zoom = 0.99;
});
document.addEventListener('gestureend', function(e) {
e.preventDefault();
// special hack to prevent zoom-to-tabs gesture in safari
document.body.style.zoom = 0.99;
});
jsfiddle: https://jsfiddle.net/vo0aqj4y/11/
This is all I needed:
<meta name="viewport" content="user-scalable=no"/>
To everyone who said that this is a bad idea I want to say it is not always a bad one. Sometimes it is very boring to have to zoom out to see all the content. For example when you type on an input on iOS it zooms to get it in the center of the screen. You have to zoom out after that cause closing the keyboard does not do the work. Also I agree that when you put many I hours in making a great layout and user experience you don't want it to be messed up by a zoom.
But the other argument is valuable as well for people with vision issues. However In my opinion if you have issues with your eyes you are already using the zooming features of the system so there is no need to disturb the content.
I think what you may be after is the CSS property touch-action. You just need a CSS rule like this:
html, body {touch-action: none;}
You will see it has pretty good support (https://caniuse.com/#feat=mdn-css_properties_touch-action_none), including Safari, as well as back to IE10.
Unfortunately, the offered solution doesn't work in Safari 10+, since Apple has decided to ignore user-scalable=no. This thread has more details and some JS hacks: disable viewport zooming iOS 10+ safari?
Found here you can use user-scalable=no:
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
IE has its own way: A css property, -ms-content-zooming. Setting it to none on the body or something should disable it.
Disable pinch to zoom in IE10
http://msdn.microsoft.com/en-us/library/ie/hh771891(v=vs.85).aspx
Disables iOS pinch-zoom
window.addEventListener(
"touchmove",
function (event) {
if (event.scale !== 1) {
event.preventDefault();
event.stopImmediatePropagation();
}
},
{ passive: false }
);
Tested on iOS 15.3 in Safari and Brave.
Try with min-width property. Let me explain you. Assume a device with screen width of 400px (for an instance). When you zoom in, the fonts gets larger and larger. But boxes and divs remains with same width. If you use min-width, you can avoid decreasing your div and box.
Not sure is this could help, but I solved the pinch / zoom problem (I wanted to avoid users to do zooming on my webapp) using angular hammer module:
In my app.component.html I added:
<div id="app" (pinchin)="pinchin();">
and in my app.component.ts:
pinchin() {
//console.log('pinch in');
}
Related
I wonder how to prevent the mobile phone, both iOS and Android to prevent automatic zoom when an input tag of type "color" is selected. I have seen a few solutions online but none of them fit my use case. Here is what I have found so far and my comment on them.
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,user-scalable=0"/>
This prevents all zoom, even manual zoom on my phone, which is not great.
Adding style="font-size:16px; to the input tag.
This doesn't work on my phone.
It looks like you need to set font-size rule when input is focused:
input[type="color"]:focus {
font-size: 16px;
}
I working on simple HTML5 page and using the below code to prevent zoom/scroll.
<meta name="apple-mobile-web-app-capable" content="yes"/>
<meta name="full-screen" content="yes"/>
<meta name="screen-orientation" content="landscape"/>
<meta name="viewport" content="user-scalable=0"/>
The Facebook app review team came back with the below feedback and rejected my app.
Developer Policy 1.2 - Build a Quality Product
We found that your game allows zooming/scrolling outside of gameplay, which detracts from the in-game experience.
Unless your game requires these motions for gameplay, please revise your game before resubmitting for review.
Not sure how to prevent zoom/scroll in HTML5 for iOS devices. Please help.
pras,
As #lukeocom suggests, if you have overflow issues, you can set the overflow property to hidden for overflowing issues. But if you just want to to disable zoom, you can use the following in your HTML:
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
This should work on mobile, but not on desktop. If you want to disable zoom on desktops as well, you can attach an event listener to the Ctrl, + and - keys and then use e.preventDefault() in your JavaScript and do the same for Ctrl + mousewheel events.
Edit: Also, you can use zoom: reset in your CSS if you want to disable the zoom functionality for sure on the desktop. Though, this works only in Chrome.
These are my sources:
meta tag source
JavaScript source
MDN documentation for further reading
Im not sure if this will help you, but it sounds like you may have some overflow content. So you could try adding overflow: hidden to your html tag, or setting max-width/height, or setting absolute or fixed position:
:root,
html {
overflow: hidden;
position: absolute;//or fixed
top:0;
right: 0;
bottom: 0;
left: 0;
max-width: 100vw;
max-height: 100vh;
}
Alternatively, inspect your page content and see if any containers are overflowing, and apply the above to that specific container, or fix the cause of the issue itself. Debug debug debug!
How can we disable "double tap to zoom" on Safari iOS 13+ mobile?
Sometimes it zooms, sometimes not. i feel it may only work on specific HTML-elements.
And i read that "double tap to zoom" should be disabled on iOS 13 by default and only pinch-zoom should work, but that's not the case.
You can add the below meta tag to stop zooming on ios devices.
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1,user-scalable=0"/>
a css fix:
body{
touch-action: manipulation;
}
Hope is helps.
This works in Safari iOS 15
document.ondblclick = function(e) {
e.preventDefault();
}
When you want to disable "double tap to zoom" only on part of your screen (in my case, there was an image gallery that allows going to the next or previous image by tapping on the right or left side of the gallery and double tapping was interrupting the user experience), you can set pointer-events: none on the image elements or their parents, and attach event listeners to the root element of the image gallery.
So, given the following HTML:
<header>…</header>
<ul class="slideshow">
<li><img src="…" /></li>
…
</ul>
<footer></footer>
You’d do the following in CSS:
.slideshow > * {
pointer-events: none;
}
And attach event listener to .slideshow that doesn’t have its pointer events disabled:
document.querySelector('.slideshow').addEventListener('click', (event) {
// detect what part of the screen was clicked and go to the next
// or previous slide
})
I came across this page earlier while trying to stop any touchscreen browser from zooming on either double tap or two finger zoom. It's essential for my website which presents on a tablet allowing the public to click and register satisfaction of events they have attended, so I don't want anybody to fiddle with the layout.
I unsuccessfully tried Helmet, and finally the way I got it to disable all unwanted move/zoom events was to use CSS similar to above:
body {
touch-action: none;
}
Stating 'none' disabled double click zoom, whereas 'manipulation' still opened the door for double click zoom (although it did disable two finger zoom).
I am currently converting my web app to a Cordova app. And I ran into a strange problem:
In Safari or when adding my app to the home screen, all touch inputs (Clicks/Touch) are fast (no delay) but when deploying my app as a Cordova project the inputs (Clicks/Touch) are slow (about 200-300ms delay - no measurement just an estimate based on the well-known touch delay problem).
I am testing on an iPhone Xs running iOS 12.3 and I am building the app with Cordova 9.0.0.
The following viewport settings are used by the app:
<meta content="width=device-width, initial-scale=1, maximum-scale=1, height=device-height, viewport-fit=cover, user-scalable=no" name="viewport" />
Any help would be greatly appreciated.
You need to replace your 'click' events with 'touchstart' events. You can detect if you are in a webview by doing
var click = 'click';
if(typeof(window.ontouchstart) !== 'undefined'){
click = 'touchstart';
}
Then listen to you click event using the click variable. Using jQuery
$('#something').on(click, function(event){...
TESTED AT: Chrome
It happens because there is something that expands body, some elements are bigger than a device width. Sooo the solution will be to show browser that we don't need his help, you can handle it by yourself:
html,
body {
width: 100vw;
overflow-x: hidden;
}
Finally you got something like this:
#media screen and (max-width: 600px) {
html,
body {
width: 100vw;
overflow-x: hidden;
}
}
But the browser still allows you to add scrolling to elements below body.
In other words, if your code doesn't interfere with html or body tag, it shouldn't inflict problems in your app.
I have a site which I am trying to get to sit perfectly in all devices.
I'm using media queries to specify a different layout based on the device. I have an issue with the viewport however.
My viewport tag is:
<meta name="viewport" content="width=device-width">
It sits perfectly on the iPad but on the android tablet, it seemingly ignores the meta viewport tag.
(excuse the crappy photos. iPhone camera! Using colleagues' tablet and didn't want to get into his email to send myself screen grabs)
Here is how it loads - notice how it doesn't show the zoom level correctly. It is zoomed in too far and some of the page is off the right of the screen:
when I pinch zoom out (as far as it will allow) it appears like this - This is how I want it to appear on first load before the user zooms out:
When I rotate the device, it doesn't change the display width at all so it appears at the same zoom level but with white space on either side.
Does anyone have any ideas how I can get it to behave so I can go for the weekend and consume alcohol?
Your page is being cropped because the size of your browser css pixel is larger than the size of your devices physical pixel.
Try placing this JavaScript in your header as a fix for your problem.
<script type="text/javascript">
var scale = 1 / window.devicePixelRatio;
var viewportTag = "<meta id=\"meta1\" name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=" + scale + ", maximum-scale=1, user-scalable=no\"/>";
document.write(viewportTag);
</script>
Different versions of Android handle the viewport differently.
What version of Android are you using?
Here is my lame javascript hack to fix it:
<head>
<!-- other stuff in the head tag goes here -->
<script type="text/javascript">
function viewport_to_device_width() {
// omit viewport meta tag (to force setting initial scale to full extent) by returning false
var b = true;
if (window.navigator.userAgent.match(/android 2.2/i) || window.navigator.userAgent.match(/android 2.3/i) || window.navigator.userAgent.match(/android 4.0/i)) {
b = false;
} else if (window.navigator.userAgent.match(/android/i) && window.navigator.userAgent.match(/Linux armv7l/i) && window.navigator.userAgent.match(/fennec/i)) {
b = false;
}
return b;
}
if (viewport_to_device_width()) {
// omit viewport meta tag for Android 2.2 and Android 4.0 to force setting initial scale to full extent
document.write('<meta name="viewport" content="width=device-width">');
}
</script>
<noscript>
<meta name="viewport" content="width=device-width">
</noscript>
</head>
Have you tried adding initial-scale=1.0 to your content? That should work, but if it doesn't, I might try throwing some more properties in there. You can read more about all the different viewport properties here.
Different browsers are working differently. The only browser that I can make work properly on the Nexus 7 is Dolphin, which has other problems with HTML5 buttons etc.