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

首頁 web前端 css教程 我的農(nóng)場(chǎng)商店購(gòu)物車項(xiàng)目

我的農(nóng)場(chǎng)商店購(gòu)物車項(xiàng)目

Dec 18, 2024 am 07:27 AM

我剛剛使用 HTML、CSS 和 vanilla JavaScript 創(chuàng)建了一個(gè)前端購(gòu)物車 Web 應(yīng)用程序。因?yàn)槲蚁矚g在當(dāng)?shù)氐碾s貨店購(gòu)買蔬菜,所以我的想法是基于一家名為芬利農(nóng)場(chǎng)商店的農(nóng)場(chǎng)商店的想法。

要點(diǎn)擊該項(xiàng)目,實(shí)時(shí)鏈接是:https://gabrielrowan.github.io/Finleys-Farm-Shop-FE/

My shopping cart project for a Farm Shop

使用此應(yīng)用程序,您可以:

?將商店商品添加到購(gòu)物車
?更改商店商品的數(shù)量
?在手推車模式上查看購(gòu)物車中的所有商品
?查看購(gòu)物車中所有商品的總價(jià)
?查看購(gòu)物車中的商品數(shù)量
?即使您刷新頁面或關(guān)閉選項(xiàng)卡然后重新打開它,仍將所有商品保留在購(gòu)物車中

該項(xiàng)目的背景

到目前為止,我在工作中主要從事后端應(yīng)用程序的工作。不過,今年夏天,我開始從事一個(gè)全棧項(xiàng)目,包括設(shè)計(jì)和實(shí)現(xiàn)前端。我真的很喜歡它,它讓我想更多地發(fā)展我的前端技能。

我想挑戰(zhàn)自己在不使用 CSS 庫(kù)的情況下完成這個(gè)項(xiàng)目,不是因?yàn)槲艺J(rèn)為使用它們不好,而是因?yàn)橄?Bootstrap 這樣的東西通常是我前端的首選。

我之前從未在 JavaScript 中使用過瀏覽器本地存儲(chǔ),因此我決定創(chuàng)建一個(gè)項(xiàng)目將是我實(shí)際了解它的最佳方式。

我的項(xiàng)目目標(biāo)

當(dāng)我第一次開始這個(gè)項(xiàng)目時(shí),我心中有幾個(gè)目標(biāo)。這些是:

?響應(yīng)能力 - 我希望 UI 能夠適應(yīng)移動(dòng)設(shè)備、ipad 和桌面視圖
?不使用 CSS 庫(kù)創(chuàng)建購(gòu)物車模式
?熟悉在 JavaScript 中使用本地存儲(chǔ)

未來目標(biāo)

創(chuàng)建前端是我這個(gè)項(xiàng)目計(jì)劃的第 1 部分。第二部分是使用 Django 將其轉(zhuǎn)換為全棧應(yīng)用程序,以便商店商品來自數(shù)據(jù)庫(kù),而不是硬編碼在 HTML 中。

使其響應(yīng)式

網(wǎng)格

為了使應(yīng)用程序適應(yīng)不同的屏幕尺寸,我使用了 Kevin Powell 視頻中的響應(yīng)式網(wǎng)格版本。

的 CSS包含我項(xiàng)目中的商店物品卡的是:
.shop-items {
    display: grid;
    gap: 0.6rem;
    grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
}

神奇之處在于 grid-template-columns 值。它的本質(zhì)意思是:
在此父容器中容納盡可能多的列,最小尺寸為 12rem,最大尺寸為可用空間的 1 分之一。

使用此網(wǎng)格,當(dāng)從更寬的桌面視圖到更窄的移動(dòng)視圖時(shí),列數(shù)(以商店商品卡的數(shù)量表示)可以動(dòng)態(tài)地從 4 減少到 1,而無需編寫額外的媒體查詢。

My shopping cart project for a Farm Shop

橫幅字體大小

對(duì)于橫幅標(biāo)題“Finley's Farm Shop”,我使用了clamp(),以便字體大小能夠自動(dòng)縮放。如果不這樣做,我發(fā)現(xiàn)適用于桌面的字體大小對(duì)于移動(dòng)設(shè)備來說太大了。

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

這意味著字體大小的目標(biāo)是 5vw(視口寬度 - 又稱為總可見屏幕寬度的 5%)。

字體大小的最小值為 3.8rem,因此如果 5vw 等于小于 3.8rem,則字體大小將為 3.8rem。

字體大小的最大值可以設(shè)置為 5.6rem,因此如果 5vw 相當(dāng)于大于 5.6rem,則字體大小將為 5.6rem。

有多種方法可以精確計(jì)算最小和最大字體大小之間的漸變,并使用它來選擇您喜歡的中間值,但我使用檢查器來觀察它?

這里有一篇關(guān)于計(jì)算精確漸變的 CSS 技巧文章。

創(chuàng)建模態(tài)

不同的屏幕尺寸

對(duì)于手推車,我想要一個(gè)會(huì)從桌面屏幕右側(cè)出現(xiàn)的模式:

My shopping cart project for a Farm Shop

在移動(dòng)視圖上,我決定它應(yīng)該占據(jù)全屏尺寸:

My shopping cart project for a Farm Shop

購(gòu)物車項(xiàng)目網(wǎng)格區(qū)域

當(dāng)購(gòu)物車項(xiàng)目被添加到購(gòu)物車時(shí),我的大部分時(shí)間都花在了 CSS 上。我使用網(wǎng)格模板區(qū)域,以便購(gòu)物車項(xiàng)目的不同部分(項(xiàng)目標(biāo)題,即“Apple”、價(jià)格、項(xiàng)目數(shù)量和圖像)占用我為它們計(jì)劃的分配空間。

My shopping cart project for a Farm Shop

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

JavaScript

對(duì)于模態(tài) JavaScript,我的目標(biāo)是:

  • 單擊購(gòu)物車圖標(biāo)時(shí)隱藏模式
  • 單擊關(guān)閉圖標(biāo)時(shí)關(guān)閉模式
  • 禁用頁面滾動(dòng),以便在模式打開時(shí)無法向下滾動(dòng)商店商品的主頁

為了實(shí)現(xiàn)這一點(diǎn),我向兩個(gè)圖標(biāo)添加了事件監(jiān)聽器,調(diào)用了函數(shù)toggleModal。如果尚未將其添加到模態(tài)元素中,則會(huì)添加一個(gè)名為 .active 的類;如果已存在,則將其刪除。

在CSS中,我將模態(tài)框設(shè)置為默認(rèn)隱藏,并將.active類設(shè)置為顯示它。

設(shè)置CSS:

.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);
}

這意味著關(guān)閉圖標(biāo)和購(gòu)物車圖標(biāo)上的事件偵聽器可以重用相同的功能,因?yàn)槿绻形达@示,它將顯示模態(tài),如果已經(jīng)打開,它將隱藏它。

使用本地存儲(chǔ)

對(duì)于本地存儲(chǔ),我發(fā)現(xiàn) Web Dev Simplified 的視頻“JavaScript Cookies vs. Local Storage vs. Session Storage”特別有幫助。它討論了這三種存儲(chǔ)數(shù)據(jù)方式之間的差異、如何在開發(fā)工具的“應(yīng)用程序”選項(xiàng)卡中查看數(shù)據(jù)以及如何為每種數(shù)據(jù)存儲(chǔ)類型添加和刪除項(xiàng)目。

這是我將 2 件商品添加到購(gòu)物車后項(xiàng)目的“應(yīng)用程序”選項(xiàng)卡的樣子:

My shopping cart project for a Farm Shop

關(guān)注點(diǎn)分離

我決定將與修改 DOM(添加元素、刪除元素、編輯元素)相關(guān)的函數(shù)與與本地存儲(chǔ)相關(guān)的函數(shù)分開。例如,我有一個(gè)函數(shù)removeCartItemFromLocalStorage,它的功能與上面所說的一樣,并且與removeCartItemFromModalDOM不同,它從模態(tài)中刪除商店項(xiàng)目html。

.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;
}

當(dāng)商店商品從購(gòu)物車中移除時(shí),需要調(diào)用這兩個(gè)函數(shù),將它們作為單獨(dú)的函數(shù)可以幫助我檢查是否已完成該過程的兩個(gè)所需部分。如果不從 DOM 中刪除 html,網(wǎng)頁將不會(huì)直觀地反映出該商品已從購(gòu)物車中刪除。如果不從本地存儲(chǔ)中刪除該項(xiàng)目,刷新頁面或關(guān)閉選項(xiàng)卡時(shí)更改將無法保留。

遇到問題

當(dāng)我在研究 JavaScript 中的本地存儲(chǔ)功能時(shí),我遇到了一個(gè)讓我非常困惑的問題。到目前為止我完成的步驟是:

  • 在初始頁面加載時(shí)將本地存儲(chǔ)設(shè)置為空數(shù)組
  • 當(dāng)點(diǎn)擊商店商品上的“添加”按鈕時(shí),將調(diào)用以下函數(shù):
    • 項(xiàng)目已添加到本地存儲(chǔ)
    • 購(gòu)物車商品的 HTML 已添加到手推車模式
  • 獲取總價(jià),即本地存儲(chǔ)陣列中每個(gè)商品的數(shù)量*價(jià)格
  • 將價(jià)格元素的innerText設(shè)置為從本地存儲(chǔ)檢索的價(jià)格

我點(diǎn)擊了一下,看起來也很棒! ...直到我刷新頁面。然后,價(jià)格設(shè)置為與之前相同的總價(jià),但 DOM 已完全恢復(fù)為初始頁面加載時(shí)的樣子。從視覺上看,購(gòu)物車中似乎沒有商品(顯示的是添加按鈕,而不是數(shù)量輸入控件),但總數(shù)超過 0 英鎊。

添加到購(gòu)物車和未添加到購(gòu)物車的商品之間的差異

My shopping cart project for a Farm Shop

這真的讓我很困惑,我花了一段時(shí)間才弄清楚。最終,我明白了。是的,我正在將這些項(xiàng)目添加到本地存儲(chǔ)中。但是,當(dāng)重新加載頁面并觸發(fā) DOMContentLoaded 事件偵聽器時(shí),我沒有根據(jù)本地存儲(chǔ)中的內(nèi)容渲染 DOM。事實(shí)上,現(xiàn)階段我根本沒有檢查本地存儲(chǔ)中的內(nèi)容。

意識(shí)到這一點(diǎn)后,我創(chuàng)建了一個(gè)名為 DOMContentLoaded 的函數(shù),該函數(shù)循環(huán)遍歷本地存儲(chǔ)中的產(chǎn)品數(shù)組中的所有產(chǎn)品,找到每個(gè)產(chǎn)品的 id,然后更新相關(guān)產(chǎn)品的 html 元素以顯示已添加的產(chǎn)品到購(gòu)物車。

該函數(shù)的簡(jiǎn)化版本是:

const loadCartState = () =>;
{
    const cart = JSON.parse(localStorage.getItem("cart"));
    如果(!購(gòu)物車)
    {
        購(gòu)物車=[];
        localStorage.setItem("購(gòu)物車", JSON.stringify(cart));
    }

    cart.forEach(產(chǎn)品 =>
    {
         const shopItem = document.querySelector(`.shop-item[data- 
        >



<h2>
  
  
  部署
</h2>

<p>我使用 Github Pages 部署了這個(gè)應(yīng)用程序。我之前沒有使用它進(jìn)行部署,但發(fā)現(xiàn)該過程非常簡(jiǎn)單。我遇到的唯一問題是起初沒有顯示任何圖像。我意識(shí)到這是因?yàn)閰^(qū)分大小寫:我的圖像文件夾名為 Img 但圖像路徑是 html 中的 img/ 。修復(fù)此問題并清除緩存后,網(wǎng)站按預(yù)期顯示。 </p>

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

<p>我從這個(gè)項(xiàng)目中學(xué)到了很多東西,特別是關(guān)于 CSS 網(wǎng)格和通過 JavaScript 使用本地存儲(chǔ)。我很想添加更多頁面并將其變成一個(gè)完整的前端電子商務(wù)應(yīng)用程序,但我決定暫時(shí)保留它的 MVP,以便我可以專注于下一階段將其變成 Django 應(yīng)用程序并掛鉤它到數(shù)據(jù)庫(kù)?</p>


          

以上是我的農(nóng)場(chǎng)商店購(gòu)物車項(xiàng)目的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

如何僅在某些頁面上包括CSS? 如何僅在某些頁面上包括CSS? Jun 11, 2025 am 12:01 AM

選擇性包含CSS在特定頁面上的方法有三種:1.內(nèi)聯(lián)CSS,適用于不常訪問或需要獨(dú)特樣式的頁面;2.使用JavaScript條件加載外部CSS文件,適合需要靈活性的情況;3.服務(wù)器端包含,適用于使用服務(wù)器端語言的場(chǎng)景。這種方法可以優(yōu)化網(wǎng)站性能和可維護(hù)性,但需平衡模塊化與性能。

Flexbox與網(wǎng)格:了解CSS布局的關(guān)鍵差異 Flexbox與網(wǎng)格:了解CSS布局的關(guān)鍵差異 Jun 10, 2025 am 12:03 AM

flexboxisidealforone-dimensionAllayouts,while gridsuitStwo,complex layouts.useflexboxforaligningItemsinasingLeaxisAndGridForRidForPreciseconcontroloverroverroverroverroverroverroverrowsandsininintricatientricatedesigns。

使用HTML彈出案創(chuàng)建自動(dòng)關(guān)閉通知 使用HTML彈出案創(chuàng)建自動(dòng)關(guān)閉通知 Jun 10, 2025 am 09:45 AM

HTML彈出屬性將元素轉(zhuǎn)換為頂層元素,可以使用按鈕或JavaScript打開和關(guān)閉。可以將彈出案駁回多種方式,但是沒有選擇自動(dòng)關(guān)閉它們。 preethi有一種技術(shù),你可以

什么是'渲染障礙CSS”? 什么是'渲染障礙CSS”? Jun 24, 2025 am 12:42 AM

CSS會(huì)阻塞頁面渲染是因?yàn)闉g覽器默認(rèn)將內(nèi)聯(lián)和外部CSS視為關(guān)鍵資源,尤其是使用引入的樣式表、頭部大量?jī)?nèi)聯(lián)CSS以及未優(yōu)化的媒體查詢樣式。1.提取關(guān)鍵CSS并內(nèi)嵌至HTML;2.延遲加載非關(guān)鍵CSS通過JavaScript;3.使用media屬性優(yōu)化加載如打印樣式;4.壓縮合并CSS減少請(qǐng)求。建議使用工具提取關(guān)鍵CSS,結(jié)合rel="preload"異步加載,合理使用media延遲加載,避免過度拆分與復(fù)雜腳本控制。

如何在無花果中使用Lotties 如何在無花果中使用Lotties Jun 14, 2025 am 10:17 AM

在接下來的教程中,我將向您展示如何在無花果中創(chuàng)建Lottie動(dòng)畫。我們將使用兩種彩色設(shè)計(jì)來超越如何在無花果上進(jìn)行動(dòng)畫,然后向您展示如何從Figma到Lottie動(dòng)畫。您只需要免費(fèi)無花果

打破邊界:用(s)CSS構(gòu)建湯姆拼圖 打破邊界:用(s)CSS構(gòu)建湯姆拼圖 Jun 13, 2025 am 11:33 AM

我們對(duì)其進(jìn)行了測(cè)試,事實(shí)證明,至少在低級(jí)邏輯和拼圖行為時(shí),Sass可以替換JavaScript。除了地圖,混音,功能和大量數(shù)學(xué)外,我們都設(shè)法使我們的Tangram難題栩栩如生,沒有J

外部與內(nèi)部CSS:最好的方法是什么? 外部與內(nèi)部CSS:最好的方法是什么? Jun 20, 2025 am 12:45 AM

thebestapphachforcssdepprodsontheproject'sspefificneeds.forlargerprojects,externalcsSissBetterDuoSmaintoMaintainability andReusability; forsMallerProjectsorsingle-pageApplications,InternaltCsmightBemoresobleable.InternalCsmightBemorese.it.it'sclucialtobalancepopryseceneceenceprodrenceprodrenceNeed

我的CSS必須在較低的情況下嗎? 我的CSS必須在較低的情況下嗎? Jun 19, 2025 am 12:29 AM

否,CSSDOESNOTHAVETOBEINLOWERCASE.CHOMENDENS,使用flowercaseisrecommondendendending:1)一致性和可讀性,2)避免使用促進(jìn)性技術(shù),3)潛在的Performent FormanceBenefits,以及4)RightCollaboraboraboraboraboraboraboraboraboraboraboraboraboraboraboraboraborationWithInteams。

See all articles