前回、私たちは 2 つのヘッダー レイアウト (フレックスボックス 1 つとフロート 1 つ) を考え出しました。最終的には、再構築を行っている同僚とコミュニケーションをとった結果、フロート レイアウトを選択しました。 実際、レイアウトの選択には私の注意は必要ありません。私の参加やいくつかの意見は主に自己改善ですが、HTML 構造が CSS によって完全に制御されるとは限りません。 ヘッダーコンポーネントのコーディングプロセスでは、いくつかの問題についてリファクタリングの同僚と議論や論争を繰り返しました。今日は、ヘッダーコンポーネントのレイアウトと機能の実装、および js と css の連携についてお話しします。 ヘッダーコンポーネント自体は古いコンポーネントです。このような古いコンポーネントを改修する方法について説明します。 初期構造最初にリファクタリングした同僚が、既製のページを提供してくれました。 私たちはこれらの小さな経験のいくつかについて話し合い、デザイン チームに伝えました。彼らは変更を加え、作業はスムーズに進みました。その後、私は楽しくコーディングを始めました。これは HTML ブロックの 1 つの構造です。 <header class="cm-header" style="top: 50px;"> <span class="fl cm-header-icon icon-back"></span> <span class="fr cm-header-btn">確認</span> <span class="fr cm-header-icon"><i class="icon-home"></i></span> <span class="fr cm-header-icon"><i class="icond-list"></i></span> <h1 class="cm-page-title"> ページタイトル</h1> </ヘッダー> h1 タグ内のテキストは非常に複雑になる可能性があるため、これについては後で説明します。ボタンには次の機能があります。 ① 2段目:戻るボタン
③ 4行目:ホームタグ 上記は HTML の実装ですが、プログラマーにとってはヘッダーにはボタン (btn) の他にアイコンしかないため、上記の構造は一般に JS では受け入れられません。 Jserに必要な構造リファクタリングの同僚と話し合った結果、理由は次のようになりました。 ①フォールバックが特殊なので追加スタイルがあるのですが、それが何なのか覚えていません。 当時、両者の間で議論はかなり激しかったのですが、リファクタリングの同僚がすべての icond を icon に変更することに反対したため、計画は中止されました。議論を重ねた結果、構造は次のようになりました。 <header class="cm-header" style="top: 50px;"> <span class="fl cm-header-icon"><i class="icon-back"></i></span> <span class="fr cm-header-btn">確認</span> <span class="fr cm-header-icon"><i class="icon-home"></i></span> <span class="fr cm-header-icon"><i class="icond-list"></i></span> <h1 class="cm-page-title"> ページタイトル</h1> </ヘッダー> 戻るボタンの構造を他のアイコン型ボタンと統一するために少し変更を加え、楽しくコーディングを始めました。 PS: icond タグと icon type タグはヘッダーにさまざまな程度で表示され、制御できないことに注意してください。 構造上の問題会社のヘッダーは常に存在していたため、プロセス中に 2 つの側面を考慮する必要がありました。 ①拡張性は高いがインターフェースの互換性が必要 つまり、各タグの名前は固定されており、一部のタグのコールバックも制限されています。私のデータ構造は次のとおりです。 { 左: []、 中心: []、 右: [ { 'タグ名': 'ホーム'、コールバック: 関数 () { コンソールにログ出力します。 } }, { 'タグ名': '検索' }, { 'タグ名': 'リスト'、コールバック: 関数 (e) { //....... } }, { 'タグ名': '電話番号', '番号': '56973144' }, { 'タグ名': 'コミット'、'値': 'ログイン'、コールバック: 関数 () { console.log('ログイン'); } }, { 'タグ名': 'カスタム', '値': 'カスタマイズ', アイテム関数: 関数() { '<span class="cm-header-btn fr js_custom">カスタマイズ</span>' を返します。 }, コールバック: 関数 () { console.log('カスタマイズ'); } } ご覧のとおり、タグ名ごとにボタンが1つありますが、ここで問題が発生します。タグ名がアイコンであるべきなのか、それともアイコンであるべきなのかがわかりません。 ただし、値フィールドが存在するかどうかに基づいて、i サブタグが必要かどうかを判断できます。この問題をどのように解決すればよいでしょうか? タグ名とクラス名の間にマッピング関係を確立します。例: varマップ = { 'ホーム': 'アイコン', 'リスト': 'アイコン' } もちろん、このアプローチは当然非常に不快です。小さなアイコンをアイコンとして統一すれば、テンプレート内のコードを次のように統一できます。 <span class="cm-header-icon <%=dir %> js_<%=item.tagname %>" > <% if(item.value) { %> <%=アイテム値 %> <% } それ以外の場合は { %> <i class="icon-<%=item.tagname %>"></i> <% } %> </span> しかし、マッピング関係を追加したため、コードが醜くなり、ビジネス ロジックが複雑になりました。そこで、これらの点を考慮して、再度リファクタリングの同僚を探しました。リファクタリングの同僚も非常に賢明で、すぐに変更に同意しました。 <header class="cm-header" style="top: 50px;"> <span class="fl cm-header-icon"><i class="icon-back"></i></span> <span class="fr cm-header-btn">確認</span> <span class="fr cm-header-icon"><i class="icon-home"></i></span> <span class="fr cm-header-icon"><i class="icon-list"></i></span> <h1 class="cm-page-title"> ページタイトル</h1> </ヘッダー> h1 のスタイルを考慮せずに、上記のコードを取得するのは非常に簡単です。 ! ! <ヘッダークラス="cm-header"> <% var i = 0、len = 0、j = 0、keyagain = 0; var 左 = 左; var right = right.reverse(); var アイテム = null; var ディレクトリ; var btnObj = null; %> <%for(キー再入力=0; キー再入力 < 2; キー再入力++) { %> <% if(keyagain == 0) { dir = 'fl'; btnObj = left; } else { dir = 'fr'; btnObj = right; } %> <% for(i = 0, len = btnObj.length; i < len; i++) { %> <% item = btnObj[i]; %> <%if(typeof item.itemFn == '関数') { %> <%=item.itemFn() %> <%} それ以外の場合は { %> <span class="cm-header-icon <%=dir %> js_<%=item.tagname %>" > <% if(item.value) { %> <%=アイテム値 %> <% } それ以外の場合は { %> <i class="icon-<%=item.tagname %>"></i> <% } %> </span> <%} %> <%} %> <%} %> </ヘッダー> PS: コードの色分けから、js で使用されている left と right は処理する必要があるキーワードです... カスタマイズされた要件ご覧のとおり、1 つのループで左側と右側のボタンを簡単に生成できますが、すぐに問題が発生します。拡張する必要がある場合はどうなるでしょうか。次のような問題が発生します。 ① デフォルトのtelタグはaタグですが、ここではspanタグです
② 戻るボタンは通常、ハイブリッドのJavaScriptエラーによる誤死の問題を解決するためにaタグにされます 率直に言えば、ラベル ボタンは統一された構造を持つ必要がありますが、カスタマイズできる機能も保持する必要があります。 handleSpecialParam: 関数 (データ) { var k、i、len、item; (データ内のk)の場合{ _.isArray(data[k]) の場合 { (i = 0, len = data[k].length; i < len; i++) { 項目 = データ[k][i]; if (this['customtHandle_' + item.tagname]) { this['customtHandle_' + item.tagname](data[k][i], k); } //もし } //のために } //もし } //のために }, _getDir: 関数 (dir) { var kv = { 左: 'fl'、右: 'fr' }; kv[dir]を返します。 }, //戻るボタンのロジックを処理する customtHandle_back: function (item, dir) { dir = this._getDir(dir); アイテム.itemFn = 関数 () { var str = '<a href="http://m.ctrip.com/html5/" class="cm-header-btn ' + dir + ' js_' + item.tagname + ' " >'; if (item.value) { str += 項目.値 + '</a>'; } それ以外 { str += '<i class="icon-' + item.tagname + '"></i></a>'; } str を返します。 }; }, ボタンがニーズを満たしていない、またはカスタマイズされた要件がある場合、そのボタンの itemFn を設定する方法を見つけることができます。この時点で、このコードは初期化された json 文字列に直接書き込むことができます。 さまざまなタイトルタイトルに関しては、そのパフォーマンスがさまざまであることがわかります。現時点では、さまざまなタイプに応じてさまざまな HTML 構造が生成されます。フレームワークにはいくつかのデフォルト オプションが用意されています。サポートされていない場合は、itemFn を自分でカスタマイズできます。 <% アイテム = 中央; %> <%if(typeof item.itemFn == '関数') { %> <%=item.itemFn() %> <%} そうでない場合、item.tagname=='タイトル' || item.tagname=='サブタイトル') { %> <h1 class="cm-page-title js_<%=item.tagname %>" > <%if(typeof(item.value) == 'object' && item.title.value == 2) { %> <span class="cm-title-l"><%=item.value[0]%></span> <span class="cm-title-s"><%=item.value[1]%></span> <%} それ以外の場合は { %> <%=アイテム値 %> <%} %> </h1> <%} そうでない場合、item.tagname=='select'){ %> <h1 class="cm-page-select-title js_<%=item.tagname %>" > <%=アイテム値 %> </h1> <%} そうでない場合、item.tagname=='tabs') { %> <h1 class="cm-page-tabs-title js_<%=item.tagname %>" > <%for(j = 0; j < item.data.items.length; j ++) { %> <span data-key="<%=item.data.items[j].id %>" class="<%if(item.data.index===j){ %>アクティブ<%} %>" ><%=item.data.items[j].name %></span> <% } %> </h1> <% } それ以外の場合{ %> <%} %> イベントバインディングの実装ヘッダーコンポーネント自体はAbstract.Viewクラスを継承しているので、 this.events = {} イベントはイベント プロキシとしてルート要素にバインドすることができ、ヘッダーのイベントは通常クリック イベントです。 setEventsParam: 関数() { var item, data = this.datamodel.left.concat(this.datamodel.right).concat(this.datamodel.center); (var i = 0, len = data.length; i < len; i++) { 項目 = データ[i]; if (_.isFunction(item.callback)) { this.events['click .js_' + item.tagname] = $.proxy(item.callback, this.viewScope); } } }, ここで注意すべき点は、イベント バインディング フックが一意のタグ名であることです。イベント バインディングを容易にするために、タグごとに「.js_tagname」クラスを動的に生成します。 古いインターフェースとの互換性前述の通り、このコンポーネントは古いコンポーネントを改修したものなので、すでにさまざまなビジネスチームで使用されています。たとえば、元々は次のように呼ばれていました。 this.header.set({ タイトル: 「基本的なヘッダーの使用法」 サブタイトル:「中間サブタイトル」、 戻る: 真、 バックテキスト: 'キャンセル'、 電話: { 番号: 1111 }, ホーム: 本当、 検索: 真、 btn: { title: "ログイン"、id: 'confirmBtn'、classname: 'header_r' }, イベント: { 戻りハンドラ: 関数 () { コンソールにログを出力します。 }, ホームハンドラ: 関数(e) { } } }); ここで、呼び出しメソッドは次のようになると予想されます。 this.header.set({ 左: []、 中心: {}、 右: [ { タグ名: 'home'、コールバック: function () { } }、 { タグ名: 'タグ名'、値: '値'、データ: {}、itemFn: function(){}、コールバック: function () { } } ] }); こういう時、私たちは何をすべきでしょうか?もちろん、破壊なしには建設はありません。最初に破壊があり、次に建設があり、もちろんビジネス チームが変更を加える必要があります。 ! !すると容赦なく批判されたので、インターフェースを互換性のあるものにした HTML5+CSS3 ヘッダー作成例とアップデートに関するこの記事はこれで終わりです。より関連性の高いヘッダー例コンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 |
<<: dockerを使用してGrafana+Prometheus構成をデプロイする
>>: Webフロントエンド開発エンジニアが習得すべきコアスキル
共同インデックスこの記事におけるジョイントインデックスの定義は次のとおりです (MySQL): AL...
<!doctypehtml> <html xmlns="http://...
これまで使用していたイメージはすべて DockerHub パブリック リポジトリから取得していました...
Windows 7 で MySQL 5.7.17 をインストールする方法についてのグラフィック チ...
序文: Integer は MySQL で最もよく使用されるフィールド型の 1 つで、通常は整数を格...
皆様の参考と操作を容易にするために、様々な主要ウェブサイトを検索し、関連するスケジュールされたタスク...
目次1. 双方向データバインディングとは1. データの双方向バインディングを実装する必要があるのはな...
目次1. 通常どのようなコンテンツを処理する必要があるか2. 基本的な考え方3. 具体的な実践の詳細...
最近、顔コレクションに関するプロジェクトに取り組んでいましたが、フロントエンドモジュールを書いている...
この記事ではMySQL 8.0.24バージョンのインストールと設定方法を記録し、皆さんと共有しますM...
idea を使用して JSP ファイルを書き込む前に、jdk 環境 (ここでは説明しません) と対応...
<br />私の仕事で使用しているアノテーションの書き方の基準をまとめました。技術的な内...
最近のプロジェクトでは、ポイントを集める効果を作成する必要があります。 ボスの説明によると、この効果...
目次配列の紹介配列リテラル2次元配列要約する配列の紹介配列- Arrayもオブジェクトですこれは通常...
目次概要遅延読み込みとは何ですか?最適化を開始するビジネスモジュールを分割する遅延読み込みルート構成...