window.innerWidth - workaround for when it returns the wrong valueAltering contents when loading iframesDetecting when the contents of a web page changesGet the value of the name attribute of each element with class=“class”Switching some text labels when the first image of a carousel is activewhen we need to add some javascript code to html, where we have to put it?Filling in comment replies when link is clickedJavascript node/react web developer interview codeFunction that returns value based on specific categoryAdd the number of descendants for each li nodeChanging the text of a few elements when a tile is clicked

Quoting Keynes in a lecture

Why can't the Brexit deadlock in the UK parliament be solved with a plurality vote?

What (the heck) is a Super Worm Equinox Moon?

The Digit Triangles

Why does AES have exactly 10 rounds for a 128-bit key, 12 for 192 bits and 14 for a 256-bit key size?

Does "he squandered his car on drink" sound natural?

Does an advisor owe his/her student anything? Will an advisor keep a PhD student only out of pity?

How can I write humor as character trait?

How to preserve electronics (computers, iPads and phones) for hundreds of years

How can ping know if my host is down

C++ copy constructor called at return

How to make money from a browser who sees 5 seconds into the future of any web page?

Circuit Analysis: Obtaining Close Loop OP - AMP Transfer function

Can I cause damage to electrical appliances by unplugging them when they are turned on?

Did the UK lift the requirement for registering SIM cards?

Why should universal income be universal?

Permission on Database

How do I tell my boss that I'm quitting soon, especially given that a colleague just left this week

What is the highest possible scrabble score for placing a single tile

Why is so much work done on numerical verification of the Riemann Hypothesis?

How much theory knowledge is actually used while playing?

How could a planet have erratic days?

What is the English pronunciation of "pain au chocolat"?

Giving feedback to someone without sounding prejudiced



window.innerWidth - workaround for when it returns the wrong value


Altering contents when loading iframesDetecting when the contents of a web page changesGet the value of the name attribute of each element with class=“class”Switching some text labels when the first image of a carousel is activewhen we need to add some javascript code to html, where we have to put it?Filling in comment replies when link is clickedJavascript node/react web developer interview codeFunction that returns value based on specific categoryAdd the number of descendants for each li nodeChanging the text of a few elements when a tile is clicked













1












$begingroup$


  • Some JavaScript libraries relies on window innerWidth and innerHeight to do their calculations


  • window.innerWidth is not 100% reliable, which may lead to bugs


  • matchMedia().matches is 100% accurate but it returns a boolean value

  • come around: use matchMedia to verify window.innerWidth value; if it returns false use matchMedia to do a binary search until it finds the correct value

I faced that issue with some libs that relies on window.innerWidth. In cases where I had some media queries the return value of window.innerWidth used by the library would be off and that library would have issues with incorrect value.



I've seen that matchMedia().matches always return the correct value, but it returns a boolean value, not the width value. I've not seen a solution so far for that (maybe some of you know a better solution?), so I came up with a solution using matchMedia.



I created a function getCorrectDimension that performs a binary search around the window innerWidth (or innerHeight) to find the correct value if its value is wrong as you can see below:



const binarySearch = dim => function bin(start, end) 
const guess = Math.floor((start + end)/2)

// this checks if we have the correct value, if not it will keep calling itself until there's a match
if(window.matchMedia(`($dim: $guesspx)`).matches)
return guess


// since it is not a match, then we need to recalibrate the range and call again.
// for that we check the boolean value using with min-width (height) rule.
return window.matchMedia(`(min-$dim: $guesspx)`).matches
? bin(guess, end)
: bin(start, guess)


const getCorrectDimension = (dim = 'width', range = 300) =>
if(dim !== 'width' && dim !== 'height')
throw Error('`getCorrectDimension` accepts "width" or "height" as parameter')


let prop = 'inner' + dim.charAt(0).toUpperCase() + dim.slice(1)

// here checks if the window.innerWidth or Height it's the correct one
if(window.matchMedia(`($dim: $window[prop]px)`).matches)
return window[prop]


// here, since the value is wrong we use binarySearch to find its correct value
const start = window[prop] - range >= 0 ? window[prop] - range : 0
const end = window[prop] + range

return binarySearch(dim)(start, end)











share|improve this question











$endgroup$




bumped to the homepage by Community 12 mins ago


This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.



















    1












    $begingroup$


    • Some JavaScript libraries relies on window innerWidth and innerHeight to do their calculations


    • window.innerWidth is not 100% reliable, which may lead to bugs


    • matchMedia().matches is 100% accurate but it returns a boolean value

    • come around: use matchMedia to verify window.innerWidth value; if it returns false use matchMedia to do a binary search until it finds the correct value

    I faced that issue with some libs that relies on window.innerWidth. In cases where I had some media queries the return value of window.innerWidth used by the library would be off and that library would have issues with incorrect value.



    I've seen that matchMedia().matches always return the correct value, but it returns a boolean value, not the width value. I've not seen a solution so far for that (maybe some of you know a better solution?), so I came up with a solution using matchMedia.



    I created a function getCorrectDimension that performs a binary search around the window innerWidth (or innerHeight) to find the correct value if its value is wrong as you can see below:



    const binarySearch = dim => function bin(start, end) 
    const guess = Math.floor((start + end)/2)

    // this checks if we have the correct value, if not it will keep calling itself until there's a match
    if(window.matchMedia(`($dim: $guesspx)`).matches)
    return guess


    // since it is not a match, then we need to recalibrate the range and call again.
    // for that we check the boolean value using with min-width (height) rule.
    return window.matchMedia(`(min-$dim: $guesspx)`).matches
    ? bin(guess, end)
    : bin(start, guess)


    const getCorrectDimension = (dim = 'width', range = 300) =>
    if(dim !== 'width' && dim !== 'height')
    throw Error('`getCorrectDimension` accepts "width" or "height" as parameter')


    let prop = 'inner' + dim.charAt(0).toUpperCase() + dim.slice(1)

    // here checks if the window.innerWidth or Height it's the correct one
    if(window.matchMedia(`($dim: $window[prop]px)`).matches)
    return window[prop]


    // here, since the value is wrong we use binarySearch to find its correct value
    const start = window[prop] - range >= 0 ? window[prop] - range : 0
    const end = window[prop] + range

    return binarySearch(dim)(start, end)











    share|improve this question











    $endgroup$




    bumped to the homepage by Community 12 mins ago


    This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.

















      1












      1








      1





      $begingroup$


      • Some JavaScript libraries relies on window innerWidth and innerHeight to do their calculations


      • window.innerWidth is not 100% reliable, which may lead to bugs


      • matchMedia().matches is 100% accurate but it returns a boolean value

      • come around: use matchMedia to verify window.innerWidth value; if it returns false use matchMedia to do a binary search until it finds the correct value

      I faced that issue with some libs that relies on window.innerWidth. In cases where I had some media queries the return value of window.innerWidth used by the library would be off and that library would have issues with incorrect value.



      I've seen that matchMedia().matches always return the correct value, but it returns a boolean value, not the width value. I've not seen a solution so far for that (maybe some of you know a better solution?), so I came up with a solution using matchMedia.



      I created a function getCorrectDimension that performs a binary search around the window innerWidth (or innerHeight) to find the correct value if its value is wrong as you can see below:



      const binarySearch = dim => function bin(start, end) 
      const guess = Math.floor((start + end)/2)

      // this checks if we have the correct value, if not it will keep calling itself until there's a match
      if(window.matchMedia(`($dim: $guesspx)`).matches)
      return guess


      // since it is not a match, then we need to recalibrate the range and call again.
      // for that we check the boolean value using with min-width (height) rule.
      return window.matchMedia(`(min-$dim: $guesspx)`).matches
      ? bin(guess, end)
      : bin(start, guess)


      const getCorrectDimension = (dim = 'width', range = 300) =>
      if(dim !== 'width' && dim !== 'height')
      throw Error('`getCorrectDimension` accepts "width" or "height" as parameter')


      let prop = 'inner' + dim.charAt(0).toUpperCase() + dim.slice(1)

      // here checks if the window.innerWidth or Height it's the correct one
      if(window.matchMedia(`($dim: $window[prop]px)`).matches)
      return window[prop]


      // here, since the value is wrong we use binarySearch to find its correct value
      const start = window[prop] - range >= 0 ? window[prop] - range : 0
      const end = window[prop] + range

      return binarySearch(dim)(start, end)











      share|improve this question











      $endgroup$




      • Some JavaScript libraries relies on window innerWidth and innerHeight to do their calculations


      • window.innerWidth is not 100% reliable, which may lead to bugs


      • matchMedia().matches is 100% accurate but it returns a boolean value

      • come around: use matchMedia to verify window.innerWidth value; if it returns false use matchMedia to do a binary search until it finds the correct value

      I faced that issue with some libs that relies on window.innerWidth. In cases where I had some media queries the return value of window.innerWidth used by the library would be off and that library would have issues with incorrect value.



      I've seen that matchMedia().matches always return the correct value, but it returns a boolean value, not the width value. I've not seen a solution so far for that (maybe some of you know a better solution?), so I came up with a solution using matchMedia.



      I created a function getCorrectDimension that performs a binary search around the window innerWidth (or innerHeight) to find the correct value if its value is wrong as you can see below:



      const binarySearch = dim => function bin(start, end) 
      const guess = Math.floor((start + end)/2)

      // this checks if we have the correct value, if not it will keep calling itself until there's a match
      if(window.matchMedia(`($dim: $guesspx)`).matches)
      return guess


      // since it is not a match, then we need to recalibrate the range and call again.
      // for that we check the boolean value using with min-width (height) rule.
      return window.matchMedia(`(min-$dim: $guesspx)`).matches
      ? bin(guess, end)
      : bin(start, guess)


      const getCorrectDimension = (dim = 'width', range = 300) =>
      if(dim !== 'width' && dim !== 'height')
      throw Error('`getCorrectDimension` accepts "width" or "height" as parameter')


      let prop = 'inner' + dim.charAt(0).toUpperCase() + dim.slice(1)

      // here checks if the window.innerWidth or Height it's the correct one
      if(window.matchMedia(`($dim: $window[prop]px)`).matches)
      return window[prop]


      // here, since the value is wrong we use binarySearch to find its correct value
      const start = window[prop] - range >= 0 ? window[prop] - range : 0
      const end = window[prop] + range

      return binarySearch(dim)(start, end)








      javascript dom






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Feb 19 at 3:56









      Jamal

      30.4k11121227




      30.4k11121227










      asked Feb 18 at 22:38









      buzattobuzatto

      61




      61





      bumped to the homepage by Community 12 mins ago


      This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.







      bumped to the homepage by Community 12 mins ago


      This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.






















          1 Answer
          1






          active

          oldest

          votes


















          0












          $begingroup$

          I have never seen innerWidth or innerHeight report the wrong value. There are a few bugs listed for chrome and firefox but they are all closed.



          Could you provide any evidence?



          UPDATE



          Media query matches down to fractions of a CSS pixel while innerWidth returns integer CSS pixel values. This is a problem when devicePixelRatio !== devicePixelRatio | 0



          I tried to find a cover all solution, but too much time need to complete so I withdraw the answers content.






          share|improve this answer











          $endgroup$












          • $begingroup$
            example of the issue: at link if you attach an event listener like window.addEventListener('resize', () => console.log(window.innerWidth)), you can see window.innerWidth value make jumps around 950px, a place with a media query breakpoint. you can play around and look into other sites. I started to look recently into this when checking an issue opened at react-sizes link.
            $endgroup$
            – buzatto
            Feb 19 at 21:24











          • $begingroup$
            @buzatto The only way i can get innerWidth to not match the media query is to use a zoom that results in a fractional pixel size such that matchMedia((min-width: $innerWidth-1px) and (max-width: $innerWidth+1px)).matches is true but matchMedia((width: $innerWidthpx)).matches is false. It's not innerWidth that is at fault but the media query. The spec is ambiguous, I will update answer when i have done further research. As it stands searching for a matching integer size will fail if devicePixelRatio !== devicePixelRatio | 0 or the scroll bar size has the same condition.
            $endgroup$
            – Blindman67
            Feb 19 at 23:21










          • $begingroup$
            you said that it had bugs related to chrome and firefox before, but not anymore. I mostly use chrome on daily basis, I tested now on firefox and edge, no apparent issue on them everything is fine, but on chrome there is 16 px jump on average on that example link. I also have a personal project and only on chrome I see jumps as well, not on firefox or edge.
            $endgroup$
            – buzatto
            Feb 20 at 1:27











          • $begingroup$
            @buzatto Your code as it is in the question can fail if the range argument is smaller than the error eg innerWidth reports 1000, media query passes 1016 and range is 10. Also fails on latest Chrome (win10) on some devicePixelRatio non integer values. Eg devicePixelRatio = 1.100000036 (menu setting 110%) the media query matched 1427.6px but not 1428px the closest integer value (I forget the exact values). When it fails it throws a call stack overflow.
            $endgroup$
            – Blindman67
            Feb 20 at 2:44










          Your Answer





          StackExchange.ifUsing("editor", function ()
          return StackExchange.using("mathjaxEditing", function ()
          StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
          StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
          );
          );
          , "mathjax-editing");

          StackExchange.ifUsing("editor", function ()
          StackExchange.using("externalEditor", function ()
          StackExchange.using("snippets", function ()
          StackExchange.snippets.init();
          );
          );
          , "code-snippets");

          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "196"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













          draft saved

          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f213760%2fwindow-innerwidth-workaround-for-when-it-returns-the-wrong-value%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          0












          $begingroup$

          I have never seen innerWidth or innerHeight report the wrong value. There are a few bugs listed for chrome and firefox but they are all closed.



          Could you provide any evidence?



          UPDATE



          Media query matches down to fractions of a CSS pixel while innerWidth returns integer CSS pixel values. This is a problem when devicePixelRatio !== devicePixelRatio | 0



          I tried to find a cover all solution, but too much time need to complete so I withdraw the answers content.






          share|improve this answer











          $endgroup$












          • $begingroup$
            example of the issue: at link if you attach an event listener like window.addEventListener('resize', () => console.log(window.innerWidth)), you can see window.innerWidth value make jumps around 950px, a place with a media query breakpoint. you can play around and look into other sites. I started to look recently into this when checking an issue opened at react-sizes link.
            $endgroup$
            – buzatto
            Feb 19 at 21:24











          • $begingroup$
            @buzatto The only way i can get innerWidth to not match the media query is to use a zoom that results in a fractional pixel size such that matchMedia((min-width: $innerWidth-1px) and (max-width: $innerWidth+1px)).matches is true but matchMedia((width: $innerWidthpx)).matches is false. It's not innerWidth that is at fault but the media query. The spec is ambiguous, I will update answer when i have done further research. As it stands searching for a matching integer size will fail if devicePixelRatio !== devicePixelRatio | 0 or the scroll bar size has the same condition.
            $endgroup$
            – Blindman67
            Feb 19 at 23:21










          • $begingroup$
            you said that it had bugs related to chrome and firefox before, but not anymore. I mostly use chrome on daily basis, I tested now on firefox and edge, no apparent issue on them everything is fine, but on chrome there is 16 px jump on average on that example link. I also have a personal project and only on chrome I see jumps as well, not on firefox or edge.
            $endgroup$
            – buzatto
            Feb 20 at 1:27











          • $begingroup$
            @buzatto Your code as it is in the question can fail if the range argument is smaller than the error eg innerWidth reports 1000, media query passes 1016 and range is 10. Also fails on latest Chrome (win10) on some devicePixelRatio non integer values. Eg devicePixelRatio = 1.100000036 (menu setting 110%) the media query matched 1427.6px but not 1428px the closest integer value (I forget the exact values). When it fails it throws a call stack overflow.
            $endgroup$
            – Blindman67
            Feb 20 at 2:44















          0












          $begingroup$

          I have never seen innerWidth or innerHeight report the wrong value. There are a few bugs listed for chrome and firefox but they are all closed.



          Could you provide any evidence?



          UPDATE



          Media query matches down to fractions of a CSS pixel while innerWidth returns integer CSS pixel values. This is a problem when devicePixelRatio !== devicePixelRatio | 0



          I tried to find a cover all solution, but too much time need to complete so I withdraw the answers content.






          share|improve this answer











          $endgroup$












          • $begingroup$
            example of the issue: at link if you attach an event listener like window.addEventListener('resize', () => console.log(window.innerWidth)), you can see window.innerWidth value make jumps around 950px, a place with a media query breakpoint. you can play around and look into other sites. I started to look recently into this when checking an issue opened at react-sizes link.
            $endgroup$
            – buzatto
            Feb 19 at 21:24











          • $begingroup$
            @buzatto The only way i can get innerWidth to not match the media query is to use a zoom that results in a fractional pixel size such that matchMedia((min-width: $innerWidth-1px) and (max-width: $innerWidth+1px)).matches is true but matchMedia((width: $innerWidthpx)).matches is false. It's not innerWidth that is at fault but the media query. The spec is ambiguous, I will update answer when i have done further research. As it stands searching for a matching integer size will fail if devicePixelRatio !== devicePixelRatio | 0 or the scroll bar size has the same condition.
            $endgroup$
            – Blindman67
            Feb 19 at 23:21










          • $begingroup$
            you said that it had bugs related to chrome and firefox before, but not anymore. I mostly use chrome on daily basis, I tested now on firefox and edge, no apparent issue on them everything is fine, but on chrome there is 16 px jump on average on that example link. I also have a personal project and only on chrome I see jumps as well, not on firefox or edge.
            $endgroup$
            – buzatto
            Feb 20 at 1:27











          • $begingroup$
            @buzatto Your code as it is in the question can fail if the range argument is smaller than the error eg innerWidth reports 1000, media query passes 1016 and range is 10. Also fails on latest Chrome (win10) on some devicePixelRatio non integer values. Eg devicePixelRatio = 1.100000036 (menu setting 110%) the media query matched 1427.6px but not 1428px the closest integer value (I forget the exact values). When it fails it throws a call stack overflow.
            $endgroup$
            – Blindman67
            Feb 20 at 2:44













          0












          0








          0





          $begingroup$

          I have never seen innerWidth or innerHeight report the wrong value. There are a few bugs listed for chrome and firefox but they are all closed.



          Could you provide any evidence?



          UPDATE



          Media query matches down to fractions of a CSS pixel while innerWidth returns integer CSS pixel values. This is a problem when devicePixelRatio !== devicePixelRatio | 0



          I tried to find a cover all solution, but too much time need to complete so I withdraw the answers content.






          share|improve this answer











          $endgroup$



          I have never seen innerWidth or innerHeight report the wrong value. There are a few bugs listed for chrome and firefox but they are all closed.



          Could you provide any evidence?



          UPDATE



          Media query matches down to fractions of a CSS pixel while innerWidth returns integer CSS pixel values. This is a problem when devicePixelRatio !== devicePixelRatio | 0



          I tried to find a cover all solution, but too much time need to complete so I withdraw the answers content.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Feb 20 at 0:58

























          answered Feb 19 at 10:50









          Blindman67Blindman67

          8,6881521




          8,6881521











          • $begingroup$
            example of the issue: at link if you attach an event listener like window.addEventListener('resize', () => console.log(window.innerWidth)), you can see window.innerWidth value make jumps around 950px, a place with a media query breakpoint. you can play around and look into other sites. I started to look recently into this when checking an issue opened at react-sizes link.
            $endgroup$
            – buzatto
            Feb 19 at 21:24











          • $begingroup$
            @buzatto The only way i can get innerWidth to not match the media query is to use a zoom that results in a fractional pixel size such that matchMedia((min-width: $innerWidth-1px) and (max-width: $innerWidth+1px)).matches is true but matchMedia((width: $innerWidthpx)).matches is false. It's not innerWidth that is at fault but the media query. The spec is ambiguous, I will update answer when i have done further research. As it stands searching for a matching integer size will fail if devicePixelRatio !== devicePixelRatio | 0 or the scroll bar size has the same condition.
            $endgroup$
            – Blindman67
            Feb 19 at 23:21










          • $begingroup$
            you said that it had bugs related to chrome and firefox before, but not anymore. I mostly use chrome on daily basis, I tested now on firefox and edge, no apparent issue on them everything is fine, but on chrome there is 16 px jump on average on that example link. I also have a personal project and only on chrome I see jumps as well, not on firefox or edge.
            $endgroup$
            – buzatto
            Feb 20 at 1:27











          • $begingroup$
            @buzatto Your code as it is in the question can fail if the range argument is smaller than the error eg innerWidth reports 1000, media query passes 1016 and range is 10. Also fails on latest Chrome (win10) on some devicePixelRatio non integer values. Eg devicePixelRatio = 1.100000036 (menu setting 110%) the media query matched 1427.6px but not 1428px the closest integer value (I forget the exact values). When it fails it throws a call stack overflow.
            $endgroup$
            – Blindman67
            Feb 20 at 2:44
















          • $begingroup$
            example of the issue: at link if you attach an event listener like window.addEventListener('resize', () => console.log(window.innerWidth)), you can see window.innerWidth value make jumps around 950px, a place with a media query breakpoint. you can play around and look into other sites. I started to look recently into this when checking an issue opened at react-sizes link.
            $endgroup$
            – buzatto
            Feb 19 at 21:24











          • $begingroup$
            @buzatto The only way i can get innerWidth to not match the media query is to use a zoom that results in a fractional pixel size such that matchMedia((min-width: $innerWidth-1px) and (max-width: $innerWidth+1px)).matches is true but matchMedia((width: $innerWidthpx)).matches is false. It's not innerWidth that is at fault but the media query. The spec is ambiguous, I will update answer when i have done further research. As it stands searching for a matching integer size will fail if devicePixelRatio !== devicePixelRatio | 0 or the scroll bar size has the same condition.
            $endgroup$
            – Blindman67
            Feb 19 at 23:21










          • $begingroup$
            you said that it had bugs related to chrome and firefox before, but not anymore. I mostly use chrome on daily basis, I tested now on firefox and edge, no apparent issue on them everything is fine, but on chrome there is 16 px jump on average on that example link. I also have a personal project and only on chrome I see jumps as well, not on firefox or edge.
            $endgroup$
            – buzatto
            Feb 20 at 1:27











          • $begingroup$
            @buzatto Your code as it is in the question can fail if the range argument is smaller than the error eg innerWidth reports 1000, media query passes 1016 and range is 10. Also fails on latest Chrome (win10) on some devicePixelRatio non integer values. Eg devicePixelRatio = 1.100000036 (menu setting 110%) the media query matched 1427.6px but not 1428px the closest integer value (I forget the exact values). When it fails it throws a call stack overflow.
            $endgroup$
            – Blindman67
            Feb 20 at 2:44















          $begingroup$
          example of the issue: at link if you attach an event listener like window.addEventListener('resize', () => console.log(window.innerWidth)), you can see window.innerWidth value make jumps around 950px, a place with a media query breakpoint. you can play around and look into other sites. I started to look recently into this when checking an issue opened at react-sizes link.
          $endgroup$
          – buzatto
          Feb 19 at 21:24





          $begingroup$
          example of the issue: at link if you attach an event listener like window.addEventListener('resize', () => console.log(window.innerWidth)), you can see window.innerWidth value make jumps around 950px, a place with a media query breakpoint. you can play around and look into other sites. I started to look recently into this when checking an issue opened at react-sizes link.
          $endgroup$
          – buzatto
          Feb 19 at 21:24













          $begingroup$
          @buzatto The only way i can get innerWidth to not match the media query is to use a zoom that results in a fractional pixel size such that matchMedia((min-width: $innerWidth-1px) and (max-width: $innerWidth+1px)).matches is true but matchMedia((width: $innerWidthpx)).matches is false. It's not innerWidth that is at fault but the media query. The spec is ambiguous, I will update answer when i have done further research. As it stands searching for a matching integer size will fail if devicePixelRatio !== devicePixelRatio | 0 or the scroll bar size has the same condition.
          $endgroup$
          – Blindman67
          Feb 19 at 23:21




          $begingroup$
          @buzatto The only way i can get innerWidth to not match the media query is to use a zoom that results in a fractional pixel size such that matchMedia((min-width: $innerWidth-1px) and (max-width: $innerWidth+1px)).matches is true but matchMedia((width: $innerWidthpx)).matches is false. It's not innerWidth that is at fault but the media query. The spec is ambiguous, I will update answer when i have done further research. As it stands searching for a matching integer size will fail if devicePixelRatio !== devicePixelRatio | 0 or the scroll bar size has the same condition.
          $endgroup$
          – Blindman67
          Feb 19 at 23:21












          $begingroup$
          you said that it had bugs related to chrome and firefox before, but not anymore. I mostly use chrome on daily basis, I tested now on firefox and edge, no apparent issue on them everything is fine, but on chrome there is 16 px jump on average on that example link. I also have a personal project and only on chrome I see jumps as well, not on firefox or edge.
          $endgroup$
          – buzatto
          Feb 20 at 1:27





          $begingroup$
          you said that it had bugs related to chrome and firefox before, but not anymore. I mostly use chrome on daily basis, I tested now on firefox and edge, no apparent issue on them everything is fine, but on chrome there is 16 px jump on average on that example link. I also have a personal project and only on chrome I see jumps as well, not on firefox or edge.
          $endgroup$
          – buzatto
          Feb 20 at 1:27













          $begingroup$
          @buzatto Your code as it is in the question can fail if the range argument is smaller than the error eg innerWidth reports 1000, media query passes 1016 and range is 10. Also fails on latest Chrome (win10) on some devicePixelRatio non integer values. Eg devicePixelRatio = 1.100000036 (menu setting 110%) the media query matched 1427.6px but not 1428px the closest integer value (I forget the exact values). When it fails it throws a call stack overflow.
          $endgroup$
          – Blindman67
          Feb 20 at 2:44




          $begingroup$
          @buzatto Your code as it is in the question can fail if the range argument is smaller than the error eg innerWidth reports 1000, media query passes 1016 and range is 10. Also fails on latest Chrome (win10) on some devicePixelRatio non integer values. Eg devicePixelRatio = 1.100000036 (menu setting 110%) the media query matched 1427.6px but not 1428px the closest integer value (I forget the exact values). When it fails it throws a call stack overflow.
          $endgroup$
          – Blindman67
          Feb 20 at 2:44

















          draft saved

          draft discarded
















































          Thanks for contributing an answer to Code Review Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          Use MathJax to format equations. MathJax reference.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f213760%2fwindow-innerwidth-workaround-for-when-it-returns-the-wrong-value%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          कुँवर स्रोत दिक्चालन सूची"कुँवर""राणा कुँवरके वंशावली"

          Why is a white electrical wire connected to 2 black wires?How to wire a light fixture with 3 white wires in box?How should I wire a ceiling fan when there's only three wires in the box?Two white, two black, two ground, and red wire in ceiling box connected to switchWhy is there a white wire connected to multiple black wires in my light box?How to wire a light with two white wires and one black wireReplace light switch connected to a power outlet with dimmer - two black wires to one black and redHow to wire a light with multiple black/white/green wires from the ceiling?Ceiling box has 2 black and white wires but fan/ light only has 1 of eachWhy neutral wire connected to load wire?Switch with 2 black, 2 white, 2 ground and 1 red wire connected to ceiling light and a receptacle?

          चैत्य भूमि चित्र दीर्घा सन्दर्भ बाहरी कडियाँ दिक्चालन सूची"Chaitya Bhoomi""Chaitya Bhoomi: Statue of Equality in India""Dadar Chaitya Bhoomi: Statue of Equality in India""Ambedkar memorial: Centre okays transfer of Indu Mill land"चैत्यभमि