【javascript】DOM生成時に動的にcssを組み替える

前回のuseragentを応用して、iPhoneXかそれ以外の機種かで判定して、

iPhoneXの場合はidを更新してそれに応じたcssを出すプログラム

を組みました。

なぜこの機能が必要かというと、iPhoneXにはノッチが存在するので、

その分高さがずれ込んでタブボタンの下に謎の余白が生まれてしまうためです。

 

本来ならばpadding-top: env(safe-area-inset-top);や

padding-top: constant(safe-area-inset-top);を使って合わせていくの

ですがこのままだとconstantやenvを正しく使うことができません。

何故かというと、今使っているCordovaのバージョンが7.1なのですが、

Cordova7.1プロジェクトで利用されているWebViewUIWebViewを

使用しています。このUIWebViewは、constantやenvに対応していなく、

WKWebViewでないと正常な動作をしてくれないのです。

そこで、各iphoneの画面に応じてcssを変更するような

コードを書いてみました。

 

</pre>
<p class="p1"><span class="Apple-converted-space">    </span>#iphoneX_design{</p>
<p class="p1"><span class="Apple-converted-space">    </span>background-color: #FFF<span class="s1">;</span></p>
<p class="p1"><span class="Apple-converted-space">    </span>padding-top: 10px<span class="s1">;</span></p>
<p class="p1"><span class="Apple-converted-space">    </span>padding-bottom: 34px<span class="s1">;</span></p>
<p class="p1"><span class="Apple-converted-space">    </span>padding-left: 0px<span class="s1">;</span></p>
<p class="p1"><span class="Apple-converted-space">    </span>padding-right: 0px<span class="s1">;</span></p>
<p class="p1">}</p>

<pre>

 

</pre>
<p class="p1">var isiPhone = /iphone/i.test<span class="s1">(</span>window.navigator.userAgent.toLowerCase<span class="s1">());</span></p>
<p class="p1"><span class="Apple-converted-space">    </span>var isiBrowser = /chrome/i.test<span class="s1">(</span>window.navigator.userAgent.toLowerCase<span class="s1">());</span></p>
<p class="p1"><span class="Apple-converted-space">    </span>if<span class="s1">(</span>isiPhone<span class="s1">)</span>{</p>
<p class="p1"><span class="Apple-converted-space">      </span>var tmp = document.getElementById<span class="s1">(</span>"design"<span class="s1">);</span></p>
<p class="p1"><span class="Apple-converted-space">      </span>var val="iphoneX_design"<span class="s1">;</span></p>
<p class="p1"><span class="Apple-converted-space">      </span>tmp.setAttribute<span class="s1">(</span>"id"<span class="s1">,</span>val<span class="s1">);</span></p>
<p class="p1"><span class="Apple-converted-space">    </span>} else if<span class="s1">(</span>isiBrowser<span class="s1">)</span>{</p>
<p class="p1"><span class="Apple-converted-space">      </span>alert<span class="s1">(</span>"<span class="s1">ブラウザ使いです</span>"<span class="s1">);</span></p>
<p class="p1"><span class="Apple-converted-space">    </span>}</p>

<pre>

 

htnlからid「design」を取得し、setAttributeで新しいidとして

valの値を挿入していますね。

このvalは、cssの中で定義した「iphoneX_design」という

スタイルなので、これがidとしてすり替わった時に

iphoneXのデザインが組み込まれる仕組みになっています。

最初はこれをcomponentWillMountに組み込んでしまい

DOMが生成される前にidを検索していたので

エラーになりましたが、生成後のcomponentDidMount内で

処理をすれば生成後のDOMを操作することができるようになります。

動的に組み込む手段としてはこれが最適解かなと

思います。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG