ホームページ ウェブフロントエンド jsチュートリアル モバイルページ開発適応レムレイアウト原則

モバイルページ開発適応レムレイアウト原則

Nov 21, 2016 pm 05:41 PM

モバイルページ開発におけるレムレイアウトの適応原則

適応とは何ですか?なぜ適応する必要があるのですか?

私たちが入手する設計図は一般的に640、750、1080の解像度に基づいて設計されており、現在モバイル端末にはさまざまな解像度があります。さまざまなスタイル、さまざまな解像度、さまざまな論理ピクセル、さまざまなビューポートがあるため、すべてのデバイスでページを適切に表示するには、これらのデバイスに合わせて統一された処理を行う必要があります。これをモバイル エンド アダプテーションと呼びます。

知っておくべきいくつかの概念:

物理ピクセル

物理ピクセルは、ディスプレイ (携帯電話の画面) 上の最小の物理表示単位であり、私たちが通常話している解像度として理解できます。

デバイスに依存しないピクセル (密度に依存しないピクセル)

デバイスに依存しないピクセル (密度に依存しないピクセルとも呼ばれます) は、コンピューター座標系の点として考えることができます。この点は、コンピュータで使用できる仮想ピクセルを表します。プログラム (例: CSS ピクセル) は、関連するシステムによって物理ピクセルに変換されます。これは、私たちが話しているビジュアル ビューポートのサイズとして理解できます

したがって、物理ピクセルと物理ピクセルの間には、一定の対応関係があります。デバイスに依存しないピクセル、これが次に起こることです。デバイスのピクセル比について話しましょう。

デバイス ピクセル比 (デバイス ピクセル比)

デバイス ピクセル比 (略して dpr) は、物理ピクセルとデバイス非依存ピクセルの対応を定義します。その値は、次の式に従って取得できます: デバイス ピクセル比 = 物理ピクセル / デバイス。独立したピクセル // 特定の方向、つまり x 方向または y 方向

デバイスのピクセル比も、JavaScript では window.devicePixelRatio を通じて取得できます。

ビューポート

PC ビューポートは、ツールバーとスクロール バーを除く、ブラウザ ウィンドウ内のコンテンツ領域を指します。

モバイル ブラウザのビューポートは、いくつかの状況に分けられます:

は、レイアウト ビューポートと呼ばれ、最大値はブラウザの製造元によって指定され、その幅を取得します。 .

私たちが見るブラウザウィンドウとWebページ領域のサイズはビジュアルビューポートと呼ばれ、CSSピクセル(デバイス論理ピクセル)で表されます

rem

remはcss3の一部です。長さの単位は、ドキュメントと要素 html; たとえば、set html font-size=100px; その後に続くすべての要素は、このベースライン値を使用してサイズを設定できます:

Adapt からの固定の高さ、幅、 em)

rem レイアウトを使用する

以下は、淘宝網のホームページで rem を使用する NetEase の計画の概要です

NetEase のアプローチ:

1) レイアウトの適応性をスケーリングなしのビジュアル ビューポート、つまり理想的なビューポートに設定します。 。

<meta name="viewport"content="initial-scale=1,maximum-scale=1, minimum-scale=1”>
ログイン後にコピー

2) デザインドラフトの解像度に基づいて、フォントサイズの基準として 100px を取ると、デザインドラフトの幅が 640 の場合、body 要素の幅は width: 6.4rem ( 640/100) レイアウト ビューポートを 320 に設定すると、html font-size=deviceWidth / 6.4 になります。

3) document.documentElement.clientWidth を通じて deviceWidth を取得します。

4) ページの dom が準備できたら、HTML フォント サイズを設定します。

document.documentElement.style.fontSize =document.documentElement.clientWidth / 6.4 + ‘px’
ログイン後にコピー

5) フォント サイズには、rem を使用できません。エラーが大きすぎます。

640 のデザイン案を例に挙げると、HTML の font-size を設定する最終的なコードは次のとおりです。レイアウトするときは、デザイン案に記載されているサイズを rem の値で割ります。 simple

var deviceWidth = document.documentElement.clientWidth;
if(deviceWidth > 640) deviceWidth = 640;
document.documentElement.style.fontSize = deviceWidth / 6.4 + &#39;px&#39;;
ログイン後にコピー

ここで (deviceWidth > 640) deviceWidth = 640; は、deviceWidth が 640 より大きい場合、物理解像度が既に 1280 より大きいためです (dpr に応じて)、PC の Web サイトにアクセスする必要があります

淘宝的做法:

原理

1) 通过dpr设置缩放比,实现布局视口大小,

var scale = 1 / devicePixelRatio;  
 document.querySelector(&#39;meta[name="viewport"]&#39;).setAttribute(&#39;content&#39;,&#39;initial-scale=&#39;+ scale + &#39;, maximum-scale=&#39; + scale + &#39;, minimum-scale=&#39; + scale + &#39;, user-scalable=no&#39;);
ログイン後にコピー

2) 动态计算html的font-size

document.documentElement.style.fontSize = document.documentElement.clientWidth / 10 + ‘px’;
ログイン後にコピー

这里的意思是,clientWidth / 10 得到是布局视口下的rem基准值(以iphone6为例 1rem=75px),那么设计稿正好也是 750,所以对应的关系 clientWidth / 10==设计稿的尺寸/x, 那么x=设计稿的尺寸/rem基准值。如果是iphone6 plus rem基准值等于clientWidth / 10 等于124.2,那么x=750/124.2。

关于具体的实现 淘宝提供了一个开源的方案lib-flexible:https://github.com/amfe/lib-flexible

具体逻辑 :

1)判断head中是否设置了viewport,如果有设置,按照已有viewport 设置缩放比;

if (metaEl) {
        console.warn(&#39;将根据已有的meta标签来设置缩放比例&#39;);
        var match = metaEl.getAttribute(&#39;content&#39;).match(/initial\-scale=([\d\.]+)/);
        if (match) {
            scale = parseFloat(match[1]);
            dpr = parseInt(1 / scale);
        }
    }
ログイン後にコピー

2)如果没有设置meta viewport,判断是否设置dpr,如果有,通过dpr计算缩放scale。

        var content = flexibleEl.getAttribute(&#39;content&#39;);
        if (content) {
            var initialDpr = content.match(/initial\-dpr=([\d\.]+)/);
            var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/);//maximum 设置最大值,与initial的值比较,取最小值;
            if (initialDpr) {
                dpr = parseFloat(initialDpr[1]);
                scale = parseFloat((1 / dpr).toFixed(2));    
            }
            if (maximumDpr) {
                dpr = parseFloat(maximumDpr[1]);
                scale = parseFloat((1 / dpr).toFixed(2));    
            }
        }
ログイン後にコピー

3)如果 dpr &scale都没有设置,那么就通过设备的dpr设置起缩放 scale,

if (!dpr && !scale) {//meta[name="viewport"]&&meta[name="flexible"]都不存在。
    var isAndroid = win.navigator.appVersion.match(/android/gi);
    var isIPhone = win.navigator.appVersion.match(/iphone/gi);
    var devicePixelRatio = win.devicePixelRatio;
    if (isIPhone) {
        // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
        if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {                
            dpr = 3;
        } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){
            dpr = 2;
        } else {
            dpr = 1;
        }
    } else {
        // 其他设备下,仍旧使用1倍的方案
        dpr = 1;
    }
    scale = 1 / dpr;
}
ログイン後にコピー

4)得到scale之后 ,如果meta 的viewport不存在,那么就创建一meta[name=“viewport”],将scale配置进去。

    metaEl = doc.createElement(&#39;meta&#39;);
    metaEl.setAttribute(&#39;name&#39;, &#39;viewport&#39;);
    metaEl.setAttribute(&#39;content&#39;, &#39;initial-scale=&#39; + scale + &#39;, maximum-scale=&#39; + scale + &#39;, minimum-scale=&#39; + scale + &#39;, user-scalable=no&#39;);

    if (docEl.firstElementChild) {

        docEl.firstElementChild.appendChild(metaEl);
         
    }
ログイン後にコピー

5)动态改写html的font-size

    var width = docEl.getBoundingClientRect().width;//获取html的宽度
    if (width / dpr > 540) {//判断屏幕逻辑像素大于540时,取540
        width = 540 * dpr;
    }
    var rem = width / 10;
    docEl.style.fontSize = rem + &#39;px&#39;;
    flexible.rem = win.rem = rem;
ログイン後にコピー

总结:

使用rem布局,实质都是通过动态改写html的font-size基准值,来实现不同设备下的良好统一适配;

网易与淘宝不同 的地方是 ,网易将布局视口设置成了 视觉视口,淘宝将布局视口设置成了物理像素大小,通过 scale缩放嵌入了 视觉视口中;

容器元素的字体大小都不使用rem,需要额外的media查询;


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? Apr 04, 2025 pm 05:09 PM

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

javascriptの分解:それが何をするのか、なぜそれが重要なのか javascriptの分解:それが何をするのか、なぜそれが重要なのか Apr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Apr 04, 2025 pm 05:12 PM

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

初心者向けのタイプスクリプト、パート2:基本データ型 初心者向けのタイプスクリプト、パート2:基本データ型 Mar 19, 2025 am 09:10 AM

エントリーレベルのタイプスクリプトチュートリアルをマスターしたら、TypeScriptをサポートするIDEで独自のコードを作成し、JavaScriptにコンパイルできるはずです。このチュートリアルは、TypeScriptのさまざまなデータ型に飛び込みます。 JavaScriptには、NULL、未定義、ブール値、数字、文字列、シンボル(ES6によって導入)とオブジェクトの7つのデータ型があります。 TypeScriptはこれに基づいてより多くのタイプを定義し、このチュートリアルではすべてを詳細に説明します。 ヌルデータ型 JavaScriptのように、Typescriptのnull

Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は?
または:
Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は? または: Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Apr 04, 2025 pm 05:36 PM

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

PowerPointはJavaScriptを実行できますか? PowerPointはJavaScriptを実行できますか? Apr 01, 2025 pm 05:17 PM

JavaScriptはPowerPointで実行でき、外部JavaScriptファイルを呼び出したり、VBAを介してHTMLファイルを埋め込んだりすることで実装できます。 1. VBAを使用してJavaScriptファイルを呼び出すには、マクロを有効にし、VBAプログラミングの知識を持つ必要があります。 2。JavaScriptを含むHTMLファイルを埋め込みます。これは、シンプルで使いやすいが、セキュリティ制限の対象となります。利点には、拡張機能と柔軟性が含まれますが、欠点にはセキュリティ、互換性、複雑さが含まれます。実際には、セキュリティ、互換性、パフォーマンス、ユーザーエクスペリエンスに注意を払う必要があります。

See all articles