Created
November 17, 2016 10:05
-
-
Save markusvonplunkett/b42cb5f968a9f2f1ed19c5a3a682bfd3 to your computer and use it in GitHub Desktop.
Foundation Media Query JS Detection
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Docs on how to query the data: http://foundation.zurb.com/sites/docs/media-queries.html | |
if (SOZO.MediaQuery.atLeast('medium')) { | |
// DO X AND Y | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// !function($, Foundation) { | |
// just checking if jQuery is loaded | |
!function($) { | |
// Default set of media queries | |
var defaultQueries = { | |
'default' : 'only screen', | |
landscape : 'only screen and (orientation: landscape)', | |
portrait : 'only screen and (orientation: portrait)', | |
retina : 'only screen and (-webkit-min-device-pixel-ratio: 2),' + | |
'only screen and (min--moz-device-pixel-ratio: 2),' + | |
'only screen and (-o-min-device-pixel-ratio: 2/1),' + | |
'only screen and (min-device-pixel-ratio: 2),' + | |
'only screen and (min-resolution: 192dpi),' + | |
'only screen and (min-resolution: 2dppx)' | |
}; | |
var MediaQuery = { | |
queries: [], | |
current: '', | |
/** | |
* Checks if the screen is at least as wide as a breakpoint. | |
* @function | |
* @param {String} size - Name of the breakpoint to check. | |
* @returns {Boolean} `true` if the breakpoint matches, `false` if it's smaller. | |
*/ | |
atLeast: function(size) { | |
var query = this.get(size); | |
if (query) { | |
return window.matchMedia(query).matches; | |
} | |
return false; | |
}, | |
/** | |
* Gets the media query of a breakpoint. | |
* @function | |
* @param {String} size - Name of the breakpoint to get. | |
* @returns {String|null} - The media query of the breakpoint, or `null` if the breakpoint doesn't exist. | |
*/ | |
get: function(size) { | |
for (var i in this.queries) { | |
var query = this.queries[i]; | |
if (size === query.name) return query.value; | |
} | |
return null; | |
}, | |
/** | |
* Initializes the media query helper, by extracting the breakpoint list from the CSS and activating the breakpoint watcher. | |
* @function | |
* @private | |
*/ | |
_init: function() { | |
var self = this; | |
var extractedStyles = $('.foundation-mq').css('font-family'); | |
var namedQueries; | |
namedQueries = parseStyleToObject(extractedStyles); | |
for (var key in namedQueries) { | |
self.queries.push({ | |
name: key, | |
value: 'only screen and (min-width: ' + namedQueries[key] + ')' | |
}); | |
} | |
this.current = this._getCurrentSize(); | |
this._watcher(); | |
// Extend default queries | |
// namedQueries = $.extend(defaultQueries, namedQueries); | |
}, | |
/** | |
* Gets the current breakpoint name by testing every breakpoint and returning the last one to match (the biggest one). | |
* @function | |
* @private | |
* @returns {String} Name of the current breakpoint. | |
*/ | |
_getCurrentSize: function() { | |
var matched; | |
for (var i in this.queries) { | |
var query = this.queries[i]; | |
if (window.matchMedia(query.value).matches) { | |
matched = query; | |
} | |
} | |
if(typeof matched === 'object') { | |
return matched.name; | |
} else { | |
return matched; | |
} | |
}, | |
/** | |
* Activates the breakpoint watcher, which fires an event on the window whenever the breakpoint changes. | |
* @function | |
* @private | |
*/ | |
_watcher: function() { | |
var _this = this; | |
$(window).on('resize.zf.mediaquery', function() { | |
var newSize = _this._getCurrentSize(); | |
if (newSize !== _this.current) { | |
// Broadcast the media query change on the window | |
$(window).trigger('changed.zf.mediaquery', [newSize, _this.current]); | |
// Change the current media query | |
_this.current = newSize; | |
} | |
}); | |
} | |
}; | |
SOZO.MediaQuery = MediaQuery; | |
// this has been changed from 'Foundation' | |
// matchMedia() polyfill - Test a CSS media type/query in JS. | |
// Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license | |
window.matchMedia || (window.matchMedia = function() { | |
'use strict'; | |
// For browsers that support matchMedium api such as IE 9 and webkit | |
var styleMedia = (window.styleMedia || window.media); | |
// For those that don't support matchMedium | |
if (!styleMedia) { | |
var style = document.createElement('style'), | |
script = document.getElementsByTagName('script')[0], | |
info = null; | |
style.type = 'text/css'; | |
style.id = 'matchmediajs-test'; | |
script.parentNode.insertBefore(style, script); | |
// 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers | |
info = ('getComputedStyle' in window) && window.getComputedStyle(style, null) || style.currentStyle; | |
styleMedia = { | |
matchMedium: function(media) { | |
var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }'; | |
// 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers | |
if (style.styleSheet) { | |
style.styleSheet.cssText = text; | |
} else { | |
style.textContent = text; | |
} | |
// Test if media query is true or false | |
return info.width === '1px'; | |
} | |
}; | |
} | |
return function(media) { | |
return { | |
matches: styleMedia.matchMedium(media || 'all'), | |
media: media || 'all' | |
}; | |
}; | |
}()); | |
// Thank you: https://github.com/sindresorhus/query-string | |
function parseStyleToObject(str) { | |
var styleObject = {}; | |
if (typeof str !== 'string') { | |
return styleObject; | |
} | |
str = str.trim().slice(1, -1); // browsers re-quote string style values | |
if (!str) { | |
return styleObject; | |
} | |
styleObject = str.split('&').reduce(function(ret, param) { | |
var parts = param.replace(/\+/g, ' ').split('='); | |
var key = parts[0]; | |
var val = parts[1]; | |
key = decodeURIComponent(key); | |
// missing `=` should be `null`: | |
// http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters | |
val = val === undefined ? null : decodeURIComponent(val); | |
if (!ret.hasOwnProperty(key)) { | |
ret[key] = val; | |
} else if (Array.isArray(ret[key])) { | |
ret[key].push(val); | |
} else { | |
ret[key] = [ret[key], val]; | |
} | |
return ret; | |
}, {}); | |
return styleObject; | |
} | |
// }(jQuery, Foundation); | |
}(jQuery); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$meta = $('meta.foundation-mq') | |
//if it doesnt exists then output | |
if(!$meta.length){ | |
$('<meta class="foundation-mq">').appendTo(document.head); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// These styles are applied to a <meta> tag, which is read by the Foundation JavaScript | |
.foundation-mq { | |
font-family: '#{-zf-bp-serialize($breakpoints)}'; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// Convers the breakpoints map to a URL-encoded string, like this: `key1=value1&key2=value2`. The value is then dropped into the CSS for a special `<meta>` tag, which is read by the Foundation JavaScript. This is how we transfer values from Sass to JavaScript, so they can be defined in one place. | |
/// @access private | |
/// | |
/// @param {Map} $map - Map to convert. | |
/// | |
/// @returns {String} A string containing the map's contents. | |
@function -zf-bp-serialize($map) { | |
$str: ''; | |
@each $key, $value in $map { | |
$str: $str + $key + '=' + -zf-bp-to-em($value) + '&'; | |
} | |
$str: str-slice($str, 1, -2); | |
@return $str; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment