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 毛片在线视频观看,国产成人精品免费视频动漫,中文字幕日韩精品一区口

          整合營銷服務(wù)商

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

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

          使用CSS變換為您的網(wǎng)站元素設(shè)置動(dòng)畫

          們都被移動(dòng)的物體和不尋常的方向所吸引。動(dòng)畫效果可用于改善用戶界面或吸引用戶注意項(xiàng)目的重要部分。

          在這篇文章中,我將向您展示如何應(yīng)用不同的轉(zhuǎn)換來改善您網(wǎng)站的可用性和設(shè)計(jì)。

          CSS轉(zhuǎn)換

          您可以使用CSS屬性以多種不同方式對(duì)網(wǎng)站元素進(jìn)行轉(zhuǎn)換,從而為網(wǎng)站元素添加效果 transform。此屬性允許您 使用各種變換函數(shù)旋轉(zhuǎn),縮放,移動(dòng)和傾斜元素。您還可以在鼠標(biāo)懸停或鼠標(biāo)單擊時(shí)觸發(fā)這些轉(zhuǎn)換。我將在以后的文章中介紹三維變換。

          讓我們看看每個(gè)轉(zhuǎn)換屬性函數(shù)。

          規(guī)模

          該 scale 函數(shù)允許您增加或減少元素的大小,即按元素縮放元素。

          例如,因子 2 會(huì)將元素的大小轉(zhuǎn)換為其原始大小的2倍。同樣,因子 0.4 會(huì)將其大小轉(zhuǎn)換為原始大小的0.4倍。

          我們來拍攝尺寸為200 * 200的圖像。

          HTML

          <img src = “pic.jpg” class = “element” width = “200” height = “200” >
          

          為圖像分配了一個(gè)名為“element”的類。

          為了使圖像大1.5倍,我們將使用 屬性的 scale 功能 transform。

          CSS

          .element:hover {
          	-webkit-transform: scale(1.5);
          	-moz-transform: scale(1.5);
          	-o-transform: scale(1.5);
          	transform: scale(1.5);
          }
          

          因?yàn)槲覀儗?.5作為參數(shù)傳遞給scale 函數(shù),所以上面的代碼會(huì)將圖像的寬度和高度都增加到原始圖像的1.5倍 。請注意,該 transform 屬性具有供應(yīng)商前綴 -webkit-, -moz- 并且 -o-。這些是為了獲得所有瀏覽器的最佳支持。

          要使轉(zhuǎn)換平滑,請使用該 transition 屬性。

          CSS

          .element{
          	-webkit-transition: transform .2s linear;
          	-moz-transition: transform .2s linear;
          	-o-transition: transform .2s linear;
          	transition: transform .2s linear;
          }
          .element:hover {
          	-webkit-transform: scale(1.5);
          	-moz-transform: scale(1.5);
          	-o-transform: scale(1.5);
          	transform: scale(1.5);
          }		
          

          這種轉(zhuǎn)換特性將使轉(zhuǎn)換線性發(fā)生0.2秒。將鼠標(biāo)懸停在下圖中可查看此轉(zhuǎn)換的實(shí)時(shí)演示。

          更具體地說,您可以使用 scaleX 和 scaleY 值分別縮放元素的寬度和高度。

          HTML

          <img src = “pic.jpg” class = “scale1” width = “200” height = “200” > 
          <img src = “pic.jpg” class = “scale2” width = “200” height = “200” >
          

          CSS

          .scale1{
          	-webkit-transition: transform .2s linear;
          	-moz-transition: transform .2s linear;
          	-o-transition: transform .2s linear;
          	transition: transform .2s linear;
          }
          .scale1:hover {
          	-webkit-transform: scaleX(1.2);
          	-moz-transform: scaleX(1.2);
          	-o-transform: scaleX(1.2);
          	transform: scaleX(1.2);
          }
          .scale2{
          	-webkit-transition: transform .2s linear;
          	-moz-transition: transform .2s linear;
          	-o-transition: transform .2s linear;
          	transition: transform .2s linear;
          }
          .scale2:hover {
          	-webkit-transform: scaleY(.8);
          	-moz-transform: scaleY(.8);
          	-o-transform: scaleY(.8);
          	transform: scaleY(.8);
          }
          

          在懸停在各個(gè)圖像上時(shí),具有類'scale1'的第一圖像的寬度將增加到其原始寬度的1.2倍,并且具有類'scale2'的第二圖像的高度將減小到其原始高度的0.8倍。嘗試將鼠標(biāo)懸停在以下圖像上。

          現(xiàn)在,考慮您希望將寬度增加到1.2倍并將高度同時(shí)降低到元素原始值的0.8倍的情況。為此,您必須為scale 以逗號(hào)分隔的函數(shù)提供兩個(gè)值 。第一個(gè)值將縮放其寬度,第二個(gè)值將縮放其高度。

          CSS

          .element{
          	-webkit-transition: transform .2s linear;
          	-moz-transition: transform .2s linear;
          	-o-transition: transform .2s linear;
          	transition: transform .2s linear;
          }
          .element:hover {
          	-webkit-transform: scale(1.2, .8);
          	-moz-transform: scale(1.2, .8);
          	-o-transform: scale(1.2, .8);
          	transform: scale(1.2, .8);
          }
          

          您還可以縮放其他CSS屬性,如 填充字體大小

          回轉(zhuǎn)

          這是該transform 物業(yè)的另一項(xiàng)功能 。使用此功能,您可以按任何方向旋轉(zhuǎn)元素,無論您想要哪個(gè)方向。正值將順時(shí)針旋轉(zhuǎn)元素,負(fù)值將逆時(shí)針旋轉(zhuǎn)。

          讓我們嘗試將圖像旋轉(zhuǎn)一定角度,盡管您可以旋轉(zhuǎn)幾乎任何像 div,span,headings或paragraph這樣的東西。 您也可以嘗試旋轉(zhuǎn)整個(gè)html體。聽起來怪怪的?試一試吧。

          HTML

          <img src = “pic.jpg” class = “rotate1” > 
          <img src = “pic.jpg” class = “rotate2” >
          

          CSS

          /* first image */
          .rotate1{
          	-webkit-transition: transform .2s linear;
          	-moz-transition: transform .2s linear;
          	-o-transition: transform .2s linear;
          	transition: transform .2s linear;
          }
          
          .rotate1:hover {
          	-webkit-transform: rotate(40deg);
          	-moz-transform: rotate(40deg);
          	-o-transform: rotate(40deg);
          	transform: rotate(40deg);
          }
          
          /* second image */
          .rotate2{
          	-webkit-transition: transform .2s linear;
          	-moz-transition: transform .2s linear;
          	-o-transition: transform .2s linear;
          	transition: transform .2s linear;
          }
          
          .rotate2:hover {
          	-webkit-transform: rotate(-40deg);
          	-moz-transform: rotate(-40deg);
          	-o-transform: rotate(-40deg);
          	transform: rotate(-40deg);
          }
          

          默認(rèn)情況下,該 rotate 函數(shù)沿Z軸旋轉(zhuǎn)元素。可以專門旋轉(zhuǎn)沿X,Y的元素,并使用Z軸的功能 rotateX, rotateY 和 rotateZ 分別。我們來看看如何。

          HTML

          <img src = “pic.jpg” class = “rotate1” > 
          <img src = “pic.jpg” class = “rotate2” > 
          <img src = “pic.jpg” class = “rotate3” >
          

          CSS

          /* first image */
          .rotate1{
          	-webkit-transition: transform 1s linear;
          	-moz-transition: transform 1s linear;
          	-o-transition: transform 1s linear;
          	transition: transform 1s linear;
          }
          .rotate1:hover {
          	-webkit-transform: rotateX(180deg);
          	-moz-transform: rotateX(180deg);
          	-o-transform: rotateX(180deg);
          	transform: rotateX(180deg);
          }
          /* second image */
          .rotate2{
          	-webkit-transition: transform 1s linear;
          	-moz-transition: transform 1s linear;
          	-o-transition: transform 1s linear;
          	transition: transform 1s linear;
          }
          .rotate2:hover {
          	-webkit-transform: rotateY(180deg);
          	-moz-transform: rotateY(180deg);
          	-o-transform: rotateY(180deg);
          	transform: rotateY(180deg);
          }
          /* third image */
          .rotate3{
          	-webkit-transition: transform .2s linear;
          	-moz-transition: transform .2s linear;
          	-o-transition: transform .2s linear;
          	transition: transform .2s linear;
          }
          .rotate3:hover {
          	-webkit-transform: rotateZ(40deg);
          	-moz-transform: rotateZ(40deg);
          	-o-transform: rotateZ(40deg);
          	transform: rotateZ(40deg);
          }
          

          第一和第二表情分別沿X和Y軸旋轉(zhuǎn)180度。第三個(gè)笑臉沿Z軸旋轉(zhuǎn)40度,這也是默認(rèn)的旋轉(zhuǎn)軸。

          您可以通過組合這些轉(zhuǎn)換來創(chuàng)建許多新組合。現(xiàn)在,讓我們轉(zhuǎn)到另一個(gè)轉(zhuǎn)換函數(shù)。

          翻譯

          您可以使用該translate 功能在水平,垂直或任何其他方向上移動(dòng)元素 。它只會(huì)改變應(yīng)用它的元素的位置,而不會(huì)中斷文檔的正常流動(dòng)。

          translateX 用于水平移動(dòng)元素。給出正值將使其向右移動(dòng)并向左移動(dòng)負(fù)值。 translateY 將在垂直方向移動(dòng)您的元素。同樣,正值會(huì)將其向下移動(dòng)并向上移動(dòng)負(fù)值。

          HTML

          <img src = “pic.jpg” class = “translate1” > 
          <img src = “pic.jpg” class = “translate2” >
          

          CSS

          /* first image */
          .translate1{
          	-webkit-transition: transform .2s linear;
          	-moz-transition: transform .2s linear;
          	-o-transition: transform .2s linear;
          	transition: transform .2s linear;
          }
          .translate1:hover {
          	-webkit-transform: translateX(40px);
          	-moz-transform: translateX(40px);
          	-o-transform: translateX(40px);
          	transform: translateX(40px);
          }
          /* second image */
          .rotate2{
          	-webkit-transition: transform .2s linear;
          	-moz-transition: transform .2s linear;
          	-o-transition: transform .2s linear;
          	transition: transform .2s linear;
          }
          .rotate2:hover {
          	-webkit-transform: translateY(20px);
          	-moz-transform: translateY(20px);
          	-o-transform: translateY(20px);
          	transform: translateY(20px);
          }
          

          使用該translateX 函數(shù)將第一圖像向右移動(dòng)40px, 使用該translateY 值向下移動(dòng)第二圖像20px 。您也可以同時(shí)水平和垂直移動(dòng)相同的元素。為此,您必須將兩個(gè)參數(shù)傳遞translate 給以逗號(hào)分隔的 函數(shù)。第一個(gè)值將水平移動(dòng)元素,而第二個(gè)值將垂直移動(dòng)元素。

          HTML

          <img src = “pic.jpg” class = “translate1” >
          

          CSS

          .translate1{
          	-webkit-transition: transform .2s linear;
          	-moz-transition: transform .2s linear;
          	-o-transition: transform .2s linear;
          	transition: transform .2s linear;
          }
          .translate1:hover {
          	-webkit-transform: translate(40px,20px);
          	-moz-transform: translate(40px,20px);
          	-o-transform: translate(40px,20px);
          	transform: translate(40px,20px);
          }
          

          上圖是跟隨懸停的路徑,其中最終位置向右40px,低于初始位置20px。

          瀏覽器支持

          google之外的所有瀏覽器都支持此屬性 。此外, IE 不支持 transform-style:preserve-3d 屬性,因此阻止了3D轉(zhuǎn)換元素的嵌套。

          結(jié)論

          如果適當(dāng)應(yīng)用,各種網(wǎng)站元素的位置和方向的微小動(dòng)畫轉(zhuǎn)換可以為您的網(wǎng)站設(shè)計(jì)帶來生命。這只是關(guān)于不同類型轉(zhuǎn)換的介紹和基本用法的帖子。這些可用于創(chuàng)建非常驚人的效果和動(dòng)畫,我將在以后的帖子中繼續(xù)介紹。

          歡迎加評(píng)論區(qū)討論。整理不易,祝給我收藏關(guān)注的大佬發(fā)大財(cái)emmm。

          markdown中寫下你的文章,并使用Python將它們轉(zhuǎn)換成HTML-作者Florian Dahlitz,于2020年5月18日(15分鐘)

          介紹

          幾個(gè)月前,我想開通自己的博客,而不是使用像Medium這樣的網(wǎng)站。這是一個(gè)非常基礎(chǔ)的博客,所有的文章都是HTML形式的。然而,有一天,我突然產(chǎn)生了自己編寫Markdown到HTML生成器的想法,最終這將允許我用markdown來編寫文章。此外,為它添加諸如估計(jì)閱讀時(shí)間之類的擴(kuò)展特性會(huì)更容易。長話短說,我實(shí)現(xiàn)了自己的markdown到HTML生成器,我真的很喜歡它!

          在本系列文章中,我想向您展示如何構(gòu)建自己的markdown到HTML生成器。該系列由三部分組成:

          • 第一部分(本文)介紹了整個(gè)管線的實(shí)現(xiàn)。

          • 第二部分通過一個(gè)模塊擴(kuò)展了實(shí)現(xiàn)的管線,該模塊用于計(jì)算給定文章的預(yù)計(jì)閱讀時(shí)間。

          • 第三部分演示如何使用管線生成自己的RSS摘要。

          這三部分中使用的代碼都可以在GitHub上找到。

          備注:我的文章中markdown到HTML生成器的想法基于Anthony Shaw文章中的實(shí)現(xiàn)。

          項(xiàng)目構(gòu)建

          為了遵循本文的內(nèi)容,您需要安裝幾個(gè)軟件包。我們把它們放進(jìn)requirements.txt文件。

          Markdown是一個(gè)包,它允許您將markdown代碼轉(zhuǎn)換為HTML。之后我們用Flask產(chǎn)生靜態(tài)文件。

          但在安裝之前,請創(chuàng)建一個(gè)虛擬環(huán)境,以避免Python安裝出現(xiàn)問題:

          激活后,您可以使用pip安裝requirements.txt中的依賴。

          很好!讓我們創(chuàng)建幾個(gè)目錄來更好地組織代碼。首先,我們創(chuàng)建一個(gè)app目錄。此目錄包含我們提供博客服務(wù)的Flask應(yīng)用程序。所有后續(xù)目錄都將在app目錄內(nèi)創(chuàng)建。其次,我們創(chuàng)建一個(gè)名為posts的目錄。此目錄包含要轉(zhuǎn)換為HTML文件的markdown文件。接下來,我們創(chuàng)建一個(gè)templates目錄,其中包含稍后使用Flask展示的模板。在templates目錄中,我們再創(chuàng)建兩個(gè)目錄:

          posts包含生成的HTML文件,這些文件與應(yīng)用程序根目錄中posts目錄中的文件相對(duì)應(yīng)。

          shared包含在多個(gè)文件中使用的HTML文件。

          此外,我們還創(chuàng)建了一個(gè)名為services的目錄。該目錄將包含我們在Flask應(yīng)用程序中使用的模塊,或者為它生成某些東西。最后,創(chuàng)建一個(gè)名為static的目錄帶有兩個(gè)子目錄images和css。自定義CSS文件和文章的縮略圖將存儲(chǔ)在此處。

          您的最終項(xiàng)目結(jié)構(gòu)應(yīng)如下所示:

          令人驚嘆!我們完成了一般的項(xiàng)目設(shè)置。我們來看看Flask的設(shè)置。

          Flask設(shè)置

          路由

          我們在上一節(jié)安裝了Flask。但是,我們?nèi)匀恍枰粋€(gè)Python文件來定義用戶可以訪問的端點(diǎn)。在app目錄中創(chuàng)建main.py并將以下內(nèi)容復(fù)制到其中。

          該文件定義了一個(gè)具有兩個(gè)端點(diǎn)的基礎(chǔ)版Flask應(yīng)用程序。用戶可以使用/route訪問第一個(gè)端點(diǎn)返回索引頁,其中列出了所有文章。

          第二個(gè)端點(diǎn)是更通用的端點(diǎn)。它接受post的名稱并返回相應(yīng)的HTML文件。

          接下來,我們通過向app目錄中添加一個(gè)__init__.py,將其轉(zhuǎn)換為一個(gè)Python包。此文件為空。如果您使用UNIX計(jì)算機(jī),則可以從項(xiàng)目的根目錄運(yùn)行以下命令:

          模板

          現(xiàn)在,我們創(chuàng)建兩個(gè)模板文件index.html以及l(fā)ayout.html,都存儲(chǔ)在templates/shared目錄中。這個(gè)layout.html模板將用于單個(gè)博客條目,而index.html模板用于生成索引頁,從中我們可以訪問每個(gè)帖子。讓我們從index.html模板開始。

          它是一個(gè)基本的HTML文件,其中有兩個(gè)元標(biāo)記、一個(gè)標(biāo)題和兩個(gè)樣式表。注意,我們使用一個(gè)遠(yuǎn)程樣式表和一個(gè)本地樣式表。遠(yuǎn)程樣式表用于啟用Bootstrap[1]類。第二個(gè)是自定義樣式。我們晚點(diǎn)再定義它們。

          HTML文件的主體包含一個(gè)容器,其中包含Jinja2[2]邏輯,用于為每個(gè)post生成Bootstrap卡片[3]。您是否注意到我們不直接基于變量名訪問這些值,而是需要將[0]添加到其中?這是因?yàn)槲恼轮薪馕龅脑獢?shù)據(jù)是列表。實(shí)際上,每個(gè)元數(shù)據(jù)元素都是由單一元素組成的列表。我們稍后再看。到目前為止,還不錯(cuò)。讓我們看看layout.html模板。

          如你所見,它比前一個(gè)短一點(diǎn),簡單一點(diǎn)。文件頭與index.html文件很相似,除了我們有不同的標(biāo)題。當(dāng)然,我們可以共用一個(gè)模板,但是我不想讓事情變得更復(fù)雜。

          body中的容器僅定義一個(gè)h1標(biāo)記。然后,我們提供給模板的內(nèi)容被插入并呈現(xiàn)。

          樣式

          正如上一節(jié)所承諾的,我們將查看自定義CSS文件style.css. 我們在static/css中找到該文件,并根據(jù)需要自定義頁面。下面是我們將用于基礎(chǔ)示例的內(nèi)容:

          我不喜歡Bootstrap中blockquotes的默認(rèn)外觀,所以我們在左側(cè)添加了一點(diǎn)間距和邊框。此外,blockquote段落底部的頁邊空白將被刪除。不刪除的話看起來很不自然。

          最后但并非最不重要的是,左右兩邊的填充被刪除。由于兩邊都有額外的填充,縮略圖沒有正確對(duì)齊,所以在這里刪除它們。

          到現(xiàn)在為止,一直都還不錯(cuò)。我們完成了關(guān)于Flask的所有工作。讓我們開始寫一些帖子吧!

          寫文章

          正如標(biāo)題所承諾的,你可以用markdown寫文章-是的!在寫文章的時(shí)候,除了保證正確的markdown格式外,沒有其他需要注意的事情。

          在完成本文之后,我們需要在文章中添加一些元數(shù)據(jù)。此元數(shù)據(jù)添加在文章之前,并由三個(gè)破折號(hào)分隔開來---。下面是一個(gè)示例文章(post1.md)的摘錄:

          注意:您可以在GitHub庫的app/posts/post1.md中找到完整的示例文章。

          在我們的例子中,元數(shù)據(jù)由標(biāo)題、副標(biāo)題、類別、發(fā)布日期和index.html中卡片對(duì)應(yīng)縮略圖的路徑組成.

          我們在HTML文件中使用了元數(shù)據(jù),你還記得嗎?元數(shù)據(jù)規(guī)范必須是有效的YAML。示例形式是鍵后面跟著一個(gè)冒號(hào)和值。最后,冒號(hào)后面的值是列表中的第一個(gè)也是唯一的元素。這就是我們通過模板中的索引運(yùn)算符訪問這些值的原因。

          假設(shè)我們寫完了文章。在我們可以開始轉(zhuǎn)換之前,還有一件事要做:我們需要為我們的帖子生成縮略圖!為了讓事情更簡單,只需從你的電腦或網(wǎng)絡(luò)上隨機(jī)選取一張圖片,命名它為placeholder.jpg并把它放到static/images目錄中。GitHub存儲(chǔ)庫中兩篇文章的元數(shù)據(jù)包含一個(gè)代表圖像的鍵值對(duì),值是placeholder.jpg。

          注意:在GitHub存儲(chǔ)庫中,您可以找到我提到的兩篇示例文章。

          markdown到HTML轉(zhuǎn)換器

          最后,我們可以開始實(shí)現(xiàn)markdown to HTML轉(zhuǎn)換器。因此,我們使用我們在開始時(shí)安裝的第三方包Markdown。我們先創(chuàng)建一個(gè)新模塊,轉(zhuǎn)換服務(wù)將在其中運(yùn)行。因此,我們在service目錄中創(chuàng)建了converter.py。我們一步一步看完整個(gè)腳本。您可以在GitHub存儲(chǔ)庫中一次查看整個(gè)腳本。

          首先,我們導(dǎo)入所需的所有內(nèi)容并創(chuàng)建幾個(gè)常量:

          ROOT指向我們項(xiàng)目的根。因此,它是包含app的目錄。

          POSTS_DIR是以markdown編寫的文章的路徑。

          TEMPLATE_DIR分別指向?qū)?yīng)的templates目錄。

          BLOG_TEMPLATE_文件存儲(chǔ)layout.html的路徑。

          INDEX_TEMPLATE_FILE是index.html

          BASE_URL是我們項(xiàng)目的默認(rèn)地址,例如。https://florian-dahlitz.de.默認(rèn)值(如果不是通過環(huán)境變量DOMAIN提供的話)是http://0.0.0.0:5000。

          接下來,我們創(chuàng)建一個(gè)名為generate_entries的新函數(shù)。這是我們定義的唯一一個(gè)轉(zhuǎn)換文章的函數(shù)。

          在函數(shù)中,我們首先獲取POSTS_DIR目錄中所有markdown文件的路徑。pathlib的awesome glob函數(shù)幫助我們實(shí)現(xiàn)它。

          此外,我們定義了Markdown包需要使用的擴(kuò)展。默認(rèn)情況下,本文中使用的所有擴(kuò)展都隨它的安裝一起提供。

          注意:您可以在文檔[4]中找到有關(guān)擴(kuò)展的更多信息。

          此外,我們實(shí)例化了一個(gè)新的文件加載程序,并創(chuàng)建了一個(gè)在轉(zhuǎn)換項(xiàng)目時(shí)使用的環(huán)境。隨后,將創(chuàng)建一個(gè)名為all_posts的空列表。此列表將包含我們處理后的所有帖子。現(xiàn)在,我們進(jìn)入for循環(huán)并遍歷POSTS_DIR中找到的所有文章。

          我們啟動(dòng)for循環(huán),并打印當(dāng)前正在處理的post的路徑。如果有什么東西出問題了,這尤其有用。然后我們就知道,哪個(gè)文章的轉(zhuǎn)換失敗了。

          接下來,我們在默認(rèn)url之后增加一部分。假設(shè)我們有一篇標(biāo)題為“面向初學(xué)者的Python”的文章。我們將文章存儲(chǔ)在一個(gè)名為python-for-beginners.md,的文件中,因此生成的url將是http://0.0.0.0:5000/posts/python-for-beginners。

          變量url_html存儲(chǔ)的字符串與url相同,只是我們在末尾添加了.html。我們使用此變量定義另一個(gè)稱為target_file.的變量。變量指向存儲(chǔ)相應(yīng)HTML文件的位置。

          最后,我們定義了一個(gè)變量md,它表示markdown.Markdown的實(shí)例,用于將markdown代碼轉(zhuǎn)換為HTML。您可能會(huì)問自己,為什么我們沒有在for循環(huán)之前實(shí)例化這個(gè)實(shí)例,而是在內(nèi)部實(shí)例化。當(dāng)然,對(duì)于我們這里的小例子來說,這沒有什么區(qū)別(只是執(zhí)行時(shí)間稍微短一點(diǎn))。但是,如果使用諸如腳注之類的擴(kuò)展來使用腳注,則需要為每個(gè)帖子實(shí)例化一個(gè)新實(shí)例,因?yàn)槟_注添加后就不會(huì)從此實(shí)例中刪除。因此,如果您的第一篇文章使用了一些腳注,那么即使您沒有明確定義它們,所有其他文章也將具有相同的腳注。

          讓我們轉(zhuǎn)到for循環(huán)中的第一個(gè)with代碼塊。

          實(shí)際上,with代碼塊打開當(dāng)前post并將其內(nèi)容讀入變量content。之后調(diào)用_md.convert將以markdown方式寫入的內(nèi)容轉(zhuǎn)換為HTML。隨后,env環(huán)境根據(jù)提供的模板BLOG_TEMPLATE_FILE(即layout.html如果你還記得的話)渲染生成的HTML。

          第二個(gè)with 代碼塊用于將第一個(gè)with 代碼塊中創(chuàng)建的文檔寫入目標(biāo)文件。

          以下三行代碼從元數(shù)據(jù)中獲取發(fā)布日期(被發(fā)布的日期),將其轉(zhuǎn)換為正確的格式(RFC 2822),并將其分配回文章的元數(shù)據(jù)。此外,生成的post_dict被添加到all_posts列表中。

          我們現(xiàn)在出了for循環(huán),因此,我們遍歷了posts目錄中找到的所有posts并對(duì)其進(jìn)行了處理。讓我們看看generate_entries函數(shù)中剩下的三行代碼。

          我們按日期倒序?qū)ξ恼逻M(jìn)行排序,所以首先顯示最新的文章。隨后,我們將文章寫到模板目錄一個(gè)新創(chuàng)建的index.html文件中。別把index.html錯(cuò)認(rèn)為templates/shared目錄中的那個(gè)。templates/shared目錄中的是模板,這個(gè)是我們要使用Flask服務(wù)的生成的。

          最后我們在函數(shù)generate_entries之后添加以下if語句。

          這意味著如果我們通過命令行執(zhí)行文件,它將調(diào)用generate_entries函數(shù)。

          太棒了,我們完成了converter.py腳本!讓我們從項(xiàng)目的根目錄運(yùn)行以下命令來嘗試:

          您應(yīng)該看到一些正在轉(zhuǎn)換的文件的路徑。假設(shè)您編寫了兩篇文章或使用了GitHub存儲(chǔ)庫中的兩篇文章,那么您應(yīng)該在templates目錄中找到三個(gè)新創(chuàng)建的文件。首先是index.html,它直接位于templates目錄中,其次是templates/posts目錄中的兩個(gè)HTML文件,它們對(duì)應(yīng)于markdown文件。

          最后啟動(dòng)Flask應(yīng)用程序并轉(zhuǎn)到http://0.0.0.0:5000。

          總結(jié)

          太棒了,你完成了這個(gè)系列的第一部分!在本文中,您已經(jīng)學(xué)習(xí)了如何利用Markdown包創(chuàng)建自己的Markdown to HTML生成器。您實(shí)現(xiàn)了整個(gè)管線,它是高度可擴(kuò)展的,您將在接下來的文章中看到這一點(diǎn)。

          希望你喜歡這篇文章。一定要和你的朋友和同事分享。如果你還沒有,考慮在Twitter上關(guān)注我@DahlitzF或者訂閱我的通知,這樣你就不會(huì)錯(cuò)過任何即將發(fā)表的文章。保持好奇心,不斷編碼!

          參考文獻(xiàn)

          Bootstrap (http://getbootstrap.com/)

          Primer on Jinja Templating (https://realpython.com/primer-on-jinja-templating/)

          Bootstrap Card (https://getbootstrap.com/docs/4.4/components/card/)

          Python-Markdown Extensions (https://python-markdown.github.io/extensions/)

          Tweet

          英文原文:https://florian-dahlitz.de/blog/build-a-markdown-to-html-conversion-pipeline-using-python
          譯者:阿布銩

          HTML5和CSS3的世界里,2D和3D變換為網(wǎng)頁設(shè)計(jì)帶來了革命性的變化。通過簡單的CSS屬性,我們可以實(shí)現(xiàn)元素的平移、旋轉(zhuǎn)、縮放和傾斜等效果,從而創(chuàng)造出更加動(dòng)態(tài)和交互性的用戶體驗(yàn)。在本文中,我們將探索2D和3D變換的基本概念,并通過一些實(shí)例來演示它們的應(yīng)用。

          2D變換

          2D變換是指在平面內(nèi)對(duì)元素進(jìn)行操作,包括平移(translate)、旋轉(zhuǎn)(rotate)、縮放(scale)和傾斜(skew)。以下是一些基本的2D變換例子:

          平移(Translate)

          .translate-example {
            transform: translate(50px, 100px);
          }
          

          這個(gè)例子中,元素將沿X軸移動(dòng)50像素,沿Y軸移動(dòng)100像素。

          旋轉(zhuǎn)(Rotate)

          .rotate-example {
            transform: rotate(45deg);
          }
          

          在這個(gè)例子中,元素將圍繞其中心點(diǎn)旋轉(zhuǎn)45度。

          縮放(Scale)

          .scale-example {
            transform: scale(2, 3);
          }
          

          此處,元素的寬度放大到原來的2倍,高度放大到原來的3倍。

          傾斜(Skew)

          .skew-example {
            transform: skew(30deg, 20deg);
          }
          

          這個(gè)例子將使元素沿X軸傾斜30度,沿Y軸傾斜20度。

          3D變換

          3D變換引入了新的維度,即Z軸,為元素添加了深度感。3D變換包括3D平移(translate3d)、3D旋轉(zhuǎn)(rotateX/rotateY/rotateZ)、3D縮放(scale3d)等。

          3D平移(Translate3D)

          .translate3d-example {
            transform: translate3d(50px, 100px, 200px);
          }
          

          在這個(gè)例子中,元素沿X軸移動(dòng)50像素,沿Y軸移動(dòng)100像素,同時(shí)沿Z軸移動(dòng)200像素,產(chǎn)生一種深入屏幕的效果。

          3D旋轉(zhuǎn)(Rotate3D)

          .rotate3d-example {
            transform: rotateX(45deg);
          }
          

          這里,元素將圍繞X軸旋轉(zhuǎn)45度,創(chuàng)建出一個(gè)“翻頁”的效果。

          3D縮放(Scale3D)

          .scale3d-example {
            transform: scale3d(2, 2, 2);
          }
          

          此例中,元素在三個(gè)維度上均放大兩倍。

          實(shí)戰(zhàn)例子

          讓我們通過幾個(gè)具體的例子來看看2D和3D變換在實(shí)際應(yīng)用中的效果。

          例子1:創(chuàng)建一個(gè)簡單的卡片翻轉(zhuǎn)效果(2D)

          <div class="card">
            <div class="card-front">前面</div>
            <div class="card-back">背面</div>
          </div>
          
          .card {
            width: 200px;
            height: 300px;
            position: relative;
          }
          
          .card-front, .card-back {
            width: 100%;
            height: 100%;
            position: absolute;
            backface-visibility: hidden;
            transition: transform 0.6s;
          }
          
          .card-front {
            background-color: #fff;
            z-index: 2;
          }
          
          .card-back {
            background-color: #f1f1f1;
            transform: rotateY(180deg);
          }
          
          .card:hover .card-front {
            transform: rotateY(-180deg);
          }
          
          .card:hover .card-back {
            transform: rotateY(0deg);
          }
          

          當(dāng)鼠標(biāo)懸停在卡片上時(shí),前面的卡片會(huì)翻轉(zhuǎn)到背面。

          例子2:3D旋轉(zhuǎn)立方體

          <div class="cube">
            <div class="face front">前</div>
            <div class="face back">后</div>
            <div class="face left">左</div>
            <div class="face right">右</div>
            <div class="face top">上</div>
            <div class="face bottom">下</div>
          </div>
          
          .cube {
            position: relative;
            width: 200px;
            transform-style: preserve-3d;
            animation: spin 5s infinite linear;
          }
          
          .face {
            position: absolute;
            width: 200px;
            height: 200px;
            background-color: rgba(255, 255, 255, 0.7);
            border: 1px solid #ccc;
          }
          
          .front  { transform: translateZ(100px); }
          .back   { transform: translateZ(-100px) rotateY(180deg); }
          .left   { transform: rotateY(-90deg) translateZ(100px); }
          .right  { transform: rotateY(90deg) translateZ(100px); }
          .top    { transform: rotateX(90deg) translateZ(100px); }
          .bottom { transform: rotateX(-90deg) translateZ(100px); }
          
          @keyframes spin {
            from { transform: rotateY(0deg); }
            to { transform: rotateY(360deg); }
          }
          

          這個(gè)立方體會(huì)在頁面上無限旋轉(zhuǎn),展示了一個(gè)基本的3D效果。

          示例

          <!DOCTYPE html>
          <html lang="en">
          <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>2D & 3D Transform Example</title>
          <style>
            body {
              font-family: 'Arial', sans-serif;
              margin: 0;
              padding: 0;
              background: #f0f0f0;
              display: flex;
              justify-content: center;
              align-items: center;
              flex-direction: column;
              min-height: 100vh;
            }
          
            .btn-2d {
              padding: 10px 20px;
              margin: 20px;
              background-color: #007bff;
              color: white;
              border: none;
              border-radius: 5px;
              cursor: pointer;
              outline: none;
              transition: transform 0.3s ease;
            }
          
            .btn-2d:hover {
              transform: rotateZ(360deg);
            }
          
            .card-3d {
              width: 200px;
              height: 300px;
              perspective: 1000px;
              cursor: pointer;
              margin: 20px;
            }
          
            .card-inner {
              width: 100%;
              height: 100%;
              transition: transform 0.6s;
              transform-style: preserve-3d;
              position: relative;
            }
          
            .card-3d:hover .card-inner {
              transform: rotateY(180deg);
            }
          
            .card-face {
              position: absolute;
              width: 100%;
              height: 100%;
              backface-visibility: hidden;
              display: flex;
              align-items: center;
              justify-content: center;
              border-radius: 10px;
              color: white;
              font-size: 24px;
              box-shadow: 0 4px 8px rgba(0,0,0,0.1);
            }
          
            .card-front {
              background: #007bff;
            }
          
            .card-back {
              background: #ff5722;
              transform: rotateY(180deg);
            }
          
            .scene {
              width: 200px;
              height: 200px;
              perspective: 600px;
              margin: 20px;
            }
          
            .cube {
              width: 100%;
              height: 100%;
              position: relative;
              transform-style: preserve-3d;
              transform: rotateX(-30deg) rotateY(-45deg);
              animation: rotateCube 5s infinite linear;
            }
          
            .face {
              position: absolute;
              width: 200px;
              height: 200px;
              background: rgba(255, 255, 255, 0.9);
              border: 1px solid #ccc;
            }
          
            .front  { transform: translateZ(100px); }
            .back   { transform: rotateY(180deg) translateZ(100px); }
            .right  { transform: rotateY(90deg) translateZ(100px); }
            .left   { transform: rotateY(-90deg) translateZ(100px); }
            .top    { transform: rotateX(90deg) translateZ(100px); }
            .bottom { transform: rotateX(-90deg) translateZ(100px); }
          
            @keyframes rotateCube {
              0% { transform: rotateX(-30deg) rotateY(-45deg); }
              100% { transform: rotateX(-30deg) rotateY(315deg); }
            }
          
          </style>
          </head>
          <body>
          
          <button class="btn-2d">Click Me!</button>
          
          <div class="card-3d">
            <div class="card-inner">
              <div class="card-face card-front">
                Front Side
              </div>
              <div class="card-face card-back">
                Back Side
              </div>
            </div>
          </div>
          
          <div class="scene">
            <div class="cube">
              <div class="face front"></div>
              <div class="face back"></div>
              <div class="face right"></div>
              <div class="face left"></div>
              <div class="face top"></div>
              <div class="face bottom"></div>
            </div>
          </div>
          
          </body>
          </html>
          

          • .btn-2d 類定義了一個(gè)按鈕,當(dāng)鼠標(biāo)懸停時(shí),它會(huì)應(yīng)用一個(gè) 2D 旋轉(zhuǎn) (rotateZ) 動(dòng)畫。
          • .card-3d 類定義了一個(gè) 3D 翻轉(zhuǎn)卡片的容器,設(shè)置了 perspective 屬性,這是實(shí)現(xiàn) 3D 翻轉(zhuǎn)效果的關(guān)鍵。
          • .card-inner 類定義了卡片的內(nèi)部元素,它將在鼠標(biāo)懸停時(shí)圍繞 Y 軸旋轉(zhuǎn) (rotateY) 180 度,這是通過 .card-3d:hover .card-inner 選擇器設(shè)置的。
          • .card-face 類定義了卡片的正反兩面,使用了 backface-visibility 屬性來在翻轉(zhuǎn)時(shí)隱藏背面。
          • .card-front 和 .card-back 類為卡片的前后面分別設(shè)置了不同的背景顏色。
          • .scene 類定義了一個(gè) 3D 場景的容器,設(shè)置了 perspective 屬性,以便為其中的 3D 對(duì)象創(chuàng)建透視效果。
          • .cube 類定義了正方體的容器,它使用 transform-style: preserve-3d 來保持其子元素的 3D 空間位置。這個(gè)容器還應(yīng)用了一個(gè)連續(xù)旋轉(zhuǎn)的動(dòng)畫,使正方體不斷旋轉(zhuǎn)。
          • .face 類定義了正方體的每個(gè)面,每個(gè)面都是一個(gè)絕對(duì)定位的正方形,具有邊框和背景顏色。
          • .front、.back、.right、.left、.top 和 .bottom 類分別定義了正方體的六個(gè)面的位置,每個(gè)面都通過 translateZ 被推到其應(yīng)在的位置。

          結(jié)語

          通過本文的介紹,我們了解了2D和3D變換的基本概念以及它們在實(shí)際應(yīng)用中的一些例子。隨著技術(shù)的進(jìn)步,現(xiàn)代瀏覽器對(duì)這些效果的支持越來越好,而我們作為開發(fā)者,可以利用這些工具創(chuàng)造出更加豐富和生動(dòng)的網(wǎng)頁體驗(yàn)。記得在使用這些技術(shù)時(shí)保持平衡,確保它們增強(qiáng)而不是干擾用戶的體驗(yàn)。


          主站蜘蛛池模板: 精品国产一区二区三区AV| 国产成人精品一区二区三区| 中文字幕av一区| 亚洲日韩AV一区二区三区四区| 久热国产精品视频一区二区三区| 日韩精品人妻一区二区三区四区| 毛片一区二区三区| 国产在线观看91精品一区 | 免费无码一区二区三区蜜桃大| 色欲AV蜜桃一区二区三| 国产丝袜美女一区二区三区| 亚州国产AV一区二区三区伊在| 精品一区二区三区AV天堂| 国产福利一区二区在线视频| 亚洲午夜精品一区二区| 国产成人午夜精品一区二区三区 | 无码欧精品亚洲日韩一区| 美女视频在线一区二区三区| 亚洲国产一区在线| 亚洲第一区二区快射影院| 人妻无码第一区二区三区| 精品久久国产一区二区三区香蕉| 日韩精品无码中文字幕一区二区| 精品一区精品二区| 一区二区精品在线| 亚洲爆乳精品无码一区二区| 国产一区二区三区不卡在线看| 一区二区三区视频免费| 美女福利视频一区| 精品乱码一区内射人妻无码| 中文字幕一区视频一线| 日韩一区二区三区四区不卡| 合区精品久久久中文字幕一区| 中文字幕日韩一区二区三区不卡| 国产一区二区三区樱花动漫| 免费播放一区二区三区| 亚洲人AV永久一区二区三区久久| 精品深夜AV无码一区二区| 亚洲中文字幕丝袜制服一区 | 国产精品 一区 在线| 中文字幕一区二区三区久久网站 |