整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          html開發筆記08- 字體樣式與顏色(標簽的屬性)

          、標簽的分類:雙標簽和單標簽

          雙標簽:就是成對出現的,類似于這種 <html> </html>

          單標簽:就是可以單個使用的,類似于 <br> 換行標簽 或 <hr>水平線標簽。

          二、標簽屬性的作用:

          標簽的屬性是用來定義文字或字符的 顏色、寬高、粗細、大小、等,這個是標簽屬性的作用。


          三、標簽屬性的特性:

          1、每一個標簽都有自己的屬性,單標簽和雙標簽都有。

          2、一個標簽可以有多個屬性。

          3、每個屬性都有對應的值,值要用單或雙引號引起來。

          4、多個屬性之間使用空格隔開。

          5、屬性沒有順序之分。

          6、字體屬性值,必須是系統可以識別的字體,一般為系統自帶字體。

          7、HTML5 中 font 屬性已經棄用。

          源代碼:↓

          <!DOCTYPE html>

          <html lang="en">

          <head>

          <meta charset="UTF-8">

          <!--網頁抬頭-->

          <title>中央氣象局</title>

          </head>

          <body>

          <!--水平線的寬度是500像素,這個width就是標簽屬性-->

          <hr width="500">

          <!--下面這個是多個標簽屬性,多個屬性之間用空格隔開-->

          <font color="red" face="黑體" size="7">標簽屬性</font>

          </body>

          </html>

          TML 顏色由紅色、綠色、藍色混合而成。

          顏色值

          HTML 顏色由一個十六進制符號來定義,這個符號由紅色、綠色和藍色的值組成(RGB)。

          種顏色的最小值是0(十六進制:#00)。最大值是255(十六進制:#FF)。

          這個表格給出了由三種顏色混合而成的具體效果:

          顏色值

          顏色(Color)顏色十六進制(Color HEX)顏色RGB(Color RGB)
          #000000rgb(0,0,0)
          #FF0000rgb(255,0,0)
          #00FF00rgb(0,255,0)
          #0000FFrgb(0,0,255)
          #FFFF00rgb(255,255,0)
          #00FFFFrgb(0,255,255)
          #FF00FFrgb(255,0,255)
          #C0C0C0rgb(192,192,192)
          #FFFFFFrgb(255,255,255)


          1600萬種不同顏色

          三種顏色 紅,綠,藍的組合從0到255,一共有1600萬種不同顏色(256 x 256 x 256)。

          在下面的顏色表中你會看到不同的結果,從0到255的紅色,同時設置綠色和藍色的值為0,隨著紅色的值變化,不同的值都顯示了不同的顏色。

          Red LightColor HEXColor RGB
          #000000 rgb(0,0,0)
          #080000rgb(8,0,0)
          #100000rgb(16,0,0)
          #180000rgb(24,0,0)
          #200000rgb(32,0,0)
          #280000rgb(40,0,0)
          #300000rgb(48,0,0)
          #380000rgb(56,0,0)
          #400000rgb(64,0,0)
          #480000rgb(72,0,0)
          #500000rgb(80,0,0)
          #580000rgb(88,0,0)
          #600000rgb(96,0,0)
          #680000rgb(104,0,0)
          #700000rgb(112,0,0)
          #780000rgb(120,0,0)
          #800000rgb(128,0,0)
          #880000rgb(136,0,0)
          #900000rgb(144,0,0)
          #980000rgb(152,0,0)
          #A00000rgb(160,0,0)
          #A80000rgb(168,0,0)
          #B00000rgb(176,0,0)
          #B80000rgb(184,0,0)
          #C00000rgb(192,0,0)
          #C80000rgb(200,0,0)
          #D00000rgb(208,0,0)
          #D80000rgb(216,0,0)
          #E00000rgb(224,0,0)
          #E80000rgb(232,0,0)
          #F00000rgb(240,0,0)
          #F80000rgb(248,0,0)
          #FF0000rgb(255,0,0)

          灰暗色調

          以下展示了灰色到黑色的漸變

          Gray ShadesColor HEXColor RGB
          #000000 rgb(0,0,0)
          #080808 rgb(8,8,8)
          #101010 rgb(16,16,16)
          #181818 rgb(24,24,24)
          #202020 rgb(32,32,32)
          #282828 rgb(40,40,40)
          #303030 rgb(48,48,48)
          #383838 rgb(56,56,56)
          #404040 rgb(64,64,64)
          #484848 rgb(72,72,72)
          #505050 rgb(80,80,80)
          #585858 rgb(88,88,88)
          #606060 rgb(96,96,96)
          #686868 rgb(104,104,104)
          #707070 rgb(112,112,112)
          #787878 rgb(120,120,120)
          #808080 rgb(128,128,128)
          #888888 rgb(136,136,136)
          #909090 rgb(144,144,144)
          #989898 rgb(152,152,152)
          #A0A0A0 rgb(160,160,160)
          #A8A8A8 rgb(168,168,168)
          #B0B0B0 rgb(176,176,176)
          #B8B8B8 rgb(184,184,184)
          #C0C0C0 rgb(192,192,192)
          #C8C8C8 rgb(200,200,200)
          #D0D0D0 rgb(208,208,208)
          #D8D8D8 rgb(216,216,216)
          #E0E0E0 rgb(224,224,224)
          #E8E8E8 rgb(232,232,232)
          #F0F0F0 rgb(240,240,240)
          #F8F8F8 rgb(248,248,248)
          #FFFFFF rgb(255,255,255)

          Web安全色?

          數年以前,當大多數計算機僅支持 256 種顏色的時候,一系列 216 種 Web 安全色作為 Web 標準被建議使用。其中的原因是,微軟和 Mac 操作系統使用了 40 種不同的保留的固定系統顏色(雙方大約各使用 20 種)。

          我們不確定如今這么做的意義有多大,因為越來越多的計算機有能力處理數百萬種顏色,不過做選擇還是你自己。

          最初,216 跨平臺 web 安全色被用來確保:當計算機使用 256 色調色板時,所有的計算機能夠正確地顯示所有的顏色。

          0000000000330000660000990000CC0000FF
          0033000033330033660033990033CC0033FF
          0066000066330066660066990066CC0066FF
          0099000099330099660099990099CC0099FF
          00CC0000CC3300CC6600CC9900CCCC00CCFF
          00FF0000FF3300FF6600FF9900FFCC00FFFF
          3300003300333300663300993300CC3300FF
          3333003333333333663333993333CC3333FF
          3366003366333366663366993366CC3366FF
          3399003399333399663399993399CC3399FF
          33CC0033CC3333CC6633CC9933CCCC33CCFF
          33FF0033FF3333FF6633FF9933FFCC33FFFF
          6600006600336600666600996600CC6600FF
          6633006633336633666633996633CC6633FF
          6666006666336666666666996666CC6666FF
          6699006699336699666699996699CC6699FF
          66CC0066CC3366CC6666CC9966CCCC66CCFF
          66FF0066FF3366FF6666FF9966FFCC66FFFF
          9900009900339900669900999900CC9900FF
          9933009933339933669933999933CC9933FF
          9966009966339966669966999966CC9966FF
          9999009999339999669999999999CC9999FF
          99CC0099CC3399CC6699CC9999CCCC99CCFF
          99FF0099FF3399FF6699FF9999FFCC99FFFF
          CC0000CC0033CC0066CC0099CC00CCCC00FF
          CC3300CC3333CC3366CC3399CC33CCCC33FF
          CC6600CC6633CC6666CC6699CC66CCCC66FF
          CC9900CC9933CC9966CC9999CC99CCCC99FF
          CCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
          CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFF
          FF0000FF0033FF0066FF0099FF00CCFF00FF
          FF3300FF3333FF3366FF3399FF33CCFF33FF
          FF6600FF6633FF6666FF6699FF66CCFF66FF
          FF9900FF9933FF9966FF9999FF99CCFF99FF
          FFCC00FFCC33FFCC66FFCC99FFCCCCFFCCFF
          FFFF00FFFF33FFFF66FFFF99FFFFCCFFFFFF

          如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!

          在學習和工作中,我們經常需要使用日志來記錄程序的運行狀態和調試信息。而為了更好地區分不同的日志等級,我們可以使用不同的顏色來呈現,使其更加醒目和易于閱讀。

          在下圖運行結果中,我們使用了 colorlog 庫來實現彩色日志輸出。通過定義不同日志等級對應的顏色,我們可以在控制臺中以彩色的方式顯示日志信息。例如,DEBUG 級別的日志使用白色,INFO 級別的日志使用綠色,WARNING 級別的日志使用黃色,ERROR 級別的日志使用紅色,CRITICAL 級別的日志使用藍色。

          但是在查看日志文件時,我們會發現日志信息是系統默認的字體顏色,并且前后多了一些特殊符號,例如 [32m 等。這是因為在控制臺中使用的是 ANSI 轉義序列來實現彩色文本效果,而這些特殊符號是 ANSI 轉義序列的一部分。如下圖所示:

          現在有一個需求,在前端頁面直接查看日志內容并還原彩色文本效果,因此,我們將進行以下內容講解:

          1. 什么是 ANSI 轉義序列?
          2. 如何在前端頁面直接查看日志內容?
          3. 如何在前端頁面還原彩色文本效果?

          本文代碼點擊此處跳轉,往期系列文章請訪問博主的 項目實戰專欄,博文中的所有代碼全部收集在博主的 GitHub 倉庫中;

          ANSI 轉義序列

          ANSI 轉義序列是美國國家標準化組織(American National Standards Institute,ANSI)制定的標準,是一種用于控制文本終端顯示的特殊字符序列。它們以 3[ 開頭,以字母和數字組合的形式表示不同的控制功能。

          ANSI 轉義序列可以用于控制文本的顏色、背景色、文本樣式(如粗體、斜體等)、光標位置、清屏等操作。通過在輸出文本中插入適當的 ANSI 轉義序列,可以實現豐富的終端顯示效果。

          以下是一些常用的 ANSI 轉義序列示例:

          • 3[0m:重置所有屬性,恢復默認設置;
          • 3[31m:設置文本顏色為紅色;
          • 3[42m:設置背景顏色為綠色;
          • 3[1m:設置文本為粗體;
          • 3[4m:設置文本為下劃線;
          • 3[2J:清屏;

          需要注意的是,ANSI 轉義序列在不同的終端和操作系統上的支持程度可能會有所不同。在某些終端中,可能無法正確解釋和顯示 ANSI 轉義序列。

          我們以 3[31m 和 3[42m 為例,輸出一個綠底紅字的句子 Hello World! --sidiot.,代碼如下所示:

          log.debug("3[42m3[31mHello World! --sidiot.3[0m3[0m")

          運行結果:

          前端頁面直接查看日志內容

          這里的話,我們使用 Python 的 http.server 模塊來啟動一個簡單的 HTTP 服務器。

          比較快捷的方式就是在日志文件夾中打開終端,輸入 python -m http.server 8888 即可,運行結果如下所示:

          不過這種方式相對來說還是不太安全的,因此我們可以通過設置白名單的方式,來規避一些潛在的安全隱患,代碼如下所示:

          import http.server
          import socketserver
          
          class HTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
              def check_client_address(self):
                  # 設置白名單,只允許特定的IP地址或主機訪問
                  whitelist = ['127.0.0.1', 'localhost']
          
                  client_address = self.client_address[0]
                  if client_address not in whitelist:
                      self.send_response(403)
                      self.end_headers()
                      self.wfile.write(b'Forbidden. Please contact sidiot.')
                      return False
          
                  return True
          
              def do_GET(self):
                  if not self.check_client_address():
                      return
                  
                  super().do_GET()
          
          with socketserver.TCPServer(('0.0.0.0', 8888), HTTPRequestHandler) as httpd:
              httpd.serve_forever()

          目前本機的 IP 為 192.168.124.23,當我們以 127.0.0.1 來訪問 8888 服務端口時,訪問是成功的,但是當我們用 192.168.124.23 來訪問服務端口時,訪問是失敗的。

          運行結果:

          現在我們點擊文件,它會直接通過瀏覽器直接下載,但是我們需要的是在網頁上能夠直接閱覽文件中的內容,因此我們可以從 do_GET() 下手。

          我們可以設計一個根據傳入的文件名參數,讀取本地文件并作為響應結果進行返回的方法,然后根據一定的規則進行觸發,代碼如下所示:

          def read_file(self):
              try:
                  self.send_response(200)
                  self.send_header("Content-Type", "text/plain; charset=utf-8")
                  self.end_headers()
                  self.wfile.write(open(self.path[6:], 'rb').read())
          
              except FileNotFoundError:
                  self.send_response(404)
                  self.end_headers()
                  self.wfile.write(b'File not found!')
          
          def do_GET(self):
              if self.check_client_address():
                  if self.path.startswith("/?log="):
                      self.read_file()
                  else:
                      super().do_GET()

          上述代碼通過檢查請求的資源路徑來處理 GET 請求。如果請求的資源路徑前綴是 /?log=,且是當前目錄下存在的日志文件,它會讀取文件并將其內容作為響應發送。否則,它會使用基類的默認行為處理普通的 GET 請求。

          運行結果:

          至此,我們已經實現了前端頁面直接查看日志內容的功能。

          前端頁面還原彩色文本效果

          原理分析

          當我們想要在前端頁面展示 ANSI 字體的彩色效果時,我們只需要簡單地將 ANSI 轉義序列轉換成相應的 HTML 代碼就可以實現了。這個轉換過程實際上可以通過編寫一個 Python 函數來實現,該函數可以接受包含 ANSI 控制碼的字符串作為輸入,并將其轉換為帶有相應樣式的 HTML 代碼輸出,代碼如下所示:

          def convert_ansi_to_html(ansi_text):
              ansi_to_html = {
                  '\x1b[31m': '<span style="color: red;">',
                  '\x1b[42m': '<span style="background-color: green;">',
                  ...,
              }
              html_text = re.sub(r'\x1b[[0-9;]*m', lambda match: ansi_to_html.get(match.group(0), ''), ansi_text)
          
              return html_text
          
          
          if __name__ == '__main__':
              ansi = "\033[42m\033[31mHello World! --sidiot.\033[0m\033[0m"
              print(ansi)
              html = convert_ansi_to_html(ansi)
              print(f"convert content: {html}")

          需要注意的是,在 ANSI 轉義序列中,\x1b 和 3 都代 表ASCII 碼中的 Escape 字符,用于開始一個轉義序列。

          運行結果:

          使用 ansiconv 轉換

          接下來,我們借助已有的庫函數 ansiconv 進行 ANSI 的轉換。

          通過 pip 進行安裝:

          pip install ansiconv

          根據 ansiconv 的官方文檔使用其中的三個方法 to_plain(),to_html() 和 base_css() 來實現在前端頁面展示 ANSI 字體的彩色效果,代碼如下所示:

          import ansiconv
          
          ansi = "\033[42m\033[31mHello World! --sidiot.\033[0m\033[0m"
          print(f"Ansi: {ansi}")
          plain = ansiconv.to_plain(ansi)
          html = ansiconv.to_html(ansi)
          print(f"Convert Plain: {plain}")
          print(f"Convert HTML: {html}")

          在 base_css() 中會有相關的 CSS 映射表,如下所示:

          css_rule('.ansi31', color="#FF0000"),
          css_rule('.ansi42', background_color="#00FF00"),

          運行結果:

          研究 ansiconv 源碼

          我們將通過研究 ansiconv 的源碼,以便深入了解它是如何將 ANSI 轉換成純文本或 HTML 代碼的工作原理。

          to_plain() 的源碼如下所示:

          上述代碼使用正則表達式匹配字符串中的 ANSI 轉義序列,并將其替換為空字符串,從而得到不包含轉義序列的純文本。

          正則表達式的含義如下:

          • \x1B:匹配 ESCAPE 字符;
          • \[:匹配左方括號;
          • [0-9;]*:匹配零個或多個數字或分號;
          • [ABCDEFGHJKSTfmnsulh]:匹配 ANSI 轉義序列中的控制字符;

          我們通過 re.findall() 方法來獲取所有匹配的結果,這樣夠清晰地捕獲所有符合條件的匹配項,從而更好地理解 ansiconv 是如何進行 ANSI 到純文本的轉換,代碼如下所示:

          ansi = "\033[42m\033[31mHello World! --sidiot.\033[0m\033[0m"
          print(re.findall(r'\x1B[[0-9;]*[ABCDEFGHJKSTfmnsulh]', ansi))

          運行結果:


          to_html() 的源碼如下所示:

          上述代碼將 ANSI 字符串分割成塊,并對每個塊調用 _block_to_html() 函數進行解析和轉換,同時還處理了 ANSI 命令 "A",模擬向上移動光標的行為。如果 replace_newline 為 True,則 HTML 字符串中的換行符 \n 將替換為 <br />\n 以保留 HTML 輸出中的換行符。

          其中 _block_to_html() 的源碼如下所示:

          上述代碼使用正則表達式匹配 ANSI 代碼,并根據匹配結果生成對應的 HTML 代碼。

          正則表達式的含義:

          • ^:表示匹配字符串的開頭。
          • \[:匹配左方括號 [。
          • (?P<code>\d+(?:;\d+)*)?:這是一個命名捕獲組,用于匹配 ANSI 代碼中的數字部分。它由以下組成: \d+:匹配一個或多個數字。 (?:;\d+)*:這是一個非捕獲組,用于匹配分號 ; 和一個或多個數字的重復出現。(?: ... ) 表示非捕獲組,* 表示重復零次或多次。
          • (?P<command>[Am]):這是另一個命名捕獲組,用于匹配 ANSI 代碼中的命令部分。它由以下組成: [Am]:匹配字符 A 或 m。

          我們可以通過運行源碼里的部分代碼來幫助理解,代碼如下所示:

          text = ("\x1B[0;32;45msidiot\n"
                  "\033[42m\033[31mHello World! --sidiot.\033[0m\033[0m")
          print(text)
          blocks = text.split('\x1B')
          print(blocks)
          for block in blocks:
              match = re.match(r'^[(?P<code>\d+(?:;\d+)*)?(?P<command>[Am])', block)
              if match is not None:
                  print("\nmatch:", match, ", code:", match.group('code'), ", command:", match.group('command'))

          運行結果:

          實際應用

          通過深入理解 ANSI 轉換思路和 ansiconv 源碼,我們可以為之前的 http.server 服務帶來全新的優化。

          首先,將原先的 read_file() 方法進行優化,代碼如下所示:

          def read_file(self, content_type, file_io):
              try:
                  self.send_response(200)
                  self.send_header("Content-Type", f"{content_type}; charset=utf-8")
                  self.end_headers()
                  self.wfile.write(file_io)
          
              except FileNotFoundError:
                  self.send_response(404)
                  self.send_header("Content-Type", "text/plain; charset=utf-8")
                  self.end_headers()
                  self.wfile.write(b'File not found!')

          上述代碼通過接收 content_type 和 file_io 兩個參數,實現將自定義內容作為響應返回給客戶端。

          然后修改請求路徑,使其能夠返回純文本HTML 兩種不同類型的內容,代碼如下所示:

          def do_GET(self):
              if self.check_client_address():
                  if self.path.startswith("/?plain="):
                      file = open(self.path[8:], 'rb').read()
                      plain = ansiconv.to_plain(file.decode('UTF-8'))
                      self.read_file("text/plain", plain.encode())
                  elif self.path.startswith("/?html="):
                      file = open(self.path[7:], 'rb').read()
                      conv = ansiconv.to_html(file.decode('UTF-8'))
                      css = ansiconv.base_css()
                      html = """
                      <html>
                        <head><style>{0}</style></head>
                        <body>
                          <pre class="ansi_fore ansi_back">{1}</pre>
                        </body>
                      </html>
                      """.format(css, conv)
                      print(html)
                      self.read_file("text/html", html.encode())
                  else:
                      super().do_GET()

          這里要注意的是,需要設置 CSS 樣式,不然 class 類是無法進行渲染的。

          純文本運行結果:

          HTML 運行結果:

          后記

          在本文中,我們探討了如何實現將 ANSI 字體在前端頁面進行彩色展示的方法。在前端頁面中直接顯示 ANSI 轉義序列是不起作用的,因為瀏覽器不會解析和處理這些轉義序列。

          為了在前端頁面實現彩色展示,我們介紹了一種方法,即將 ANSI 轉義序列轉換為對應的 HTML 代碼。通過解析 ANSI 轉義序列并將其轉換為適當的 HTML 標簽和樣式,我們可以在前端頁面上還原彩色文本的效果。

          在本文中,我們使用了 Python 中的 ansiconv 庫來實現 ANSI 轉換。該庫提供了 to_plain 和 to_html 兩個方法,分別用于將 ANSI 轉義序列轉換為純文本和 HTML 代碼。我們還展示了如何使用這些方法來轉換 ANSI 字符串,并在前端頁面上顯示轉換后的結果。

          通過本文的介紹,讀者可以了解到如何在前端頁面實現彩色文本的展示,從而提升用戶體驗和可讀性。無論是在日志查看器、終端模擬器還是其他需要展示彩色文本的應用中,這種技術都能發揮重要作用。

          以上就是 從終端到瀏覽器:實現 ANSI 字體在前端頁面的彩色展示 的所有內容了,希望本篇博文對大家有所幫助!歡迎大家持續關注我的博客,一起分享學習和成長的樂趣!?

          作者:sidiot
          鏈接:https://juejin.cn/post/7381820436274184202


          主站蜘蛛池模板: 无码人妻久久久一区二区三区| 亚洲码一区二区三区| 中文字幕一区精品| 日韩人妻一区二区三区蜜桃视频| 中文字幕人妻AV一区二区| 三级韩国一区久久二区综合| 一区二区三区在线|欧| 人妻无码久久一区二区三区免费 | 伊人久久精品无码av一区| 一区二区视频传媒有限公司| 国产凹凸在线一区二区| 乱色熟女综合一区二区三区| 国产情侣一区二区三区| 日本国产一区二区三区在线观看| 日本免费一区二区三区四区五六区 | 国产色综合一区二区三区| 日本精品一区二区三区视频| 亚洲国产美国国产综合一区二区 | 精品视频一区二区三区在线播放| 国产伦理一区二区| 亚洲一区二区三区成人网站 | 亚洲av乱码中文一区二区三区 | 亚洲一区精品中文字幕| 曰韩精品无码一区二区三区| 2014AV天堂无码一区| 亚洲午夜日韩高清一区| 国产一区二区影院| 人妻精品无码一区二区三区| 一区二区三区国产| 亚洲视频在线观看一区| 人妻av无码一区二区三区| 日韩精品无码一区二区中文字幕| 综合久久一区二区三区| 国精产品一区一区三区| 麻豆亚洲av熟女国产一区二| AA区一区二区三无码精片| 亚洲无码一区二区三区| 国产伦精品一区二区三区无广告| 国产一区二区三区亚洲综合 | 日韩一区在线视频| 日本精品一区二区三区在线视频一|