rem をモバイル デバイスに適応させる方法の例

rem をモバイル デバイスに適応させる方法の例

序文

モバイル端末のREM適応ソリューションのレビューと概要

remの使い方

rem 単位の計算は、HTML のルート ノードのフォント サイズを参照します。ルート ノードのフォントが変更されると、レイアウトによって参照される rem ページもそれに応じて拡大縮小されます。これが rem レイアウトの本質です。

1. HTMLのフォントサイズの値を動的に変更する

ほぼすべてのブラウザは HTML のフォント サイズを 16px に初期化します。動的に変更したい場合は、rem によって適応されたルート ノードのフォント サイズの初期値として 16px を一時的に設定できます。

では、動的な変更にはどのように適応すればよいのでしょうか?

デザインの幅が 750 ピクセルであると仮定し、レイアウトに 1rem = 16 ピクセルの単位を使用するように定義しますが、どのように適応すればよいでしょうか?

Chrome 上の iPhone シミュレーターの幅は 375px で、これはデザイン案のちょうど半分です。 暗算すると、そのときの 1rem は初期化時の HTML ノードのフォント サイズの半分、つまり newFontSize = 16/2 = 8px に等しいはずです。 半分ずつに適合しているのではないでしょうか。

ここから、デザイン ドラフトの幅 / 16 px = 適応するデバイスの幅 / 8 px という式が得られます。新しいフォント サイズは、現在のデバイスの幅と元のデザイン ドラフトの幅に基づいて比例して拡大縮小されることがわかります。

最後に、newFontSize = 16px * 適応するデバイスの幅 / 元のデザインの幅

(関数(doc, win) {
  var resizeEvt =
      ウィンドウ内の「orientationchange」?「orientationchange」:「resize」、
    setRemResponse = 関数() {
      var vM = 750;
      var vfontSize = 16;
      var html = doc.documentElement;
      var newfontSize = (vfontSize * html.clientWidth) / vM;
      html.style.fontSize = 新しいフォントサイズ + "px";
    };
  doc.addEventListener("DOMContentLoaded", setRemResponse, false);
  win.addEventListener(resizeEvt、setRemResponse、false);
})(ドキュメント、ウィンドウ);

2. 実際の使用

測定されたbtnボタンスタイルをpxからremに変換する

.btn{
  幅: 699px; /* 699/16 => 43.6875rem; */
  高さ: 90px; /* 90/16px => 5.625rem; */
  背景: rgba(90, 173, 246, 1);
  境界線の半径: 6px; /* 6/16=> 0.375rem; */
}

計算が面倒すぎるので、計算処理の代わりにscssを使って関数を定義します。

@function pxToRem($initialStyle) {
  @return $initialStyle/16 * 1rem;
}

上記の CSS は次のように書き換えられます。

.btn{
  幅: pxToRem(699);
  高さ:pxToRem(90);
  背景: rgba(90, 173, 246, 1);
  境界線の半径:pxToRem(6);
}

補足: vscodeのプラグインcssremは、css、scssに入力したpxをrem単位に変換する計算をサポートしています。デフォルトのフォントサイズは16pxに設定されています。

計算方法の変更、暗算の残余

1. 簡単な分析

前のセクションを分析すると、最終的にnewFontSize = 16px * 適応するデバイスの幅 / 元のデザインの幅が得られます。

計算するたびに 16 で割るのは非常に面倒です。初期の HTML ルート ノードの font-size を計算しやすいように変更すると、最終的には除数として機能するため、どのような値になるでしょうか。100 の方が便利ですか。それは正しい!

定数 oHtml = document.documentElement;
定数 clientWidth = oHtml.clientWidth;
var vM = 750;
var vfontSize = 100;
// モバイルデバイス oHtml.style.fontSize = (vfontSize * clientWidth) / vM + "px";

2. 実際の使用

引き続き、上記の使い慣れたボタンを使用して、px を rem に変換し、結果を頭の中で計算します。

.btn{
  幅: 699px; /* 699/100 => 6.99rem; */
  高さ: 90px; /* 90/100 => 0.9rem; */
  背景: rgba(90, 173, 246, 1);
  境界線の半径: 6px; /* 6/100=> 0.06rem; */
}

正直に言うと、scss があると本当に便利です!

@function を100倍に減らす($initialStyle) {
  @return $initialStyle/100 * 1rem;
}

上記の CSS 関数メソッドは次のように書き換えられます。

.btn{
  幅: 縮小100(699);
  高さ:縮小100(90);
  背景: rgba(90, 173, 246, 1);
  境界線の半径:縮小100(6);
}

どうですか、レムはそんなに簡単なんですね! ! !

ユーティリティ関数

上記のどちらの方法も選択できます。結局のところ、JavaScript の実行効率は悪くありません!

(関数(doc, win) {
  var resizeEvt =
      ウィンドウ内の「orientationchange」?「orientationchange」:「resize」、
    setRemResponse = 関数() {
      var vM = 750;
      var vfontSize = 16;
      var html = doc.documentElement;
      var newfontSize = (vfontSize * html.clientWidth) / vM;
      html.style.fontSize = 新しいフォントサイズ + "px";
    };
  doc.addEventListener("DOMContentLoaded", setRemResponse, false);
  win.addEventListener(resizeEvt、setRemResponse、false);
})(ドキュメント、ウィンドウ);

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

<<:  Dockerコンテナの中国語言語パックの設定の問題を解決する

>>:  Vue のドロップダウン ボックスのセカンダリ リンク効果を実装するためのサンプル コード

推薦する

非常に便利な CSS 開発ツール 8 つを紹介

CSS3 パターン ギャラリーこの CSS3 パターン ライブラリには、純粋な CSS3 を使用して...

MySQL データベースのインポートとエクスポートのデータ エラーの解決例の説明

データのエクスポートエラーを報告する 「secure_file_priv」のような変数を表示します。...

JavaScript ベースのシンプルなカルーセルの実装

この記事では、シンプルなカルーセルを実装するためのJavaScriptの具体的なコードを参考までに紹...

ネイティブJSは非常に見栄えの良いカウンターを実装します

今日は、ネイティブ JS で実装された見栄えの良いカウンターを紹介します。効果は次のとおりです。 以...

MySQL を使用した分散ロックの実装

導入分散システムでは、分散ロックは最も基本的なツール クラスです。たとえば、支払い機能を備えた 2 ...

前後の秒、分、時間、日数を取得するMySQLデータベース

現在の時刻を取得します: current_timestamp を選択します。出力: 2016-06-...

実行後にdocker nginxにアクセスできない問題の解決策

## 1最近、docker デプロイメントを学習しており、当初は nginx を docker 化す...

MySQL 5.6 から 5.7 にアップグレードする際のマスター スレーブ遅延問題のトラブルシューティング

最近、Zabbix データベースを MySQL 5.6 から 5.7 にアップグレードしたときに、マ...

MySQLで日付を比較する方法の詳細な説明

データ型が datetime であるフィールド add_time を持つテーブル product が...

Web面接でよくある質問:リフローとリペイントの原理と違い

目次ブラウザのレンダリングメカニズムリフローと再塗装リフロー逆流を引き起こす行為:再描画再描画を引き...

要素テーブルの多層ネスト表示の実践

複数の注文を含むリストが必要です。各注文は一意にすることも、複数の注文を結合することもできます。各注...

Centos7 に mysql と mysqlclient をインストールする際に遭遇する落とし穴の概要

1. MySQL Yumリポジトリを追加するMySQL公式サイト>ダウンロード>MySQ...

Linux ベースの MySQL マスター スレーブ構成の全プロセスを記録する

mysql マスタースレーブ構成1. 準備ホスト: 192.168.244.128スレーブ: 192...

1 つの記事で Vuex を理解する

目次概要Vuex の 4 つの主要オブジェクト状態の使用突然変異の使用ゲッターの使用アクションの使用...