2016-10-08 7 views
3

私はしばらくの間プロジェクトに取り組んでおり、emを使用していると、長さを表現すると、事実上のユニットとなりました。CSSメディアでEMを使用する方法JavaScriptイベントと一致するクエリ?

普段進行方法は、所望のPXサイズと1EMに他のすべての要素にHTML要素を設定することです。その後、残りはすべてemにあります。今朝までこれは良い計画のように思えました。のメディアクエリは、ベースのボディhtmlpxの値を考慮していないようです。実際には、ブラウザのデフォルトのフォントサイズを使用するように見えますが、これは非常に奇妙な動作です。私もこれを確認していると思われるthis articleが見つかりました。

私は、まさにこの挙動を示している小さなJsFiddle例行っている:実験はシンプルで、デフォルトではテーブルが50emまで「」の値を示して

https://jsfiddle.net/5dq3kq2t/2/

html, body { 
    font-size: 20px; 
} 

* { 
    font-size: 1em; 
} 

#divOf50Em { 
    width: 50em; 
    border: solid 1px red; 
} 

#cell2 { 
    display: none; 
} 

@media screen and (min-width: 50em) { /* 1000px, in theory (50 * 20px) */ 
    #cell1 { 
    display: none; 
    } 

    #cell2 { 
    display: table-cell; 
    } 

} 

分の幅メディアサイズが満たされています。値「」が表示されます。また、サイズが50emdivを配置し、動作をトリガーするタイミングを示し、CSSがメディアクエリーの外で動作することを確認しました。

あなたは、この実験の出力のサイズを変更する場合は、2つの値の間のずれが50em * 20ピクセルある1000px値で起こるが、それは、それはで行わないことを期待します800px50em * 16px(デフォルトのブラウザfont-size - これがデフォルトのサイズの場合は)。

私ははっきりとこれがなぜ起こるかがわからないんだけど、私は二つの質問があります。

  1. をこれを回避する方法があります(たとえば、CSSの観点から、デフォルトのブラウザのフォントサイズ を上書き)
  2. ない場合JavaScriptのブラウザのデフォルトの フォントサイズにアクセスする方法はありますか?私はこの情報を見つけることができませんでした。

それ以外の場合は、メディアの幅とEM Sを使用した場合、我々は、ブラウザのフォントサイズは、常にに16pxになることを頼ることができないので、いくつかの行動のためのメディアクエリで整列されるだろうスクリプトが不可能であるように見えます。

これが当てはまる場合、私の最後の質問は、メディアクエリとJavaScriptをピクセルに戻さずに整列させる方法でしょうか?私は静的なピクセルより相対的な単位を好む、彼らは通常、スタイリングをはるかに簡単にします。より多くの研究の後

+0

Questiオンです? '1em'は' 16px'と同じです – guest271314

+0

@ guest271314あなたが上書きしない場合、私のJsFiddleをチェックしてください。 CSSの観点から16pxを上書きできますが、ブラウザの設定の観点からも上書きできます。 –

+0

問題点は何ですか? – guest271314

答えて

1

  1. CSSやJavaScriptのいずれか1em value = browser default font-size in pixelを上書き周りに方法がないように見えます。
  2. メディアクエリは、ブラウザを参照していますが、通常の/期待される動作のように見えるHTML要素ではありません。
  3. ブラウザのデフォルトのフォントサイズをピクセル単位で取得することは、JavaScriptを使用することで可能になります。私は、それがストップギャップに過ぎないと考えていません。
  4. 実際のソリューションでは、すべてのメディアクエリをJavaScriptで上書きする必要があります。これは、非常に重くてスケールが難しくなります。
  5. 他のユニットを使用すると、いくつかの課題が解決されるかもしれませんが、今日までクロスブラウザの互換性の問題が発生する可能性があります。
+0

_「ブラウザのデフォルトのフォントサイズをピクセル単位で取得することは可能ですが、これはJavaScriptを使用することで可能ですが、これはストップギャップに過ぎないと考えています。ポイント#4のため – guest271314

+0

@ guest271314 JavaScriptをメディアクエリに合わせても、メディアクエリはブラウザ設定に基づいているため信頼できません。技術的には問題の1つを解決することができますが、よりグローバルに見える問題の一部のみを解決することは多くの作業になります。 –

+0

ユニットを50xブラウザ設定にするか、 'css'で設定した場合、回避策として、取得したプロパティの値に' 50'を掛けることです。 – guest271314

0

可能な回避策がgetComputedStyle

:root, body { 
    --size: 20px; 
    --opt: 50rem; 
    --def: 1rem; 
    font-size: var(--size); 
} 

* { 
    font-size: var(--def); 
} 

#divOf50Em { 
    width: var(--opt); 
    border: solid 1px red; 
} 

#cell2 { 
    display: none; 
} 

window.onload = function() { 
    document.getElementById('documentWidth').innerHTML = 'Window width: ' 
    + document.documentElement.clientWidth + 'px'; 

    var n = 50; 

    var fontSize = parseInt(getComputedStyle(document.getElementById("divOf50Em")) 
       .getPropertyValue("font-size")); 

    var css = `@media screen and (min-width:${fontSize * n}px) { 
       /* 1000px, in theory (50 * 20px) */ 
       #cell1 { 
       display: none; 
       } 

       #cell2 { 
       display: table-cell; 
       } 
      }`; 

    var style = document.createElement("style"); 
    style.textContent = css; 
    document.head.appendChild(style); 

    window.addEventListener('resize', function() { 
    document.getElementById('documentWidth').innerHTML = 'Window width: ' + 
     document.documentElement.clientWidth + 'px'; 
    }); 
} 

plnkr http://plnkr.co/edit/lncvWwBWc18C76UYhPnf?p=preview

を使用して bodyの子ノードの font-sizeを取得することにより、 windowloadイベントでメディアクエリを設定することです
+0

非常に印象的です。このブラウザをより互換性のあるものにする簡単な方法があるかどうか知っていますか?私はそれについて言及しなかったことを知っているので、技術的にあなたは問題を解決しましたが、このバージョンは標準のウェブサイトでは実際には使用できませんでした。 –

+0

@NicolasBouvretteプロパティを手動で設定するために 'var()'関数を使うことができます。 'template literal'を' + 'operatoを使って文字列連結に置き換えます。 plnkrをフォークして例を示します – guest271314

+0

@NicolasBouvrette http://plnkr.co/edit/lncvWwBWc18C76UYhPnf?p=preview version 2を参照してください。バージョン3は '*'セレクタの 'font-size'プロパティで' inherit'値を使います。 '#divOf50Em'要素で' width'を設定する 'calc(20 * 50)'まだ – guest271314

関連する問題