国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ ウェブフロントエンド CSSチュートリアル ファームショップ用のショッピング カート プロジェクト

ファームショップ用のショッピング カート プロジェクト

Dec 18, 2024 am 07:27 AM

HTML、CSS、バニラ JavaScript を使用して、フロントエンド ショッピング カート Web アプリの作成が完了しました。私は地元の食料品店で野菜を買うのが大好きなので、Finley's Farm Shop という農(nóng)場ショップのアイデアを基にしました。

プロジェクトをクリックして移動するには、ライブ リンク: https://gabrielrowan.github.io/Finleys-Farm-Shop-FE/

My shopping cart project for a Farm Shop

このアプリを使用すると、次のことができます:

?ショップアイテムをカートに追加
?ショップアイテムの數(shù)量を変更する
?カート內(nèi)のすべてのアイテムをトロリーモーダルで表示します
?カート內(nèi)の全商品の合計金額を確認します
?カート內(nèi)の商品數(shù)を確認します
?ページを更新したりタブを閉じて再度開いた場合でも、すべてのアイテムがカートに殘ったままになります

このプロジェクトの背景

私はこれまで仕事で主にバックエンドアプリケーションに攜わってきました。しかし、この夏、私はフロントエンドの設(shè)計と実裝を含むフルスタック プロジェクトに取り組むことになりました。本當に楽しかったので、フロントエンドのスキルをもっと磨きたいと思いました。

CSS ライブラリを使用せずにこのプロジェクトを?qū)g行することに自分自身に挑戦したいと思いました。CSS ライブラリを使用することが悪いと考えているからではなく、フロントエンドでは Bootstrap のようなものを使用することが一般的だからです。

私はこれまで JavaScript でブラウザーのローカル ストレージを使用したことがなかったので、実際的な方法でそれについて學(xué)ぶにはプロジェクトを作成することが最善の方法であると判斷しました。

プロジェクトに対する私の目標

このプロジェクトを最初に始めたとき、いくつかの目的を念頭に置いていました。これらは次のとおりです:

?応答性 - UI をモバイル、iPad、デスクトップのビューに適応させたいと考えました
? CSS ライブラリを使用せずにショッピング カート モーダルを作成するには
? JavaScript でのローカル ストレージの使用に慣れる

今後の目標

フロントエンドの作成は、このプロジェクトの計畫のパート 1 です。 2 番目の部分は、Django を使用してこれをフルスタック アプリに変換し、ショップ アイテムが HTML にハードコーディングされるのではなくデータベースから取得されるようにすることです。

レスポンシブにする

グリッド

アプリをさまざまな畫面サイズに適応できるようにするために、Kevin Powell のこのビデオのレスポンシブ グリッドのバージョンを使用しました。

の CSS私のプロジェクトのショップアイテムカードを含むものは次のとおりです:
.shop-items {
    display: grid;
    gap: 0.6rem;
    grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
}

魔法は、grid-template-columns 値にあります。それは本質(zhì)的に次のことを意味します:
この親コンテナーには、最小サイズが 12rem、最大サイズが使用可能なスペースの 1 分の 1 の範囲で、できるだけ多くの列を収めます。

このグリッドを使用すると、追加のメディア クエリを記述することなく、広いデスクトップ ビューから狹いモバイル ビューに移行するときに、列の量 (ショップ アイテム カードの量で表される) を 4 から 1 に動的に減らすことができます。

My shopping cart project for a Farm Shop

バナーのフォントサイズ

バナー タイトル「Finley's Farm Shop」では、フォント サイズが自動的に拡大縮小できるように、clamp() を使用しました。これを行わないと、デスクトップでは適切に機能するフォント サイズがモバイルでは大きすぎることがわかりました。

.shop-items {
    display: grid;
    gap: 0.6rem;
    grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
}

これは、フォント サイズが 5vw (ビューポート幅 - 表示される畫面の合計幅の 5%) を目指すことを意味します。

フォント サイズの最小値は 3.8rem であるため、5vw が 3.8rem 未満に相當する場合、フォント サイズは代わりに 3.8rem になります。

フォント サイズの最大値は 5.6rem に設(shè)定されているため、5vw が 5.6rem を超える場合は、フォント サイズは 5.6rem になります。

フォント サイズの最小値と最大値の間の勾配を正確に計算し、それを使用して好みの中間値を選択する方法はありますが、私はインスペクターを使用して目視で判斷しました。

ここでは、代わりに正確なグラデーションを計算するための CSS トリックの記事を紹介します。

モーダルの作成

さまざまな畫面サイズ

トロリーについては、デスクトップの畫面の右側(cè)から表示されるモーダルが必要でした。

My shopping cart project for a Farm Shop

モバイル表示では、全畫面サイズを使用する必要があると判斷しました:

My shopping cart project for a Farm Shop

カート項目のグリッド領(lǐng)域

私の時間のほとんどは、カート項目がカートに追加されたときの CSS に費やされました。グリッド テンプレート エリアを使用して、カート項目のさまざまな部分 (項目タイトル、つまり「Apple」、価格、項目數(shù)量、畫像) が、計畫した割り當てスペースを占めるようにしました。

My shopping cart project for a Farm Shop

.banner-title {
    font-size: clamp(3.8rem, 5vw, 5.6rem);
}

JavaScript

モーダル JavaScript の場合、次のことを目指していました:

  • カートアイコンをクリックしたときにモーダルを非表示にします
  • 閉じるアイコンをクリックするとモーダルを閉じます
  • モーダルが開いているときにショップアイテムのメインページを下にスクロールできないように、ページスクロールを無効にします

これを?qū)g現(xiàn)するために、関數(shù) toggleModal を呼び出すイベント リスナーを両方のアイコンに追加しました。これにより、.active というクラスがモーダル要素にまだ追加されていない場合は追加され、すでに存在する場合は削除されます。

CSS で、モーダルがデフォルトで非表示になるように設(shè)定し、.active クラスがモーダルを表示するように設(shè)定しました。

CSS の設(shè)定:

.shop-items {
    display: grid;
    gap: 0.6rem;
    grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
}

クラスを切り替えてモーダルを表示/非表示にします。

.banner-title {
    font-size: clamp(3.8rem, 5vw, 5.6rem);
}

これは、閉じるアイコンとカート アイコンのイベント リスナーが同じ機能を再利用できることを意味します。モーダルがまだ表示されていない場合は表示し、すでに開いている場合は非表示にするためです。

ローカルストレージの使用

ローカル ストレージについては、Web Dev Simplified のこのビデオ「JavaScript Cookies vs. Local Storage vs. Session Storage」が特に役に立ちます。データを保存するこれら 3 つの方法の違い、開発ツールの [アプリケーション] タブでデータを表示する方法、および各データ ストレージ タイプの項目を追加および削除する方法について説明します。

カートに 2 つのアイテムを追加した後のプロジェクトの [アプリケーション] タブは次のようになります:

My shopping cart project for a Farm Shop

関心の分離

DOM の変更 (要素の追加、要素の削除、要素の編集) に関連する機能を、ローカル ストレージに関連する機能から分離することにしました。たとえば、removeCartItemFromLocalStorage 関數(shù)があります。これは、缶に書かれていることを?qū)g行しますが、モーダルからショップ アイテムの HTML を削除する RemoveCartItemFromModalDOM とは異なります。

.cart-item {
    display: grid;
    grid-template-areas: "image description description"
        "image price quantity";
    grid-template-columns: min-content 1fr 1fr;
    grid-template-rows: 2.5rem 3.5rem;
}

これらは両方とも、ショップアイテムがカートから削除されたときに呼び出す必要があります。これらを別個の関數(shù)として持つことで、プロセスの必要な部分を両方とも完了したことを確認するのに役立ちました。 DOM から HTML を削除しないと、Web ページには商品がカートから削除されたことが視覚的に反映されません。ローカル ストレージから項目を削除しないと、ページが更新されたとき、またはタブが閉じられたときに変更を保持できなくなります。

問題に遭遇する

JavaScript でローカル ストレージ関數(shù)に取り組んでいたときに、非常に困惑する問題に遭遇しました。これまでに行った手順は次のとおりです:

  • 最初のページ読み込み時にローカル ストレージを空の配列に設(shè)定します
  • ショップアイテムの「追加」ボタンをクリックすると、次の関數(shù)が呼び出されます。
    • アイテムがローカル ストレージに追加されました
    • カート項目の HTML がトロリーモーダルに追加されます
  • ローカル ストレージ配列內(nèi)の各製品の數(shù)量 * 価格として合計価格を取得します
  • 価格要素の innerText をローカル ストレージから取得した価格に設(shè)定します

いくつかクリックしてみましたが、見た目も素晴らしかったです。 ...ページを更新するまでは。その後、価格は以前と同じ合計に設(shè)定されましたが、DOM は最初のページ読み込み時の狀態(tài)に完全に戻りました。視覚的には、カートには商品が入っていないように見えましたが (數(shù)量入力コントロールの代わりに追加ボタンが表示されました)、合計金額は £0 を超えていました。

カートに追加された商品と追加されていない商品の違い

My shopping cart project for a Farm Shop

これは私を本當に混亂させ、理解するまでに時間がかかりました。結(jié)局、分かりました。はい、アイテムをローカル ストレージに追加していました。しかし、ページがリロードされて DOMContentLoaded イベント リスナーが起動されたとき、ローカル ストレージの內(nèi)容に基づいて DOM をレンダリングしていませんでした。実際、この段階ではローカルストレージに何があるか全くチェックしていませんでした。

これに気づいた後、ローカル ストレージ內(nèi)の製品配列內(nèi)のすべての製品をループし、各製品の ID を見つけて、関連する製品の HTML 要素を更新して、追加されたものを表示する DOMContentLoaded で呼び出される関數(shù)を作成しました。カートへ。

関數(shù)の短縮版は次のとおりです:

constloadCartState = () =>
{
    const cart = JSON.parse(localStorage.getItem("cart"));
    場合 (!カート)
    {
        カート = [];
        localStorage.setItem("カート", JSON.stringify(カート));
    }

    カート.forEach(製品=>
    {
         const shopItem = document.querySelector(`.shop-item[data- 
        >



<h2>
  
  
  導(dǎo)入
</h2>

<p>このアプリは Github Pages を使用してデプロイしました。これまでデプロイメントに使用したことはありませんでしたが、プロセスは非常に簡単であることがわかりました。私が遭遇した唯一の問題は、最初は畫像がまったく表示されなかったことです。これは大文字と小文字の區(qū)別が原因であることがわかりました。私の畫像フォルダーは Img という名前ですが、HTML 內(nèi)の畫像パスは img/ でした。この問題が修正され、キャッシュがクリアされた後、Web サイトは期待どおりに表示されました。 </p>

<h2>
  
  
  結(jié)論
</h2>

<p>このプロジェクトから、特に CSS グリッドと JavaScript でのローカル ストレージの使用について多くのことを?qū)Wびました。さらにページを追加して、完全なフロントエンド e コマース アプリにしたいという誘惑に駆られましたが、今は MVP のままにし、Django アプリにしてフックする次の段階に集中できるようにすることにしました。データベースまで?</p>


          

以上がファームショップ用のショッピング カート プロジェクトの詳細內(nèi)容です。詳細については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當する法的責(zé)任を負いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中國語版

SublimeText3 中國語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

「レンダリングブロッキングCSS」とは何ですか? 「レンダリングブロッキングCSS」とは何ですか? Jun 24, 2025 am 12:42 AM

ブラウザは、特にインポートされたスタイルシート、ヘッダーのインラインCSS、および最適化されていないメディアクエリスタイルを使用して、ブラウザがインラインおよび外部CSSをデフォルトで主要なリソースとして表示するため、ページレンダリングをブロックします。 1.重要なCSSを抽出し、HTMLに埋め込みます。 2。JavaScriptを介して非クリティカルなCSSの読み込みを遅らせる。 3.メディア屬性を使用して、印刷スタイルなどのロードを最適化します。 4.リクエストを減らすためにCSSを圧縮およびマージします。ツールを使用してキーCSSを抽出し、REL = "Preload"非同期負荷を組み合わせ、過度の分割と複雑なスクリプト制御を避けるためにメディア遅延荷重を合理的に使用することをお勧めします。

外部対內(nèi)部CSS:最良のアプローチは何ですか? 外部対內(nèi)部CSS:最良のアプローチは何ですか? Jun 20, 2025 am 12:45 AM

TheBestAppRoachforCSDependsonTheProject'sSpecificNeeds.forLargerProjects、externalCssissisbetterduetoMaintainasiladability; forsmallerProjectsOrsingLe-PageApplications、internalcsSmightBemoresuitable.it

私のCSSは小文字でなければなりませんか? 私のCSSは小文字でなければなりませんか? Jun 19, 2025 am 12:29 AM

いいえ、CSSDOESNOTHAVETOBEINLOWERCASE。

CSSケース感度:重要なことを理解する CSSケース感度:重要なことを理解する Jun 20, 2025 am 12:09 AM

cssismostlycase-inssensitive、buturlsandfontfamilynamesarecase-sensitive.1)propertiesandvalueslikecolor:red; areotcase-sensitive.2)urlsmustmatchtheserver'scase、例えば、/畫像/logo.png.3)

Autoprefixerとは何ですか?それはどのように機能しますか? Autoprefixerとは何ですか?それはどのように機能しますか? Jul 02, 2025 am 01:15 AM

Autoprefixerは、ターゲットブラウザスコープに基づいてCSS屬性にベンダープレフィックスを自動的に追加するツールです。 1.エラーで接頭辭を手動で維持する問題を解決します。 2. PostCSSプラグインフォーム、CSSを解析し、プレフィックスする必要がある屬性を分析し、構(gòu)成に従ってコードを生成する屬性を分析します。 3.使用手順には、プラグインのインストール、ブラウザーリストの設(shè)定、ビルドプロセスでそれらを有効にすることが含まれます。 4。メモには、接頭辭を手動で追加しない、構(gòu)成の更新を保持すること、すべての屬性ではなくプレフィックスを維持することが含まれ、プリ??プロセッサでそれらを使用することをお勧めします。

CSSカウンターとは何ですか? CSSカウンターとは何ですか? Jun 19, 2025 am 12:34 AM

csScountersCantAnationally-bersectionSandLists.1)usecounter-resettoinitialize、counter-incrementtoincrease、andcounter()orcounters()todisplayvalues.2)を組み合わせたjavascriptfordynamiccontenttoensureaCurateupdatesと組み合わせます。

CSS:ケースはいつ重要ですか(いつそうではありませんか)? CSS:ケースはいつ重要ですか(いつそうではありませんか)? Jun 19, 2025 am 12:27 AM

CSSでは、セレクターと屬性名はケースに敏感ですが、値、名前の色、URL、およびカスタム屬性はケースに敏感です。 1.バックグラウンドカラーや背景色など、セレクターと屬性名はケース非感受性です。 2。値の16進數(shù)色は大文字と小文字を區(qū)別しますが、赤と赤などの名前の色は無効です。 3. URLは癥例に敏感であり、ファイルロードの問題を引き起こす可能性があります。 4.カスタムプロパティ(変數(shù))はケースに敏感であり、使用する場合はケースの一貫性に注意を払う必要があります。

conic-gradient()関數(shù)とは何ですか? conic-gradient()関數(shù)とは何ですか? Jul 01, 2025 am 01:16 AM

TheConic-Gradient()functionsscreateScular勾配の勾配は、測定されていることを確認してください

See all articles