Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 2021国产精品成人免费视频,2021国产精品视频,亚洲国产韩国一区二区

          整合營(yíng)銷(xiāo)服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          前端苦HTML+CSS久已

          當(dāng)下,構(gòu)建交互式應(yīng)用程序的主流技術(shù)是 Web 技術(shù),其中包括 HTML、CSS 與 JavaScript。

          在過(guò)去的 10 年,Web 技術(shù)生態(tài)發(fā)生了翻天覆地的變化,包括層出不窮的開(kāi)發(fā)框架,諸如 React、Vue、Svelte,也包括日新月異的前端工程化工具,比如 Webpack、esbuild、Vite 等等。

          但歸根結(jié)底,他們都逃不開(kāi) HTML、CSS、JavaScript 三劍客的范疇。

          Web 技術(shù)生態(tài)成熟、穩(wěn)定,然而卻存在一個(gè)致命的問(wèn)題:使用 Web 技術(shù)去構(gòu)建跨平臺(tái)應(yīng)用程序并不是一件簡(jiǎn)單的事情。

          這也是為什么許多平臺(tái)特定的框架(platform-specific frameworks)與跨平臺(tái)框架(cross-platform frameworks)依然受到歡迎的原因。

          比如其中最著名的跨平臺(tái)框架 Flutter,它部分基于瀏覽器引擎的技術(shù),實(shí)現(xiàn)了「編寫(xiě)一次,全平臺(tái)運(yùn)行」的目標(biāo)。而且這些框架,也基本不使用 HTML、CSS 這些 Web 技術(shù)。這是為什么呢?

          苦 HTML+CSS 久已

          因?yàn)?HTML 誕生的目的問(wèn)題,以及 HTML 與 CSS 的開(kāi)發(fā)體驗(yàn)問(wèn)題。

          HTML 即超文本標(biāo)記語(yǔ)言,最初是三十年前為了制作可鏈接的文檔而發(fā)明的,而不是為了做應(yīng)用程序。它更多是一種標(biāo)記而不是一種語(yǔ)言。大多數(shù)人甚至都不將編寫(xiě) HTML 視為編程,因?yàn)樗静皇且环N編程語(yǔ)言。

          直到出現(xiàn) HTML5 (通常被稱為 H5)、CSS3 和 ES5 版本之后的 JavaScript,人們才逐漸開(kāi)始用這些技術(shù)制作 Web 應(yīng)用程序。在那之前,HTML 只是用于完成他最開(kāi)始的目的。

          但做成 Web 應(yīng)用的可行性,最大還是來(lái)自于 JavaScript 性能的提升。

          上面是 Lin Clark 介紹 JavaScript 性能歷史的一張圖。從2008年開(kāi)始,JavaScript 性能就開(kāi)始飛速提升。這對(duì)于應(yīng)用程序的最終用戶來(lái)說(shuō)有巨大的好處,因?yàn)樽龀鰜?lái)的應(yīng)用程序終于不卡了,甚至可以對(duì)性能有所期待了。

          但是,對(duì)于開(kāi)發(fā)者來(lái)說(shuō),仍然逃不開(kāi)編寫(xiě) HTML+CSS。

          就算使用一些前沿的前端框架,如 React、Vue、Angular 等,我們?nèi)匀恍枰帉?xiě)類(lèi)似 HTML 的代碼,并仔細(xì)調(diào)整 CSS 或者 CSS 預(yù)處理器(如 SCSS、Saas)的樣式表。

          這緩慢、枯燥、而且乏味。

          太多的人力、時(shí)間被浪費(fèi)在實(shí)現(xiàn)圖形用戶界面的細(xì)節(jié)上,使用一些并不是一開(kāi)始就為了 UI 而設(shè)計(jì)的技術(shù)。這導(dǎo)致開(kāi)發(fā)者經(jīng)常要來(lái)回調(diào)整樣式、處理瀏覽器兼容性問(wèn)題、應(yīng)用奇怪的 CSS 技巧、避開(kāi)性能陷阱等等。

          另外,還需要在過(guò)度發(fā)展的 NPM 生態(tài)系統(tǒng)中,使用那些復(fù)雜的前端工程工具來(lái)進(jìn)行應(yīng)用程序的構(gòu)建。這個(gè)過(guò)程效率也非常低下,開(kāi)發(fā)體驗(yàn)非常痛苦。更不要說(shuō) Web 應(yīng)用在跨平臺(tái)需求中會(huì)遇到更多的陷阱,比如平臺(tái)兼容性、體積大小、性能問(wèn)題,等等。

          此刻,我們質(zhì)疑,堅(jiān)持使用 HTML 和 CSS 的理由到底是什么?

          其他非 Web 框架

          然后我們?cè)倩剡^(guò)頭來(lái)看看其他的非 Web 框架。

          Electron 首先被我們排除。雖然微軟用它做出了 VSCode 這樣成熟的跨平臺(tái)應(yīng)用程序,但也投入了巨大的成本,并且一般開(kāi)發(fā)者可沒(méi)有這么雄厚的財(cái)力。

          但最關(guān)鍵的是,VSCode 其實(shí)是用 Web 技術(shù)做出來(lái)的,Electron 只是幫助它做成了跨平臺(tái)應(yīng)用而已。

          看看我們還有什么其他選擇:

          • 有一些是自計(jì)算機(jī)黃金時(shí)代開(kāi)始就存在的特定平臺(tái)的框架,例如 Windows 的 MFC,macOS 的 Cocoa,以及 UNIX/Linux 的 GTK。其他一些則是更現(xiàn)代的移動(dòng)端框架,如專門(mén)為 iOS、Android 或其他移動(dòng)操作系統(tǒng)專門(mén)服務(wù)的開(kāi)發(fā)框架。
          • 而在跨平臺(tái)框架中,值得注意的是廣泛采用的 Qt 框架。但它主要用于桌面軟件開(kāi)發(fā)。這里的跨平臺(tái)主要是指跨越不同的桌面操作系統(tǒng),如 Windows/Linux/macOS,但這幾年 Qt 也逐漸在往移動(dòng)端與 Web 端在努力,雖然沒(méi)有取得什么成就。
          • 第三種就是這幾年開(kāi)始流行的全新跨端方案,如 Flutter,它是一個(gè)以移動(dòng)端為主的跨平臺(tái)框架,但在 Web 端和桌面端也有所作為。

          隨著近年來(lái) Web 應(yīng)用的比例不斷增加,桌面端應(yīng)用逐漸式微。但正是因?yàn)?Web 應(yīng)用在跨端上的致命問(wèn)題,這些非 Web 框架仍有一席之地,并且看上去也具有不可替代性。

          當(dāng)然,其中的某些年代過(guò)于久遠(yuǎn)的開(kāi)發(fā)框架,開(kāi)發(fā)人員的體驗(yàn)甚至比編寫(xiě) HTML 更糟糕,因?yàn)樗麄兛赡鼙黄染帉?xiě)類(lèi)似于這樣的命令式和面向?qū)ο?/span>的代碼。

          var count = 0
          let stack = new VStack
          let text = new Text("Count: \(count)")
          stack.add_child(text)
          let button = new Button("Increment")
          button.set_onclick(||
              count += 1
              text.set_text("Count: \(count)")
          )
          stack.add_child(button)

          不是編寫(xiě)聲明式且響應(yīng)式的代碼,就像程序員一直夢(mèng)寐以求的這樣:

          struct AppState {
              count: i32
          }
          
          
          VStack {
              Text("count: \(state.count)")
              Button("Increment") {
                  state.count += 1
              }
          }

          這就是為什么 Flutter 看起來(lái)像是開(kāi)發(fā)應(yīng)用程序的靈丹妙藥:

          • Flutter 是聲明式且響應(yīng)式的。
          • Flutter 真正實(shí)現(xiàn)了跨平臺(tái),可以制作所有桌面、移動(dòng)和 Web 應(yīng)用程序。

          不過(guò)也還是有開(kāi)發(fā)者不喜歡 Flutter,因?yàn)樗肓肆硪环N新的、陌生的語(yǔ)言 Dart,以及額外的虛擬機(jī)負(fù)擔(dān)。

          Flutter 真正的問(wèn)題在于與現(xiàn)有生態(tài)系統(tǒng)的兼容性,因?yàn)槿藗儍A向于更喜歡重用已建立的資源和維護(hù)成熟的應(yīng)用程序。編程語(yǔ)言也是出于同樣的原因。

          為了解決 Flutter 的一些問(wèn)題,有些優(yōu)秀開(kāi)發(fā)者們嘗試開(kāi)發(fā)了 Flutter 的 JavaScript 版本,雖然后來(lái)失敗了。因?yàn)?Flutter 本身正在迅速迭代,以至于兩者無(wú)法融洽。不過(guò)這部分的工作導(dǎo)致誕生了 Kraken 框架,它允許編碼人員編寫(xiě) HTML,并使用 Flutter 引擎進(jìn)行跨平臺(tái)渲染。

          等等...發(fā)生了什么?在非 Web 框架中再次編寫(xiě) HTML?

          Design to Code

          不!再也不想寫(xiě) HTML 了!

          盡管如此,我們不得不承認(rèn),HTML+CSS 是表示 UI 的一個(gè)很好的組合,因?yàn)椋?/span>

          • HTML 負(fù)責(zé)內(nèi)容的結(jié)構(gòu),CSS 負(fù)責(zé)內(nèi)容的樣式。
          • 結(jié)構(gòu)和樣式是解耦的,這對(duì)工程來(lái)說(shuō)是有好處的。

          但是在實(shí)踐中,UI 的工程有時(shí)是沒(méi)有意義且不必要的。假設(shè)我們已經(jīng)有了設(shè)計(jì)師提供的高保真設(shè)計(jì)原型,編碼人員需要做的是:

          1. 使用代碼重新實(shí)現(xiàn)設(shè)計(jì)原型,這在 99% 的情況下是 HTML+CSS 的事情。
          2. 為剛剛重新實(shí)現(xiàn)的 UI 添加業(yè)務(wù)邏輯。

          第一部分總是讓人頭疼的源頭:涉及大量的細(xì)節(jié)、耗時(shí)、需要與設(shè)計(jì)師進(jìn)行討論反復(fù)溝通,溝通成本很高,如果設(shè)計(jì)更新,代碼也需要更新,也許還需要另一場(chǎng)“昂貴”的討論。

          更不用說(shuō),這種工作通常被視為費(fèi)時(shí)費(fèi)力沒(méi)技術(shù)含量工作,也因此就有了大家聽(tīng)到的前端程序員通常被其他非前端程序員所鄙視。

          一些聰明的開(kāi)發(fā)者想出了使用編譯器技術(shù)或更具體地說(shuō)是轉(zhuǎn)換器技術(shù)來(lái)實(shí)現(xiàn)設(shè)計(jì)到代碼的解決方案,將整個(gè)高保真設(shè)計(jì)轉(zhuǎn)換為機(jī)器生成的 HTML+CSS 代碼。這個(gè)就是所謂的 Design to Code。

          但它是為產(chǎn)品經(jīng)理和設(shè)計(jì)師量身定制的,而不是為開(kāi)發(fā)人員。這種內(nèi)在問(wèn)題包括但不限于:

          • 生成的代碼可讀性差,不符合項(xiàng)目中現(xiàn)有的編碼風(fēng)格。
          • 生成代碼的不易集成。如果它依賴于另一個(gè)第三方庫(kù)怎么辦?如果生成的代碼更新了,整個(gè)大片的變化在版本控制系統(tǒng)中體現(xiàn)是否合理?
          • 像 Sketch 或 Figma 這樣的設(shè)計(jì)工具,總是可以設(shè)計(jì)出比 HTML+CSS 可以實(shí)現(xiàn)的更高級(jí)的視覺(jué)效果。他們甚至可以精確控制每一個(gè)像素。而很多時(shí)候,生成的代碼可能無(wú)法產(chǎn)生與設(shè)計(jì)原型完全相同的 UI,絕對(duì)需要一些補(bǔ)丁。但如果生成的代碼更新了,補(bǔ)丁就無(wú)法再應(yīng)用了怎么辦?

          總之,從開(kāi)發(fā)者的角度來(lái)看,Design to Code 不是一個(gè)好的技術(shù)解決方案。

          現(xiàn)在讓我們看看什么是 Design as Code。

          Design as Code

          在 VGG 所倡導(dǎo)的 Design as Code 開(kāi)發(fā)流程中,用戶可以在某種程度上拋棄 HTML+CSS。

          因?yàn)樵O(shè)計(jì)稿完全替代了 HTML+CSS 的角色,設(shè)計(jì)就是代碼。請(qǐng)記住 VGG 的第一性原則:通過(guò)消除冗余的開(kāi)發(fā)工作來(lái)彌合設(shè)計(jì)與開(kāi)發(fā)兩方之間的巨大鴻溝。

          很明顯的優(yōu)勢(shì):圖形用戶界面的設(shè)計(jì)和開(kāi)發(fā)只需要進(jìn)行一次,因?yàn)閮烧邔?shí)際上是一體的。因此兩者的摩擦、討論會(huì)減少,這讓雙方都更高效。

          對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),他們能夠直接在設(shè)計(jì)文件上編寫(xiě)業(yè)務(wù)邏輯,然后由 VGG 將其運(yùn)行為一個(gè)交互式圖形應(yīng)用程序。這可以節(jié)省大量重復(fù)的工作,不僅提高了開(kāi)發(fā)人員的工作效率,也為整個(gè)團(tuán)隊(duì)增加了工作效率。

          Design as Code 的想法很簡(jiǎn)單,但它實(shí)現(xiàn)起來(lái)非常困難,比如會(huì)遇到來(lái)自編譯器技術(shù)、編程接口抽象和圖形渲染方面的工程挑戰(zhàn)。

          因此,為了實(shí)現(xiàn) VGG 的 Design as Code 開(kāi)發(fā)流程

          • VGG 定義了下一代矢量圖形規(guī)范 VGG Specs (https://docs.verygoodgraphics.com/specs/overview)
          • 實(shí)現(xiàn)了 VGG runtime 開(kāi)源引擎 (https://github.com/verygoodgraphics/vgg_runtime)
          • 提供各種 VGG 容器,實(shí)現(xiàn)了對(duì)各種平臺(tái)和框架的嵌入式支持。

          VGG 天生就有著對(duì)開(kāi)發(fā)生態(tài)很好的兼容性。相比于低代碼,VGG 是一套真正為開(kāi)發(fā)者設(shè)計(jì)的工具。小結(jié):

          • VGG 主打 Design as Code,直接使用設(shè)計(jì)稿代替 HTML+CSS 去實(shí)現(xiàn)用戶界面。
          • VGG 將設(shè)計(jì)稿變成了跨平臺(tái)的應(yīng)用,為開(kāi)發(fā)者節(jié)約了更多的時(shí)間與成本。

          基于以上兩點(diǎn),VGG 以及它主打的 Design as Code 可以為現(xiàn)代交互式應(yīng)用開(kāi)發(fā)帶來(lái)巨大的好處。在最終用戶對(duì)用戶界面的實(shí)際使用效果沒(méi)有明顯感知差異的前提下,大大提升了應(yīng)用開(kāi)發(fā)者的開(kāi)發(fā)體驗(yàn),甚至可以讓設(shè)計(jì)師、產(chǎn)品經(jīng)理來(lái)承擔(dān)一部分的界面開(kāi)發(fā)工作:無(wú)非是把現(xiàn)有的設(shè)計(jì)工具當(dāng)作一個(gè) UI Builder 來(lái)使用罷了。

          下面引用來(lái)自 VGG Github 首頁(yè)的一張圖,來(lái)更好地說(shuō)明 Design as Code 的概念與 VGG 的有機(jī)組成:

          展望

          在這篇文章中,我們討論了 Web 技術(shù)、特定平臺(tái)的框架、跨平臺(tái)框架、Design to Code 解決方案以及基于 VGG 開(kāi)源引擎的 Design as Code 開(kāi)發(fā)流程。

          我們提出了 Design as Code 的概念,介紹了 VGG 作為一個(gè)全新的開(kāi)發(fā)交互式圖形應(yīng)用程序的框架。但 VGG 仍然年輕,因?yàn)檫€有許多技術(shù)挑戰(zhàn)需要克服,VGG 運(yùn)行時(shí)引擎現(xiàn)已開(kāi)源,歡迎大家一起參與 VGG 開(kāi)源社區(qū)共建。

          關(guān)于 VGG 的更多細(xì)節(jié)將在后續(xù)的文章中討論。如果您感興趣,可以繼續(xù)閱讀官方博客和文檔
          https://blog.verygoodgraphics.com/

          2024年選擇適合項(xiàng)目的CSS框架至關(guān)重要。這將為構(gòu)建新的用戶界面(UI)組件所需的總體努力定下基調(diào)。目前,最重要的是更快地發(fā)布新功能,以保持客戶的滿意度。因此,你需要一個(gè)易于使用的CSS框架,它能夠提供現(xiàn)成的UI元素。

          下面,我們來(lái)看看2024年值得嘗試的最佳CSS框架。

          1、Bootstrap

          在今天的數(shù)字時(shí)代,網(wǎng)頁(yè)設(shè)計(jì)和開(kāi)發(fā)已經(jīng)成為創(chuàng)造令人印象深刻在線體驗(yàn)的關(guān)鍵。為了滿足這一需求,Bootstrap 應(yīng)運(yùn)而生,它是一款以移動(dòng)為先的 CSS 框架,不僅能幫助你構(gòu)建外觀優(yōu)雅的響應(yīng)式網(wǎng)頁(yè)界面,還大大簡(jiǎn)化了開(kāi)發(fā)過(guò)程。

          Bootstrap 的核心在于其強(qiáng)大的柵格系統(tǒng),這一系統(tǒng)使得開(kāi)發(fā)者可以為各種屏幕尺寸創(chuàng)建靈活的布局。更重要的是,Bootstrap 提供了大量現(xiàn)成的組件,比如導(dǎo)航欄、卡片和模態(tài)框,這些都讓開(kāi)發(fā)變得更加迅速和高效。

          Bootstrap 的獨(dú)特之處

          • 響應(yīng)式柵格系統(tǒng):這是 Bootstrap 的核心特性之一,允許網(wǎng)頁(yè)內(nèi)容根據(jù)不同的屏幕尺寸自動(dòng)調(diào)整布局,從而在手機(jī)、平板和桌面上都能提供良好的用戶體驗(yàn)。
          • 豐富的預(yù)制組件:Bootstrap 提供了大量的預(yù)制組件,如導(dǎo)航欄、卡片、模態(tài)框等,使得開(kāi)發(fā)者可以輕松實(shí)現(xiàn)復(fù)雜的UI設(shè)計(jì)。
          • 快速樣式調(diào)整的實(shí)用類(lèi):通過(guò)實(shí)用類(lèi),Bootstrap 使得頁(yè)面的樣式調(diào)整變得快速簡(jiǎn)單,無(wú)需編寫(xiě)大量的自定義CSS。
          • 增強(qiáng)功能的JavaScript插件:Bootstrap 還提供了一系列JavaScript插件,進(jìn)一步擴(kuò)展了網(wǎng)頁(yè)的交互性和動(dòng)態(tài)效果。
          • 活躍的社區(qū)和豐富的文檔:Bootstrap 擁有一個(gè)活躍的開(kāi)發(fā)者社區(qū)和詳盡的文檔,為使用者提供了強(qiáng)大的支持。

          如何將 Bootstrap 與現(xiàn)代框架結(jié)合使用

          如果你在使用 React 開(kāi)發(fā)項(xiàng)目,可以輕松地將 React Bootstrap 庫(kù)安裝到你的項(xiàng)目中,通過(guò)這種方式,你可以在保持 React 的組件化開(kāi)發(fā)模式的同時(shí),享受 Bootstrap 提供的樣式和組件優(yōu)勢(shì)。

          import ButtonGroup from 'react-bootstrap/ButtonGroup';
          import Dropdown from 'react-bootstrap/Dropdown';
          import DropdownButton from 'react-bootstrap/DropdownButton';
          import './bootstrap.css';
          
          export function Bootstrap() {
            return (
              <div className="button">
                {['Primary', 'success', 'danger'].map((variant) => (
                  <DropdownButton
                    as={ButtonGroup}
                    key={variant}
                    id={dropdown-variants-${variant}}
                    variant={variant.toLowerCase()}
                    title={variant}
                    <Dropdown.Item eventKey="1">Action</Dropdown.Item>
                    <Dropdown.Item eventKey="2">Another action</Dropdown.Item>
                    <Dropdown.Item eventKey="3" active>
                      Active Item
                    </Dropdown.Item>
                    <Dropdown.Divider />
                    <Dropdown.Item eventKey="4">Separated link</Dropdown.Item>
                  </DropdownButton>
                ))}
                <br />
                <Dropdown>
                  <Dropdown.Toggle variant="success" id="dropdown-basic">
                    Dropdown Button
                  </Dropdown.Toggle>
                  <Dropdown.Menu>
                    <Dropdown.Item href="#/action-1">Action</Dropdown.Item>
                    <Dropdown.Item href="#/action-2">Another action</Dropdown.Item>
                    <Dropdown.Item href="#/action-3">Something else</Dropdown.Item>
                  </Dropdown.Menu>
                </Dropdown>
              </div>
            );
          }

          2、Tailwind CSS

          Tailwind CSS 以其獨(dú)樹(shù)一幟的“工具優(yōu)先”設(shè)計(jì)理念,在前端開(kāi)發(fā)社區(qū)中引起了廣泛關(guān)注。它與傳統(tǒng)的 CSS 框架不同,不提供預(yù)設(shè)樣式的組件,而是通過(guò)提供大量的低級(jí)實(shí)用類(lèi)(utility classes),讓開(kāi)發(fā)者能夠構(gòu)建出完全定制的設(shè)計(jì)。這種方法提供了前所未有的靈活性和可擴(kuò)展性,使得開(kāi)發(fā)者可以精準(zhǔn)控制網(wǎng)頁(yè)的每一個(gè)細(xì)節(jié)。

          Tailwind CSS 的獨(dú)特特點(diǎn)

          • 工具優(yōu)先的設(shè)計(jì)方式:Tailwind 的核心思想是通過(guò)實(shí)用類(lèi)直接在 HTML 中應(yīng)用樣式,極大地提高了開(kāi)發(fā)效率和靈活性。
          • 高度可定制:通過(guò)配置文件,開(kāi)發(fā)者可以自定義 Tailwind 的主題、顏色、間距等,以適應(yīng)項(xiàng)目的具體需求。
          • 沒(méi)有預(yù)構(gòu)建的組件:與其它框架不同,Tailwind 不提供預(yù)構(gòu)建的組件。這意味著所有的樣式都是由開(kāi)發(fā)者從頭開(kāi)始構(gòu)建的,確保了設(shè)計(jì)的獨(dú)特性。
          • 響應(yīng)式設(shè)計(jì):Tailwind 提供了響應(yīng)式設(shè)計(jì)的支持,通過(guò)斷點(diǎn)(breakpoints)可以輕松實(shí)現(xiàn)不同屏幕尺寸下的樣式適配。
          • 與 PurgeCSS 的集成:通過(guò)集成 PurgeCSS,Tailwind 能夠在生產(chǎn)環(huán)境下自動(dòng)移除未使用的 CSS,優(yōu)化項(xiàng)目的加載速度。
          • JIT(即時(shí)編譯)模式:Tailwind 的 JIT 模式使得開(kāi)發(fā)過(guò)程中的樣式更改能夠即時(shí)反映,進(jìn)一步提升開(kāi)發(fā)效率。

          如何集成 Tailwind CSS

          集成 Tailwind CSS 到項(xiàng)目中并非一蹴而就,首先需要設(shè)置 Tailwind 編譯器。通過(guò)在項(xiàng)目的配置文件中指定要處理的內(nèi)容和自定義主題,然后通過(guò)插件來(lái)擴(kuò)展功能,你可以開(kāi)始使用 Tailwind 提供的實(shí)用類(lèi)來(lái)編寫(xiě) CSS。

          /** @type {import('tailwindcss').Config} */
          module.exports = {
            content: ["./src/**/*.{html,js}"],
            theme: {
              extend: {},
            },
            plugins: [],
          }

          以下是相關(guān)的使用示例

          export function Tailwind() {
            const ContactTextArea = ({
              row,
              placeholder,
              name,
              defaultValue,
            }: {
              row: number;
              placeholder: string;
              name: string;
              defaultValue: string;
            }) => {
              return (
                <>
                  <div className="mb-6">
                    <textarea
                      rows={row}
                      placeholder={placeholder}
                      name={name}
                      className="w-full resize-none rounded border border-stroke px-[14px] py-3 text-base text-body-color outline-none focus:border-primary dark:border-dark-3 dark:bg-dark dark:text-dark-6"
                      defaultValue={defaultValue}
                    />
                  </div>
                </>
              );
            };
          
          const ContactInputBox = ({
              type,
              placeholder,
              name,
            }: {
              type: string;
              placeholder: string;
              name: string;
            }) => {
              return (
                <>
                  <div className="mb-6">
                    <input
                      type={type}
                      placeholder={placeholder}
                      name={name}
                      className="w-full rounded border border-stroke px-[14px] py-3 text-base text-body-color outline-none focus:border-primary dark:border-dark-3 dark:bg-dark dark:text-dark-6"
                    />
                  </div>
                </>
              );
            };
            return (
              <section className="relative z-10 overflow-hidden bg-white py-20 dark:bg-dark lg:py-[120px]">
                <div className="w-full px-4 lg:w-1/2 xl:w-5/12">
                  <div className="relative rounded-lg bg-white p-8 shadow-lg dark:bg-dark-2 sm:p-12">
                    <form>
                      <ContactInputBox type="text" name="name" placeholder="Your Name" />
                      <ContactInputBox
                        type="text"
                        name="email"
                        placeholder="Your Email"
                      />
                      <ContactInputBox
                        type="text"
                        name="phone"
                        placeholder="Your Phone"
                      />
                      <ContactTextArea
                        row={6}
                        placeholder="Your Message"
                        name="details"
                        defaultValue=""
                      />
                      <div>
                        <button
                          type="submit"
                          className="w-full rounded border border-primary bg-primary p-3 text-white transition hover:bg-opacity-90"
                          Send Message
                        </button>
                      </div>
                    </form>
                    <div />
                  </div>
                </div>
              </section>
            );
          }

          3、Foundation

          Foundation 是一款開(kāi)源的、響應(yīng)式的前端框架,它極大地簡(jiǎn)化了創(chuàng)建在任何設(shè)備上都能完美運(yùn)行的響應(yīng)式網(wǎng)站、應(yīng)用程序和電子郵件的過(guò)程。由于其出色的靈活性和易用性,F(xiàn)oundation 已被包括 Facebook、eBay、Mozilla、Adobe 乃至 Disney 在內(nèi)的許多公司采用于他們的項(xiàng)目中。

          Foundation 提供了一個(gè)強(qiáng)大而靈活的響應(yīng)式柵格系統(tǒng),并且包括了許多方便的選項(xiàng)、模態(tài)框(modals)、排版(typography)、導(dǎo)航組件以及表單元素,設(shè)計(jì)師可以快速將這些元素集成到他們的產(chǎn)品中。此外,F(xiàn)oundation 的模塊化架構(gòu)意味著你可以根據(jù)需要,使用它的部分或全部功能。

          Foundation 的獨(dú)特特性

          • 靈活的響應(yīng)式柵格系統(tǒng):Foundation 的柵格系統(tǒng)提供了豐富的布局選項(xiàng),使得創(chuàng)建響應(yīng)式設(shè)計(jì)變得簡(jiǎn)單高效。
          • 模塊化架構(gòu):這允許開(kāi)發(fā)者自定義所需的功能,確保了框架的靈活性和擴(kuò)展性。
          • Sass 預(yù)處理器:Foundation 使用 Sass 預(yù)處理器進(jìn)行樣式的編寫(xiě),進(jìn)一步增強(qiáng)了樣式定義的靈活性和可維護(hù)性。
          • 內(nèi)建組件和響應(yīng)式導(dǎo)航:框架提供了一系列預(yù)建的組件和響應(yīng)式導(dǎo)航,加速了開(kāi)發(fā)流程并提高了用戶體驗(yàn)。
          • Flexbox 和塊級(jí)網(wǎng)格支持:這些現(xiàn)代布局技術(shù)的支持使得創(chuàng)建復(fù)雜的布局結(jié)構(gòu)變得更為簡(jiǎn)單。
          • 可訪問(wèn)性特性:Foundation 在設(shè)計(jì)時(shí)考慮了可訪問(wèn)性,幫助開(kāi)發(fā)者創(chuàng)建符合 WCAG 標(biāo)準(zhǔn)的網(wǎng)站。

          如何在項(xiàng)目中集成 Foundation

          通過(guò)如下示例代碼,可以看到如何在 React 項(xiàng)目中使用 Foundation:

          import { Menu, MenuItem } from 'react-foundation';
          
          export function Foundation() {
            return (
             <Menu style={{ marginLeft: '34px' }}>
               <MenuItem>
                 <a href="/">Home</a>
               </MenuItem>
               <MenuItem>
                 <a href="/">Blog</a>
               </MenuItem>
               <MenuItem>
                 <a href="/">About</a>
               </MenuItem>
               <MenuItem>
                <a href="/">Contact</a>
               </MenuItem>
             </Menu>
            );
          }
          

          這個(gè)例子展示了如何使用 Foundation 的 Menu 和 MenuItem 組件來(lái)創(chuàng)建一個(gè)簡(jiǎn)單的導(dǎo)航菜單。這種集成方式使得在保持 React 組件化開(kāi)發(fā)模式的同時(shí),還能享受 Foundation 提供的樣式和組件優(yōu)勢(shì)。

          4. Bulma

          Bulma 是一個(gè)輕量級(jí)的 CSS 框架,以其簡(jiǎn)單性、響應(yīng)性和定制選項(xiàng)著稱。它與其他 UI 框架的不同之處在于,Bulma 是基于 Flexbox 構(gòu)建的,F(xiàn)lexbox 是一種 CSS 布局模型,能夠根據(jù)容器的寬度調(diào)整頁(yè)面元素的寬度,這使得創(chuàng)建網(wǎng)格等任務(wù)變得非常簡(jiǎn)單,并且是框架輕量化的原因之一。

          Bulma 的主要特點(diǎn)

          • 基于 Flexbox 的現(xiàn)代 CSS 框架:利用 Flexbox,Bulma 為開(kāi)發(fā)者提供了一種更靈活、簡(jiǎn)潔的方式來(lái)創(chuàng)建布局,無(wú)需復(fù)雜的布局計(jì)算。
          • 易用且直觀的語(yǔ)法:Bulma 的類(lèi)名清晰直觀,使得即使是 CSS 新手也能快速上手。
          • 無(wú) JavaScript 依賴:Bulma 完全由 CSS 構(gòu)成,這意味著你可以在不添加任何 JavaScript 的情況下使用它,減少了前端項(xiàng)目的復(fù)雜度。
          • 內(nèi)建的響應(yīng)式設(shè)計(jì)修飾符:Bulma 提供了一系列修飾符用于創(chuàng)建響應(yīng)式設(shè)計(jì),使得適應(yīng)不同屏幕尺寸的布局變得簡(jiǎn)單。
          • 組件化:如導(dǎo)航欄、模態(tài)框、標(biāo)簽頁(yè)等,Bulma 提供了豐富的組件庫(kù),方便開(kāi)發(fā)者快速實(shí)現(xiàn)常見(jiàn)的 UI 功能。
          • 通過(guò) Sass 可擴(kuò)展:Bulma 允許通過(guò) Sass 進(jìn)行定制,開(kāi)發(fā)者可以根據(jù)項(xiàng)目需求調(diào)整顏色、間距等參數(shù)。

          如何在項(xiàng)目中集成 Bulma

          將 Bulma 集成到項(xiàng)目中相當(dāng)簡(jiǎn)單,只需導(dǎo)入 Bulma 的 CSS 文件即可開(kāi)始使用它提供的各種樣式和組件。以下是一個(gè)使用 Bulma 創(chuàng)建分頁(yè)導(dǎo)航的示例:

          import 'bulma/css/bulma.min.css';
          
          export function Bulma() {
            return (
              <div>
                <nav className="pagination" role="navigation" aria-label="pagination">
                  <a href="/" className="pagination-previous">
                    Previous
                  </a>
                  <a href="/" className="pagination-next">
                    Next Page
                  </a>
                  <ul className="pagination-list">
                    <li>
                      <a href="/" className="pagination-link" aria-label="Goto page 1">
                        1
                      </a>
                    </li>
                    <li>
                      <span className="pagination-ellipsis">…</span>
                    </li>
                    <li>
                      <a href="/" className="pagination-link" aria-label="Goto page 45">
                        45
                      </a>
                    </li>
                    <li>
                      <a
                        href="/"
                        className="pagination-link is-current"
                        aria-label="Page 46"
                        aria-current="page"
                        46
                      </a>
                    </li>
                    <li>
                      <a href="/" className="pagination-link" aria-label="Goto page 47">
                        47
                      </a>
                    </li>
                    <li>
                      <span className="pagination-ellipsis">…</span>
                    </li>
                    <li>
                      <a href="/" className="pagination-link" aria-label="Goto page 86">
                        86
                      </a>
                    </li>
                  </ul>
                </nav>
              </div>
            );
          }
          

          這個(gè)例子展示了如何利用 Bulma 的分頁(yè)組件來(lái)創(chuàng)建一個(gè)簡(jiǎn)潔美觀的分頁(yè)導(dǎo)航。通過(guò)使用 Bulma,開(kāi)發(fā)者可以節(jié)省大量的時(shí)間來(lái)設(shè)計(jì)和編寫(xiě) CSS,專注于實(shí)現(xiàn)更好的用戶體驗(yàn)和界面設(shè)計(jì)。

          5. UIKit

          UIKit 是一個(gè)開(kāi)源的框架,專門(mén)用于構(gòu)建 Web 應(yīng)用程序的用戶界面。它與其他 UI 框架在結(jié)構(gòu)和設(shè)計(jì)哲學(xué)上有所不同。不同于其他遵循傳統(tǒng) BEM 方法論的框架,UIKit 采用了基于組件的結(jié)構(gòu)。這種方式為組件的靈活性和可重用性提供了更大的空間,可以顯著減少構(gòu)建復(fù)雜用戶界面所需的代碼量。

          UIKit 的主要特性

          • 模塊化和輕量級(jí)框架:UIKit 的設(shè)計(jì)注重于提供一個(gè)輕量級(jí)的解決方案,便于快速開(kāi)發(fā)和部署。
          • 響應(yīng)式柵格系統(tǒng):UIKit 提供了一個(gè)靈活的柵格系統(tǒng),使得在不同設(shè)備上的布局變得簡(jiǎn)單和一致。
          • 預(yù)設(shè)計(jì)的組件:UIKit 包含了大量預(yù)設(shè)計(jì)的組件,如導(dǎo)航欄、滑塊、模態(tài)框等,簡(jiǎn)化了開(kāi)發(fā)流程。
          • 基于 Flexbox 的布局:UIKit 利用 Flexbox 布局,提供了一種更靈活的方式來(lái)創(chuàng)建復(fù)雜的布局結(jié)構(gòu)。
          • 動(dòng)畫(huà)和過(guò)渡效果:UIKit 包含了豐富的動(dòng)畫(huà)和過(guò)渡效果,可以輕松地為界面添加視覺(jué)吸引力。
          • 可定制和可主題化:UIKit 提供了廣泛的定制選項(xiàng),使得開(kāi)發(fā)者可以根據(jù)自己的需求調(diào)整樣式和功能。

          如何在項(xiàng)目中集成 UIKit

          將 UIKit 集成到項(xiàng)目中非常直接,僅需導(dǎo)入 UIKit 的 CSS 文件即可開(kāi)始使用其提供的樣式和組件。以下是一個(gè)使用 UIKit 創(chuàng)建按鈕的示例:

          import 'uikit/dist/css/uikit.min.css';
          
          export function Uikit() {
            return (
              <div className="uk-flex uk-flex-center uk-margin-top">
                <button
                  type="button"
                  className="uk-button uk-button-default uk-margin-left"
                  onClick={() => alert('Cancel clicked!')}
                >
                  Cancel
                </button>
              </div>
            );
          }
          

          這個(gè)例子演示了如何利用 UIKit 的按鈕(Button)組件來(lái)創(chuàng)建一個(gè)簡(jiǎn)單的按鈕,并使用 Flexbox 實(shí)現(xiàn)居中布局。通過(guò) UIKit,開(kāi)發(fā)者可以享受到高度靈活和易用的界面構(gòu)建體驗(yàn),同時(shí)也能保持代碼的整潔和模塊化。

          總結(jié)

          選擇合適的 CSS 框架對(duì)于項(xiàng)目的成功至關(guān)重要。每個(gè)框架都有其獨(dú)特的特點(diǎn)、優(yōu)勢(shì)和可能的限制,因此了解如何根據(jù)項(xiàng)目的具體需求挑選合適的框架是一項(xiàng)重要的技能。除了我們討論的 Bootstrap、Tailwind CSS、Foundation、Bulma 和 UIKit 外,市面上還有許多其他的 CSS 框架,每個(gè)都有可能成為你項(xiàng)目的理想選擇。

          創(chuàng)建概念驗(yàn)證

          創(chuàng)建概念驗(yàn)證(Proof-of-Concept,PoC)是評(píng)估 CSS 框架是否適合你項(xiàng)目的一個(gè)極好方法。通過(guò)這種方式,你可以實(shí)際操作并體驗(yàn)每個(gè)框架的學(xué)習(xí)曲線、靈活性、易用性以及它們?nèi)绾芜m應(yīng)你的項(xiàng)目需求。以下是一些建議,幫助你通過(guò)創(chuàng)建概念驗(yàn)證來(lái)選擇正確的 CSS 框架:

          • 明確項(xiàng)目需求:在開(kāi)始之前,清晰地定義你的項(xiàng)目需求,包括預(yù)期的功能、設(shè)計(jì)美學(xué)、響應(yīng)式設(shè)計(jì)的要求等。
          • 研究框架的特性:深入了解每個(gè)框架的核心特性、設(shè)計(jì)理念和社區(qū)支持情況。
          • 評(píng)估學(xué)習(xí)曲線:嘗試了解開(kāi)始使用框架并達(dá)到一定熟練度所需的時(shí)間和努力,確保團(tuán)隊(duì)能夠快速上手。
          • 考慮擴(kuò)展性和維護(hù)性:選擇那些提供良好文檔、定期更新和社區(qū)支持的框架,以確保項(xiàng)目的長(zhǎng)期可維護(hù)性。
          • 實(shí)踐中測(cè)試:為每個(gè)框架創(chuàng)建小型的概念驗(yàn)證項(xiàng)目,實(shí)際操作它們來(lái)構(gòu)建一些簡(jiǎn)單的布局或組件。這將幫助你直觀地感受到使用框架的便利性和可能的挑戰(zhàn)。
          • 性能考量:測(cè)試每個(gè)框架生成的 CSS 的大小和加載時(shí)間,確保它們不會(huì)對(duì)最終用戶的體驗(yàn)產(chǎn)生負(fù)面影響。
          • 社區(qū)和資源:考慮框架的社區(qū)活躍度和可用資源。一個(gè)活躍的社區(qū)和豐富的學(xué)習(xí)資源可以在你遇到問(wèn)題時(shí)提供幫助。

          通過(guò)這種綜合評(píng)估方法,你可以更全面地理解每個(gè)框架如何適應(yīng)你的項(xiàng)目需求,從而做出明智的選擇。記住,最適合項(xiàng)目的框架不一定是最流行或最新的,而是最能滿足你項(xiàng)目特定需求的那一個(gè)。分享你的概念驗(yàn)證經(jīng)驗(yàn)和框架選擇理由,不僅能幫助團(tuán)隊(duì)成員理解決策過(guò)程,也能為面臨相似選擇的其他開(kāi)發(fā)者提供參考。

          天這篇文章主要分享 10 個(gè)鮮為人知的 CSS 技巧,這些技巧將成為你提高網(wǎng)頁(yè)設(shè)計(jì)技能的秘密武器。

          現(xiàn)在,我們就一起來(lái)看看這些CSS 技巧。

          01. 網(wǎng)站平滑滾動(dòng)

          在<html>元素中添加scroll-behavior: smooth,以實(shí)現(xiàn)整個(gè)頁(yè)面的平滑滾動(dòng)。

          html{
              scroll-behavior: smooth;
            }

          02.鏈接的屬性選擇器

          此選擇器的目標(biāo)是具有以“https”開(kāi)頭的 href 屬性的鏈接。

          a[href^="https"]{
              color: blue;
            }

          03.?合并兄弟姐妹

          選擇 <h2> 后面的所有兄弟元素 <p> 元素。

          h2 ~ p{
              color: blue;
            }

          04. :not() 偽類(lèi)

          該選擇器將樣式應(yīng)用于不具有“特殊”類(lèi)的列表項(xiàng)。

          li:not(.special){
                  font-stlye: italic;
              }

          05. 用于響應(yīng)式排版的視口單位

          使用視口單位(vw、vh、vmin、vmax)可以使字體大小響應(yīng)視口大小。

          h1{
              font-size: 5vw;
            }

          06. :empty 表示空元素

          此選擇器定位空的 <p> 元素并隱藏它們。

          p:empty{
              display: none;
            }
          
          

          07.自定義屬性(變量)

          您可以更輕松地定義和使用自定義屬性

          主題和維護(hù)。

          :root{
              --main-color: #3498db;
            }
          
          
            h1{
              color: var(--main-color);
            }

          08.圖像控制的Object-fit屬性

          object-fit 控制如何調(diào)整替換元素(如 <img>)的內(nèi)容大小。

          img{
              width: 100px; 
              height: 100px;
              object-fit: cover;
            }

          09. 簡(jiǎn)化布局的網(wǎng)格

          CSS 網(wǎng)格提供了一種以更簡(jiǎn)單的方式創(chuàng)建布局的強(qiáng)大方法。

          .container{
              display: grid;
              grid-tempalte-columns: 1fr 2fr 1fr;
           }

          10. :focus-in 偽類(lèi)

          如果該元素包含任何具有 :focus 的子元素,則 :focus-within 會(huì)選擇該元素。

          form:focus-within{
              box-shadow: 0 0 5px rgba(0, 0, 0, 0, 0.2);
           }

          總結(jié)

          以上就是我想與你分享的10個(gè)CSS技巧,希望對(duì)你有所幫助,如果你覺(jué)得有用的話,請(qǐng)記得點(diǎn)贊我關(guān)注我。


          主站蜘蛛池模板: 国产精品被窝福利一区 | 亚洲乱码av中文一区二区 | 狠狠做深爱婷婷综合一区 | 国产福利一区二区精品秒拍| 亚洲AV无码一区二区三区久久精品 | 亚洲日韩AV无码一区二区三区人| 怡红院AV一区二区三区| 无码精品视频一区二区三区| 国产高清视频一区二区| 亚洲av无码一区二区三区天堂 | 日本无卡码免费一区二区三区| 亚洲av午夜福利精品一区| 精品国产日韩亚洲一区在线| 少妇激情av一区二区| 久久精品国产一区二区| 国产亚洲综合一区二区三区 | 日韩好片一区二区在线看| 精品国产AⅤ一区二区三区4区 | 精品一区二区久久| 国产成人一区在线不卡| 国产精品女同一区二区久久| 日韩精品无码Av一区二区| 琪琪see色原网一区二区| 国产精品日韩一区二区三区| 国偷自产视频一区二区久| 精品一区二区三区四区电影| 国产嫖妓一区二区三区无码| 精品视频一区二区| 日本香蕉一区二区三区| 国产精品熟女视频一区二区| 无码人妻精品一区二区蜜桃百度 | 亚洲日韩一区二区一无码| 激情无码亚洲一区二区三区| 精品国产一区在线观看 | 精品少妇一区二区三区在线| 亚洲中文字幕无码一区 | 一区二区精品在线观看| 一区二区三区免费在线观看| 精品一区二区久久| 国产手机精品一区二区| 日本精品一区二区三区在线视频一|