├── .gitignore
├── CHANGELOG
├── MIT-LICENSE.txt
├── README.md
├── demo
├── common
│ ├── debug.js
│ └── style.css
├── default.html
├── devicepixel.html
├── disabled.html
├── map.html
├── nopagescroll.html
├── orientationlock.html
├── resize.html
└── swipey.html
├── jasyproject.json
└── src
├── viewporter.js
└── viewporter.native.js
/.gitignore:
--------------------------------------------------------------------------------
1 | jasycache*
2 |
--------------------------------------------------------------------------------
/CHANGELOG:
--------------------------------------------------------------------------------
1 | v2.1
2 |
3 | * added new option "forceDetection" to disable internal device profiles for custom resolutions
4 | * new devicepixel.html demo that brings back the native pixel mapping functionality back to Viewporter
5 |
6 | v2.0
7 |
8 | * completely refactored viewport detection
9 | * removed: maxDensity setting (use v1 if needed), now defaulting to device-width
10 | * removed: all debug constants except for viewporter.ACTIVE
11 | * added: Viewporter now needs a wrapper div around the body with the id 'viewporter'
12 | * added: Sites running Viewport now need the following meta viewport tag:
--------------------------------------------------------------------------------
/MIT-LICENSE.txt:
--------------------------------------------------------------------------------
1 | Copyright (c) 2011 Zynga Inc., http://zynga.com/
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining
4 | a copy of this software and associated documentation files (the
5 | "Software"), to deal in the Software without restriction, including
6 | without limitation the rights to use, copy, modify, merge, publish,
7 | distribute, sublicense, and/or sell copies of the Software, and to
8 | permit persons to whom the Software is furnished to do so, subject to
9 | the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be
12 | included in all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Zynga Viewporter v2.1
2 | ================
3 |
4 | Viewporter is a open-source JavaScript project by Zynga to ease mobile viewport management. It specifically simplifies the part of setting up the right screen dimensions and removes the pain from handling the *viewport* meta tag manually.
5 |
6 | What does it do?
7 | ----------------
8 |
9 | When put into the header of a page and when running a mobile device, Viewporter will first try to scroll away any URL or debug bars to maximize the visible window, and then substracts the remaining chrome/UI height from the window, effectively removing ugly scrollbars along the way. It will also track orientationchange, thus, you will always have a maximized viewing experience.
10 |
11 | How to use?
12 | -----------
13 |
14 | In v1, all you had to to was to put Viewporter into the head of the page. There's just a little bit more to do in v2, but it isn't painful:
15 |
16 | # Add the following meta viewport to the
of your page:
17 |
18 | # Wrap your element with the viewporter wrapper div:
19 |
20 |
21 | ...
22 |
23 |
24 |
25 | That's it, really! Feel free to have a look at the demo pages if something doesn't work as expected.
26 |
27 | What's wrong with doing it manually?
28 | ------------------------------------
29 |
30 | You could of course try to set the viewport meta tag yourselves, as suggested in [various](https://developer.mozilla.org/en/mobile/viewport_meta_tag) [places](http://dev.opera.com/articles/view/an-introduction-to-meta-viewport-and-viewport/), usually something like *<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">*. You will quickly recognize two apparent issues:
31 |
32 | * proportional device-height doesn't subtract the chrome height, so the window is always larger than the viewport when set, causing scrollbars even on empty pages
33 | * rotating the device will cause the page to zoom (as device-width isn't inverted on rotation)
34 | * even with a manually fixed viewport, there's a stupid gap at the bottom of the page (when using absolutely positioned elements)
35 |
36 | Advantages of using Viewporter
37 | --------------------
38 |
39 | So what's in it for you? There's a couple of automatic advantages for you when the Viewporter is running. Here's a list:
40 |
41 | * Maximized viewport (scrolling away unneeded UI)
42 | * Easy layouting
43 |
44 | Easy layouting?
45 | ---------------
46 |
47 | Yep. Take a *<div>*, position it absolutely, set its width and height to "50%", left and bottom to 0 and the background to any color. With Viewporter enabled, it will be placed at the bottom left corner of the window, and stretch to the middle of the window. Sounds obvious right? It isn't really, when you want a maximized window.
48 |
49 | API
50 | ---
51 |
52 | Viewporter is almost zero configuration. There's only one constant to check if Viewporter is in fact running, a convienience method to detect landscape orientation and a smart ready callback function. In addition, there's a couple of events you will likely want to use.
53 |
54 | ### Options
55 |
56 | * viewporter.forceDetection (Boolean) - defaults to false, enabling it will cause the Viewporter not to use its profiles for devices (see devicepixel demo)
57 |
58 | * viewporter.preventPageScroll (Boolean) - defaults to false, enabling it will prevent scroll events on the body element. Use this option to cancel iOS overscroll effect, which causes the view to bounce back when scrolling exceeds the bounds. Additionally it will scroll back the pane if the user clicks the page after selecting the address bar on iOS.
59 |
60 | ### Constants
61 |
62 | * viewporter.ACTIVE - _true_ if the Viewporter is enabled and running (smartphones!), false if not (Desktop, non-touch device)
63 | * viewporter.READY - _true_ when the viewportready function has already been fired. Useful if you're lazy loading initializing code
64 |
65 | ### Methods
66 |
67 | * viewporter.isLandscape() - returns wether the device is rotated to landscape or not
68 | * viewporter.ready() - accepts a callback and fires it when the viewporter has been successfully executed
69 | * viewporter.refresh() - refreshes the viewport. This is eg. useful when the browser displays an inline confirmations such as the geolocation alert on Android. **Hint**: Listen for `resize` events and then call this method.
70 |
71 | ### Events
72 |
73 | All events fire as native events on the window object.
74 |
75 | * viewportready - fires as soon as the Viewporter has been executed for the first time
76 | * viewportchange - fires when the viewport changes, i.e. the device is rotated, and after Viewporter has been executed again
--------------------------------------------------------------------------------
/demo/common/debug.js:
--------------------------------------------------------------------------------
1 | var log = function() {
2 | $("#viewporter").append("