A jQuery cssHook adding support for "cover" and "contain" to IE6-7-8, in 1.5K
Progressive Enhancement is the mantra I live by. It means "Have fun with CSS3 and don't worry about IE6-7-8 users; they'll never notice they're missing out on your gorgeous text-shadows and gradients, anyway".
All was well until I discovered the elegance of background-size: cover; and background-size: contain;.
The first one, for instance, allows an image to completely cover a background,
without having to send a 1920x1080 background image down the pipes.
Unfortunately, they don't degrade gracefully: websites would likely appear broken to IE6-7-8 users - unless you use this cssHook!
Set the background-size just like any other style property with jQuery:
$(elem).css( "background-size", "cover" );
In browsers that don't implement it natively, an <img/> will be inserted in the background of elem and emulate the cover or contain value.
Calculating the displayed position and size of the background-image of an element is quite complex and function of numerous parameters:
It is thus impossible to emulate background-size completely and perfectly. But it's still possible to enjoy the main features:
$(elem).css("background-image", "differentImage.jpg");The following style properties, values or behavior aren't supported:
cover or contain in background-size background-position background-position (only percentages and keywords such as center work) repeat value in background-repeat Removing any of these limitations is probably just one fork away...
The elements targeted by this plugin should be positioned (position: relative/absolute/fixed; but not static) and have a z-index.
If not, they will be given a position: relative; and z-index: 0;.
In some cases this could potentially alter the layout of your page in IE6-7-8.
To help you spot problems earlier, you can use a flag that will turn ON emulation of background-size in all browsers:
<!-- The flag should be inserted before loading the script -->
<script>$.debugBGS = true;</script>
<script src="/path/to/jquery.backgroundSize.js"></script>
Switch to the following snippet before deploying your code to a production environment:
<!--[if lt IE 9]> <script src="/path/to/jquery.backgroundSize.min.js"></script> <![endif]-->
There are several cases that can cause an element to be resized and require its background to be refreshed
(e.g. modifying the size of its content or animating it).
This plugin includes a helper for that purpose: $.refreshBackgroundDimensions( elem );. Here's how to use it during an animation:
$(elem).animate({ height: "+=100" }, {
step: function() { $.refreshBackgroundDimensions( this ); }
});
MIT Licensed http://louisremi.mit-license.org/, by @louis_remi
Questions & Comments