Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there any cross-browser javascript for making vh and vw units work

Note: Ok while I was typing this question I came across this question which suggests to use @media query but was asked back in 2011...

As you know CSS3 introduces new Viewport-percentage length units, vh and vw, which I feel are really useful for a solid responsive layout, so my question is, is there any JavaScript/jQuery alternative for this? More over apart from using it for font sizes, is it safe to use for sizing elements? Like example

div {    height: 6vh;    width: 20vh;  /* Note am using vh for both, do I need to use vw for width here? */ } 
like image 623
Mr. Alien Avatar asked Dec 19 '12 09:12

Mr. Alien


People also ask

Can VW use VH?

vh and vw in actionTo use vh and vw values, just type “Nvh” or “Nvw” (where “N” represents the percentage of the viewport you'd like to cover) into any width or height field. So to cover 100% of the viewport, you'd set 100% for the width and 100vh for the height.

How do you calculate VH and VW?

You calculate the vw value by taking the difference in font-size ( 22 - 18 ), divide it by the difference in viewport widths ( 1000 - 600 ), then multiply it by 100vw - smaller-viewport-width ( 100vw - 600px ).

What is VW VH HTML?

vw : hundredths of the viewport width. vh : hundredths of the viewport height. vmin : hundredths of whichever is smaller, the viewport width or height.


1 Answers

Update 5: .css(property) fix Plugins like fancyBox use .css('margin-right') to fetch the right margin of an element and .css('margin-right', '12px') to set the right margin of an element. This was broken, because there was no check if props is a string and if there are multiple arguments given. Fixed it by checking if props is a string. If so and there is multiple arguments, arguments is rewritten into an object, otherwise parseProps( $.extend( {}, props ) ) is not used.

Update 4: Plugin for responsive layouts https://github.com/elclanrs/jquery.columns (in the works)

I gave this a (long) try. First here's the CSS example: http://jsbin.com/orajac/1/edit#css. (resize the output panel). Notice that the font-size doesn't work with viewport units, at least on latest Chrome.

And here's my attempt at doing this with jQuery. The jQuery demo which works with the font as well is at http://jsbin.com/izosuy/1/edit#javascript. Haven't tested it extensively but it seems to work with most properties since it's just converting the values to pixel and then by calling the plugin on window.resize it keeps updating.

Update: Updated code to work with many browsers. Test locally if you're using anything other than Chrome because jsBin acts a bit weird with window.resize.

Update 2: Extend native css method.

Update 3: Handle window.resize event inside of the plugin so the integration is now seamless.

The gist (to test locally): https://gist.github.com/4341016

/*   * CSS viewport units with jQuery   * http://www.w3.org/TR/css3-values/#viewport-relative-lengths   */  ;(function( $, window ){      var $win = $(window)      , _css = $.fn.css;      function viewportToPixel( val ) {      var percent = val.match(/[\d.]+/)[0] / 100        , unit = val.match(/[vwh]+/)[0];      return (unit == 'vh' ? $win.height() : $win.width()) * percent +'px';    }      function parseProps( props ) {      var p, prop;      for ( p in props ) {        prop = props[ p ];        if ( /[vwh]$/.test( prop ) ) {          props[ p ] = viewportToPixel( prop );        }      }      return props;    }      $.fn.css = function( props ) {      var self = this        , originalArguments = arguments        , update = function() {            if ( typeof props === 'string' || props instanceof String ) {              if (originalArguments.length > 1) {                var argumentsObject = {};                argumentsObject[originalArguments[0]] = originalArguments[1];                return _css.call(self, parseProps($.extend({}, argumentsObject)));              } else {                return _css.call( self, props );              }            } else {              return _css.call( self, parseProps( $.extend( {}, props ) ) );            }          };      $win.resize( update ).resize();      return update();    };    }( jQuery, window ));    // Usage:  $('div').css({    height: '50vh',    width: '50vw',    marginTop: '25vh',    marginLeft: '25vw',    fontSize: '10vw'  });
like image 90
16 revs, 3 users 87% Avatar answered Sep 21 '22 05:09

16 revs, 3 users 87%