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

首頁(yè) 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ù)量
?即使您刷新頁(yè)面或關(guān)閉選項(xiàng)卡然后重新打開它,仍將所有商品保留在購(gòu)物車中

該項(xiàng)目的背景

到目前為止,我在工作中主要從事后端應(yīng)用程序的工作。不過(guò),今年夏天,我開始從事一個(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 中使用過(guò)瀏覽器本地存儲(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ǔ)

未來(lái)目標(biāo)

創(chuàng)建前端是我這個(gè)項(xiàng)目計(jì)劃的第 1 部分。第二部分是使用 Django 將其轉(zhuǎn)換為全棧應(yīng)用程序,以便商店商品來(lái)自數(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,而無(wú)需編寫額外的媒體查詢。

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è)備來(lái)說(shuō)太大了。

.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ì)算最小和最大字體大小之間的漸變,并使用它來(lái)選擇您喜歡的中間值,但我使用檢查器來(lái)觀察它?

這里有一篇關(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)閉模式
  • 禁用頁(yè)面滾動(dòng),以便在模式打開時(shí)無(wú)法向下滾動(dòng)商店商品的主頁(yè)

為了實(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,它的功能與上面所說(shuō)的一樣,并且與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ù)可以幫助我檢查是否已完成該過(guò)程的兩個(gè)所需部分。如果不從 DOM 中刪除 html,網(wǎng)頁(yè)將不會(huì)直觀地反映出該商品已從購(gòu)物車中刪除。如果不從本地存儲(chǔ)中刪除該項(xiàng)目,刷新頁(yè)面或關(guān)閉選項(xiàng)卡時(shí)更改將無(wú)法保留。

遇到問題

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

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

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

My shopping cart project for a Farm Shop

這真的讓我很困惑,我花了一段時(shí)間才弄清楚。最終,我明白了。是的,我正在將這些項(xiàng)目添加到本地存儲(chǔ)中。但是,當(dāng)重新加載頁(yè)面并觸發(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)該過(guò)程非常簡(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)格和通過(guò) JavaScript 使用本地存儲(chǔ)。我很想添加更多頁(yè)面并將其變成一個(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)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

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

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

CSS會(huì)阻塞頁(yè)面渲染是因?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通過(guò)JavaScript;3.使用media屬性優(yōu)化加載如打印樣式;4.壓縮合并CSS減少請(qǐng)求。建議使用工具提取關(guān)鍵CSS,結(jié)合rel="preload"異步加載,合理使用media延遲加載,避免過(guò)度拆分與復(fù)雜腳本控制。

外部與內(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。

CSS案例靈敏度:了解重要的 CSS案例靈敏度:了解重要的 Jun 20, 2025 am 12:09 AM

cssismostlycaseminemintiment,buturlsandfontfamilynamesarecase敏感。1)屬性和valueslikeColor:紅色; prenotcase-sensive.2)urlsmustmustmatchtheserver'server'scase,例如

什么是AutoPrefixer,它如何工作? 什么是AutoPrefixer,它如何工作? Jul 02, 2025 am 01:15 AM

Autoprefixer是一個(gè)根據(jù)目標(biāo)瀏覽器范圍自動(dòng)為CSS屬性添加廠商前綴的工具。1.它解決了手動(dòng)維護(hù)前綴易出錯(cuò)的問題;2.通過(guò)PostCSS插件形式工作,解析CSS、分析需加前綴的屬性、依配置生成代碼;3.使用步驟包括安裝插件、設(shè)置browserslist、在構(gòu)建流程中啟用;4.注意事項(xiàng)有不手動(dòng)加前綴、保持配置更新、非所有屬性都加前綴、建議配合預(yù)處理器使用。

什么是CSS計(jì)數(shù)器? 什么是CSS計(jì)數(shù)器? Jun 19, 2025 am 12:34 AM

csscounterscanautomationallymentermentermentections和lists.1)usecounter-ensettoInitializize,反插入式發(fā)芽,andcounter()orcounters()

CSS:何時(shí)重要(何時(shí)不)? CSS:何時(shí)重要(何時(shí)不)? Jun 19, 2025 am 12:27 AM

在CSS中,選擇器和屬性名不區(qū)分大小寫,而值、命名顏色、URL和自定義屬性則區(qū)分大小寫。1.選擇器和屬性名不區(qū)分大小寫,例如background-color和Background-Color相同。2.值中的十六進(jìn)制顏色不區(qū)分大小寫,但命名顏色區(qū)分大小寫,如red有效而Red無(wú)效。3.URL區(qū)分大小寫,可能導(dǎo)致文件加載問題。4.自定義屬性(變量)區(qū)分大小寫,使用時(shí)需注意大小寫一致。

CSS中的情況敏感性:選擇器,屬性和值所解釋的 CSS中的情況敏感性:選擇器,屬性和值所解釋的 Jun 19, 2025 am 12:38 AM

cssselectorsand and propertynamesarecase-insimentimentiment.1)selectorSlike like'div'div'div'div'and'and'and'And'Andiv'areequivalent.2)propertioessuchas'backusuchas'backusuchas'backusuchas'backusuchas'backer'back-and'background and backorgook crolor'backorground-artreateateDthesementhesame.3)

See all articles