/** * jQuery Picture * http://jquerypicture.com * http://github.com/Abban/jQuery-Picture * * May 2012 * * @version 0.9 * @author Abban Dunne http://abandon.ie * @license MIT * * jQuery Picture is a plugin to add support for responsive images to your layouts. * It supports both figure elements with some custom data attributes and the new * proposed picture format. This plugin will be made redundant when the format is * approved and implemented by browsers. Lets hope that happens soon. In the meantime * this plugin will be kept up to date with latest developments. * */ (function($){ $.fn.picture = function(args){ this.each(function(){ var breakpoints = new Array(); var windowWidth, currentMedia, element, timeoutOffset; // Save off the element so it can be easily used inside a function element = $(this); // Initialise the images getCurrentMedia(true); // Only call the image resize function 200ms after window stops being resized timeoutOffset = false; $(window).resize(function(){ if(timeoutOffset !== false) clearTimeout(timeoutOffset); timeoutOffset = setTimeout(getCurrentMedia, 200); }); /** * getCurrentMedia * * Checks the window width off the media query types and selects the current one. * Calls the setPicture or setFigure function to set the image. * */ function getCurrentMedia(init){ if(init){ if(element.get(0).tagName.toLowerCase() == 'figure'){ var mediaObj = element.data(); $.each(mediaObj, function(media){ var num; num = media.replace(/[^\d.]/g, ''); if(num) breakpoints.push(num); }); }else{ element.find('source').each(function(){ var media, num; media = $(this).attr('media'); if(media){ num = media.replace(/[^\d.]/g, ''); breakpoints.push(num); } }); } } var c = 0; windowWidth = $(window).width(); // Set the c variable to the current media width $.each(breakpoints, function(i,v){ if(windowWidth > v && c < v) c = v; }); if(currentMedia !== c){ currentMedia = c; if(element.get(0).tagName.toLowerCase() == 'figure' || element.get(0).tagName.toLowerCase() == 'a') setFigure(); else setPicture(); } } /** * setPicture * * Pulls the image src and media attributes from the source tags and sets * the src of the enclosed img tag to the appropriate one. * */ function setPicture(){ var sizes = new Object(); element.find('source').each(function(){ var media, path, num; media = $(this).attr('media'); path = $(this).attr('src'); if(media) num = media.replace(/[^\d.]/g, ''); else num = 0; sizes[num] = path; }); if(element.find('img').length == 0){ var prep = '' + element.attr('alt') + ''; if(element.find('a').length == 0){ element.append(prep); }else{ element.find('a').append(prep); } }else{ element.find('img').attr('src', sizes[currentMedia]); } } /** * setFigure * * Pulls the image src and and media values from the data attributes * and sets the src of the enclosed img tag to the appropriate one. * */ function setFigure(){ var sizes = new Object(); var mediaObj = element.data(); $.each(mediaObj, function(media, path){ var num; num = media.replace(/[^\d.]/g, ''); if(!num) num = 0; sizes[num] = path; }); if(element.find('img').length == 0){ var prep = '' + element.attr('title') + ''; if(element.find('a').length == 0){ element.prepend(prep); }else{ element.find('a').prepend(prep); } }else{ element.find('img').attr('src', sizes[currentMedia]); } } }); }; })(jQuery);