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
載說(shuō)明:原創(chuàng)不易,未經(jīng)授權(quán),謝絕任何形式的轉(zhuǎn)載
在這篇文章中,我們將介紹一些最受歡迎的HTML、React、NextJS和Tailwind CSS模板。使用模板來(lái)進(jìn)行項(xiàng)目開(kāi)發(fā)的一個(gè)很大的優(yōu)勢(shì)是,你可以避免從頭開(kāi)始創(chuàng)建項(xiàng)目,而是使用模板并進(jìn)行一些微小的調(diào)整以適應(yīng)你的需求。這樣可以節(jié)省時(shí)間,你可以利用這些時(shí)間來(lái)增強(qiáng)項(xiàng)目的功能。
此外,借助這些模板,你還可以更快地完成工作。讓我們現(xiàn)在開(kāi)始,不再拖延!
HTML5 UP
https://html5up.net/
提供了一系列免費(fèi)的響應(yīng)式HTML模板。這些模板都具有現(xiàn)代化的設(shè)計(jì)風(fēng)格和優(yōu)雅的布局,適用于各種類型的網(wǎng)站和項(xiàng)目。每個(gè)模板都提供了豐富的功能和定制選項(xiàng),使你能夠輕松地創(chuàng)建出令人印象深刻的網(wǎng)站。
你可以在網(wǎng)站上瀏覽不同的模板,每個(gè)模板都有預(yù)覽圖和詳細(xì)的描述,展示了它的特色和用途。你可以選擇一個(gè)你喜歡的模板,并下載相應(yīng)的文件。下載后,你可以根據(jù)自己的需求進(jìn)行修改和定制,以適應(yīng)你的項(xiàng)目。
無(wú)論你是初學(xué)者還是有經(jīng)驗(yàn)的開(kāi)發(fā)者,這些模板都是一個(gè)很好的起點(diǎn)。它們提供了一個(gè)快速且可靠的方法,讓你在項(xiàng)目中使用現(xiàn)成的設(shè)計(jì)和布局,并根據(jù)需要進(jìn)行個(gè)性化調(diào)整。
Free HTML web themes
https://www.graphberry.com/category/free-html-web-templates
這個(gè)網(wǎng)站提供了一系列免費(fèi)的HTML網(wǎng)頁(yè)模板。這些模板經(jīng)過(guò)精心設(shè)計(jì),涵蓋了各種不同類型的網(wǎng)頁(yè)需求,包括企業(yè)網(wǎng)站、個(gè)人簡(jiǎn)歷、博客、電子商務(wù)等。
在該網(wǎng)站上,你可以瀏覽不同的模板分類,并點(diǎn)擊查看每個(gè)模板的詳細(xì)信息和預(yù)覽圖。每個(gè)模板都提供了下載鏈接,你可以免費(fèi)下載所需的文件。這些模板通常包括HTML、CSS和JavaScript等文件,你可以根據(jù)自己的需求進(jìn)行修改和定制。
這些模板的設(shè)計(jì)風(fēng)格各不相同,但都注重美觀和用戶體驗(yàn)。它們提供了一個(gè)快速啟動(dòng)網(wǎng)頁(yè)項(xiàng)目的方式,讓你節(jié)省時(shí)間和精力,無(wú)需從頭開(kāi)始構(gòu)建網(wǎng)頁(yè)。你可以根據(jù)模板進(jìn)行一些微調(diào)和定制,以滿足你的具體需求。
對(duì)于那些剛剛開(kāi)始學(xué)習(xí)前端開(kāi)發(fā)或者需要快速建立網(wǎng)頁(yè)項(xiàng)目的人來(lái)說(shuō),這些免費(fèi)HTML網(wǎng)頁(yè)模板是一個(gè)很好的資源。它們?yōu)槟闾峁┝艘粋€(gè)基礎(chǔ)結(jié)構(gòu),使你能夠快速創(chuàng)建出具有吸引力和功能性的網(wǎng)頁(yè)。
每個(gè)需求都有免費(fèi)的現(xiàn)代化React和Tailwind模板
https://treact.owaiskhan.me/
這個(gè)合集真是令人驚嘆。在這里,你可以找到用TailwindCSS構(gòu)建的現(xiàn)代化React UI模板和組件,它們不僅輕量、安裝迅速,而且易于適應(yīng)。所有組件都完全響應(yīng)式,品牌顏色也可以完全自定義。無(wú)論是商業(yè)用途還是個(gè)人使用,都可以免費(fèi)使用。
React落地頁(yè)
這是一個(gè)簡(jiǎn)單的落地頁(yè),使用Reactjs構(gòu)建,包含了產(chǎn)品、特點(diǎn)、價(jià)格、關(guān)于等幾個(gè)部分。
https://react-landing-page-template-2021.vercel.app/
4+ 免費(fèi)的 Nextjs 模板
https://www.creative-tim.com/templates/nextjs
36個(gè)免費(fèi)的 Nextjs 模板
這也是一個(gè)不錯(cuò)的Next主題、起始模板和模板合集。
https://jamstackthemes.dev/ssg/next/
10個(gè)免費(fèi)的Nextjs模板
https://www.wrappixel.com/templates/category/nextjs-templates/?product_orderby=freebies
Nextjs 模板集合
https://vercel.com/templates
在這些可用選項(xiàng)中搜索你的模板,以加快應(yīng)用程序的開(kāi)發(fā)速度。這是來(lái)自Vercel的一份精彩的Next.js模板合集。在這里,你可以從各種各樣的分類中進(jìn)行選擇。
https://www.creative-tim.com/templates/tailwind-free
這個(gè)Tailwind CSS模板合集非常棒。它們提供了免費(fèi)的Tailwind CSS UI套件和管理儀表板。你應(yīng)該去看看。
https://themewagon.com/theme-framework/tailwind-css/
這是一個(gè)令人驚嘆的資源,你可以在這里找到免費(fèi)的響應(yīng)式Tailwind CSS組件。通過(guò)查看下載這些模板的人數(shù)統(tǒng)計(jì),你可以發(fā)現(xiàn)它們擁有頂級(jí)的管理儀表板和落地頁(yè)模板。如果你愿意付費(fèi),它們也提供付費(fèi)選項(xiàng)。
https://tailwindtemplates.co/templates
發(fā)現(xiàn)并下載2023年最佳的免費(fèi)和付費(fèi)Tailwind CSS模板!無(wú)論你需要一個(gè)落地頁(yè)、管理儀表板還是一個(gè)完整的網(wǎng)頁(yè)模板,我們都為你提供了高質(zhì)量且易于使用的設(shè)計(jì)。Tailwind CSS是一個(gè)廣受歡迎的基于實(shí)用主義的CSS框架,以其模塊化和可伸縮的架構(gòu)脫穎而出。通過(guò)遵循樣式的自然順序,它能夠避免傳統(tǒng)CSS中的混亂代碼。使用Tailwind,你不再需要擔(dān)心瀏覽器兼容性或錯(cuò)誤,它為你簡(jiǎn)化了編碼和設(shè)計(jì)過(guò)程。通過(guò)我們的Tailwind CSS模板,將你的網(wǎng)站提升到新的水平!
在你的項(xiàng)目或落地頁(yè)中使用這些內(nèi)置的開(kāi)源Tailwind UI模板和組件,可以節(jié)省時(shí)間。現(xiàn)有超過(guò)600個(gè)免費(fèi)的模板和組件可供使用。
https://tailwindcomponents.com/
https://www.tailwindawesome.com/?price=free&type=template
這個(gè)網(wǎng)站真是令人難以置信。我相信如果你在那里搜索,你肯定會(huì)找到你所需的模板。無(wú)論你需要電子商務(wù)、個(gè)人作品集、創(chuàng)業(yè)落地頁(yè)還是管理儀表板,他們都有大量可用的模板。
每周,你都會(huì)獲得一個(gè)使用React、Next JS和Gatsby JS開(kāi)發(fā)的免費(fèi)落地頁(yè)模板。他們的落地頁(yè)非常出色。如果你正在尋找落地頁(yè),不妨去看一看。
https://startuplanding.redq.io/
由于文章內(nèi)容篇幅有限,今天的內(nèi)容就分享到這里,文章結(jié)尾,我想提醒您,文章的創(chuàng)作不易,如果您喜歡我的分享,請(qǐng)別忘了點(diǎn)贊和轉(zhuǎn)發(fā),讓更多有需要的人看到。同時(shí),如果您想獲取更多前端技術(shù)的知識(shí),歡迎關(guān)注我,您的支持將是我分享最大的動(dòng)力。我會(huì)持續(xù)輸出更多內(nèi)容,敬請(qǐng)期待。
eduza是簡(jiǎn)約時(shí)尚和現(xiàn)代的博客HTML模板,帶商店電商元素的博客頁(yè)面。考慮所有的作品集網(wǎng)站需求頁(yè)可以設(shè)計(jì)一個(gè)旅游網(wǎng)站。原生響應(yīng)設(shè)計(jì)HTML5和CSS3(臺(tái)式機(jī)、平板電腦、手機(jī)…)簡(jiǎn)單,干凈的和專業(yè)的網(wǎng)站模板。
> 搜索模式
> 菜單漢堡
> 滑塊
> html 5和CSS 3
> 干凈、創(chuàng)意、現(xiàn)代和美麗的設(shè)計(jì)
> 充分響應(yīng),兼容所有的屏幕大小
> 組織良好的文件
> 良好的注釋代碼
> 容易定制
> 主流瀏覽器兼容性
> 良好的文檔記錄
> W3C有效標(biāo)記
紹
cJinja 是一個(gè)使用cpp編寫(xiě)的輕量html模版解析庫(kù),依賴 ejson 來(lái)實(shí)現(xiàn)模版的數(shù)據(jù)替換(在jinja中稱為context,上下文)。模版的語(yǔ)法基本與django jinja一致,功能還算豐富。源碼僅有700行,適合學(xué)習(xí),覺(jué)得不錯(cuò)的點(diǎn)個(gè)star吧。
(該程序?yàn)?https://github.com/HuangHongkai/tinyserver 中的一個(gè)模塊)
編譯
使用cmake來(lái)編譯,windows和linux下均可編譯。推薦使用clion作為IDE。
編譯成功后在build目錄下會(huì)有l(wèi)ibcjinja.a和cjinja_test.exe這2個(gè)文件。libcjinja.a是靜態(tài)庫(kù),cjinja_test.exe是一個(gè)簡(jiǎn)單的測(cè)試程序。
運(yùn)行測(cè)試程序后會(huì)出現(xiàn)output.html(該文件是tmp.html解析后的結(jié)果。)
已經(jīng)完成的功能
需要注意,表達(dá)式之間不能含有空格,例如{{ 1 + 1 }}是非法的,而{{ 1+1 }}是合法的。
使用方法
1. 變量和變量索引
簡(jiǎn)單的例子如下,
HtmlTemplate html("username:{{ username }}\n" "parm.list[1][2]: {{parm.list[1][2] }} \n" "parm.key: {{ parm.key }}", 1); // 參數(shù)1表示傳入的是模版字符串,0表示傳入的是文件名,默認(rèn)為0 JSONObject obj = { {"username", 1234}, {"parm", { {"key", "cde"}, {"list", {1, {1,2.3, "abcd"}, "hahaha"}}, }} }; html.setValue(obj); cout << html.render() << endl << endl; /* 運(yùn)行后打印如下 username:1234 parm.list[1]: abcd parm.key: cde */
HtmlTemplate是一個(gè)庫(kù)的主要類,構(gòu)造函數(shù)為
explicit HtmlTemplate(const string& str, int flag = 0); // flag=0是str表示文件路徑,不為0是表示傳入的模版字符串
其中str參數(shù)為字符串,可以表示html模板原始串,也可也表示為文件的路徑,flag默認(rèn)為0。
setValue 方法表示傳入數(shù)據(jù)給模版對(duì)象。
render() 方法表示將模版解析成字符串。
JSONObject來(lái)源于 ejson 庫(kù),用來(lái)模擬python的dict,構(gòu)造函數(shù)也比較容易看懂。
2. 列表迭代
HtmlTemplate html("{% for x in list %}{{ x }}\n{%endfor%}" "此時(shí)x已經(jīng)是臨時(shí)變量了,不可以在打印了 {{x}}\n" , 1); JSONObject obj = OBJECT( KEYVALUE("list", LIST(1,2,3,4,5)) ); cout << html.setValue(obj).render() << endl << endl; /*運(yùn)行后輸出如下 1 2 3 4 5 此時(shí)x已經(jīng)是臨時(shí)變量了,不可以在打印了 */
注意到在迭代過(guò)程中x是作為臨時(shí)變量,在外部的話是無(wú)法打印出來(lái)的。
3. 字典迭代
HtmlTemplate html("{% for key in dict %}迭代1: 字典的key值為 {{ key }}\n{% endfor %}" "{% for key,value in dict %}迭代2: 字典的key值為 {{ key }}, value值為 {{ value}}\n{% endfor %}" "{% for ,value in dict %}迭代3: 字典的value值為 {{ value }}\n{% endfor %}", 1); JSONObject obj = OBJECT( KEYVALUE("dict", OBJECT( KEYVALUE("key1", "value1"), KEYVALUE("key2", 1234), KEYVALUE("key3", nullptr), )) ); cout << html.setValue(obj).render() << endl << endl; /*運(yùn)行后輸出 迭代1: 字典的key值為 key1 迭代1: 字典的key值為 key2 迭代1: 字典的key值為 key3 迭代2: 字典的key值為 key1, value值為 value1 迭代2: 字典的key值為 key2, value值為 1234 迭代2: 字典的key值為 key3, value值為 null 迭代3: 字典的value值為 value1 迭代3: 字典的value值為 1234 迭代3: 字典的value值為 null */
4. 字符串拼接與表達(dá)式計(jì)算
HtmlTemplate html("{{ a+b+c+\"444\" }}\n" "{{x}} * {{y}} + 2 * 3 - 4 / {{x}} = {{ x*y+2*3-4/x }}\n", 1); JSONObject obj = OBJECT( KEYVALUE("a", "111"), KEYVALUE("b", "222"), KEYVALUE("c", "333"), KEYVALUE("x", 12), KEYVALUE("y", 34) ); cout << html.setValue(obj).render() << endl << endl; /*運(yùn)行后輸出 111222333444 12 * 34 + 2 * 3 - 4 / 12 = 413.667 */
5. if-else-endif語(yǔ)句
HtmlTemplate html("{% if 1==1 %} 1==1 成立 {% else %} 1==1不成立 {%endif %}\n" "{% if !x %} x為空 {% else %} x不為空 {%endif %}\n" "{% if x==2 %} x==2 成立 {% endif %}\n" "{% if x+1!=2 %} x+1!=2 成立 {% endif %}\n" "{% if x<3 %} x<3 成立 {% endif %}\n" "{% if x>1 %} x>1 成立 {% endif %}\n" "{% if str==\"abcd\" %} str為abcd {% endif %}\n" "{% if 1 %} 常量表達(dá)式1 {% endif %}\n" "{% if 0 %} 常量表達(dá)式0,此處不會(huì)輸出 {%endif%}", 1); JSONObject obj = { {"x", 2}, {"str", "abcd"} }; cout << html.setValue(obj).render() << endl; /*運(yùn)行后輸出 1==1 成立 x不為空 x==2 成立 x+1!=2 成立 x<3 成立 x>1 成立 str為abcd 常量表達(dá)式1 */
6.for與if嵌套使用
HtmlTemplate html("{%for x in list%}" "{%if x %}" "{% for y in list2%}" "{{x}} * {{y}} = {{ x*y }}\n" "{% endfor %}" "{% else %}" "x的值為空\(chéng)n" "{%endif%}" "{% endfor%}", 1); JSONObject obj = OBJECT( KEYVALUE("list", LIST(1,2,3,4,5)), KEYVALUE("list2", LIST(1,2,3)), ); cout << html.setValue(obj).render() << endl << endl; /*運(yùn)行后輸出 1 * 1 = 1 1 * 2 = 2 1 * 3 = 3 2 * 1 = 2 2 * 2 = 4 2 * 3 = 6 3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 */
7.模版文件作為輸出
HtmlTemplate html("tmpl.html"); JSONObject context = OBJECT( ... ); FILE* f = fopen("output.html", "w"); // 寫(xiě)入到文件中 string&& str = html.setValue(context).render(); fwrite(str.c_str(), 1, str.size(), f); fclose(f); /*運(yùn)行后,代開(kāi)當(dāng)前目錄的tmpl.html文件作為輸入,輸出文件為output.html*/ /*如果tmpl.html不存在則拋出異常*/
8. 異常處理
HtmlTemplate html("{% if 1 %} xxx ", 1); // 不傳入context try { cout << html.render() << endl; } catch(exception& e) { cerr << e.what() << endl; } cout << endl;
運(yùn)行后終端上打印如下,
會(huì)提示異常的類名,異常文件所在位置,代碼行數(shù),以及一些錯(cuò)誤的信息。
討論
1. 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的表達(dá)式計(jì)算器用什么方法比較好?(例如 {{ 2.3*3+4/5*x }} 這類表達(dá)式)
我分享一下我自己的方法,有什么更好的方法一起討論一下。
double cJinja::HtmlTemplate::calculator(vector<any>& number, vector<char>& op) { // 例如下表達(dá)式會(huì)成為 // 1 - 2 - 3 + 2 *3 * 4 - 4*5 // vector<char> op = { '-', '-', '+', '*', '*', '-', '*' }; // vector<any> number = { 1, 2, 3, 2, 3, 4, 4, 5 }; if (number.size() != op.size() + 1) throwException(TemplateParseException, "運(yùn)算符號(hào)數(shù)和操作數(shù)不匹配"); /* 定義計(jì)算器的內(nèi)部函數(shù) */ auto calc = [](any& var1, double var2, char op) -> double{ // var2 + var1 // var2 * var1 // var2 - var1 // var2 / var1 // 注意順序 #define CALC(op2) \ if(#op2[0] == op) { \ if (var1.type() == typeid(int)) \ return var2 op2 static_cast<double>(any_cast<int>(var1)); \ else if (var1.type() == typeid(float)) \ return var2 op2 static_cast<double>(any_cast<float>(var1)) ; \ else if (var1.type() == typeid(double)) \ return var2 op2 static_cast<double>(any_cast<double>(var1)) ; \ } CALC(+); CALC(-); CALC(*); CALC(/); throwException(TemplateParseException, "不允許對(duì)空指針進(jìn)行運(yùn)算"); #undef CALC }; vector<double> num_stack; // 計(jì)算中間結(jié)果存儲(chǔ)棧 num_stack.push_back(calc(number[0], 0, '+')); // 獲取值 number[i+1] + 0 (加法運(yùn)算零元為0,乘法運(yùn)算零元為1) /* 計(jì)算 * / 法*/ for (size_t i = 0; i < op.size(); i++) { if (op[i] == '+' || op[i] == '-') { num_stack.push_back(calc(number[i + 1], 0, '+')); // number[i+1] + 0 } else if (op[i] == '*' || op[i] == '/') { double var1 = num_stack.back(); num_stack.pop_back(); num_stack.push_back(calc(number[i + 1], var1, op[i])); // var1/number[i+1] 或者是 var1/number[i+1] } else throwException(TemplateParseException, str_format("非法操作符 %d", op[i])); } /* 計(jì)算 + - 法*/ double result = num_stack[0]; size_t i = 1; for (auto& ch : op) { if (ch == '+') { result += num_stack[i++]; } else if(ch == '-') { result -= num_stack[i++]; } } return result; }
2. 拋出異常包含更多的信息
我定義了一個(gè)throwException宏,如下
#define throwException(Exception, ...) { \ std::cerr << "[" << #Exception << "] : FILE: " << string(__FILE__).substr(string(__FILE__).find_last_of('/') + 1) << " LINE: " << __LINE__ << " FUNCTION: " <<__FUNCTION__ << std::endl; \ throw Exception(__VA_ARGS__); \ }
其中__FILE__ 為文件名,__LINE__ 為當(dāng)前代碼行數(shù),這些都是C中的內(nèi)置宏,__VA_ARGS__是可變參數(shù),對(duì)應(yīng)于宏函數(shù)參數(shù)中的....
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。