整合營銷服務商

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

          免費咨詢熱線:

          酷炫網頁制作之《HTML認識及基礎標簽使用》,分分鐘搞定

          么是HTML

          Hyper Text Markup Language, 超文本標記語言

          標記又稱為標簽(Tag), 一般語法:

          <tagName></tagName>

          它可以有屬性(Attribute):

          <tagName attributeName="value">, 如:

          <meta charset="utf-8" />

          標簽也可以不成對地關閉:

          <tagName />

          HTML文檔由瀏覽器解釋并執行。

          HTML文檔基本結構

          <!DOCTYPE html> ----- 告訴瀏覽器用html5的標準來解釋和執行該網頁

          <html>

          <head> ---- 頭部, 可包含meta, title等標簽

          </head>

          <body> ---- 主體, 包含主要內容

          </body>

          </html>

          meta

          <meta charset="utf-8" /> 用于告訴瀏覽器用什么樣的字符編碼來解釋網頁中的文本.

          常見編碼:

          iso-8859-1: 純英文編碼

          gbk, gb2312: 簡體中文編碼

          big5: 大五碼,繁體中文編碼,主要應用于臺灣地區

          utf-8: 國際首選編碼,它兼容所有的字符

          除此之外, meta還可以通過keywords, description屬性對頁面關鍵詞及描述信息進行設置, 以提高搜索引擎的命中.

          title

          網頁標題, 顯示在瀏覽器選項卡的標題欄上!

          文本排版標簽

          h1-h6: 內容標題標簽

          p: 段落

          br: 換行

          hr: 水平線

          strong: 粗體文本

          em: 斜體文本

          span: 無任何特殊樣式的文本

          pre: 預格式標簽,其中的內容在頁面上帶格式渲染

          small: 比當前字體小的文本

          html特殊字符/轉義字符

          空格

          < 小于

          > 大于

          ? 版權符

          " 雙引號

          html注釋

          <!-- 注釋內容 -->

          圖像標簽

          <img

          src="圖像地址"

          title="鼠標懸停提示"

          alt="圖像加載錯誤時的替代文本"

          width="寬度"

          height="高度"

          />

          圖像地址分為2種:

          1. 相對地址, 如: img/cc.jpg

          2. 絕對地址, 如: http://img.bcd.com/2017/1644232421.jpg

          超鏈接


          <a href="鏈接地址" target="目標窗口">文本|圖片</a>

          目標窗口:

          _self: 目標頁面在當前窗口打開

          _blank: 目標頁面在新窗口中打開

          如果是在頁面具有frameset/frame/iframe的場景下:

          _top: 在頂級窗口中打開

          _parent: 在父級窗口中打開

          _自定義名稱: 在指定的特定窗口中打開

          三種用法:

          1. 頁面間鏈接

          <a href="page/login.html"></a>

          2. 錨鏈接

          <a href="#help"></a>

          help是本頁面中一處id為help的標簽, 如: <p id="help">

          或者:

          help是通過a標簽命名的錨記, 如: <a name="help"></a>

          3. 功能性鏈接

          喚醒本地安裝的外部程序如 outlook/foxmail/qq/msn/aliwangwang...

          <a href="mailto:abcdef@qq.com"></a>

          div標簽

          div是一個容器, 常用于頁面的布局

          標簽的分類:

          1. 塊級標簽/塊級元素

          如: div, h1-h6, p, hr

          特征: 獨占容器中的一行, 其寬度是容器的100%

          2. 行級標簽/行級元素

          如: span, img, strong, em, a

          特征1: 多個行級元素可以同處一行, 其寬度由內容來撐開(auto)

          特征2: 大部分行級元素設置其width/height無效

          HBuilder常用快捷鍵

          ctrl + D : 刪除當前行

          ctrl + PgUp : 當前行上移

          ctrl + PgDown : 當前行下移

          ctrl + / : 注釋 | 取消注釋

          ctrl + shift + F : 整理代碼格式

          ctrl + C : 復制當前行

          ctrl + X : 剪切當前行

          ctrl + V : 粘貼

          ctrl + Z : 撤消上一步操作

          ctrl + S : 保存當前文件

          ctrl + shift + S : 保存項目中全部文件

          ctrl + Enter : 在當前行的下方插入新行

          ctrl + shift + Enter : 在當前行的上方插入新行


          以上知識能做的效果圖

          部分效果

          、前言

          模板語言由HTML代碼和邏輯控制代碼組成,此處 @PHP 。通過模板語言可以快速的生成預想的HTML頁面。應該算是后端渲染不可缺少的組成部分。

          二、功能介紹

          通過使用學習 tornadobottle 的模板語言,我也效仿著實現可以獨立使用的模板渲染的代碼模塊,模板語法來自 tornadobottle 的語法。可以用來做一些簡單的事情 網頁渲染郵件內容生成 等HTML顯示方面。以下就是簡單的語法使用介紹。

          1. 變量。使用 {{ }} 包裹起來,里面的變量為Python傳入。模板渲染時會將傳入的變量轉換成字符串并填入對應位置。

          # 模板文件內容
          <title>{{my_title}}</title>
          <label>{{ session.name }}</label>
          # py代碼調用  t_html 為上面的內容
          Template(t_html).render(my_title="標題", session = some_obj) 
          

          2. 轉義。默認傳入的數據都會進行HTML轉義,可以使用 {% raw value %} 來將value的內容按原始字符串輸出。

          # 模板文件內容
          <p>{% raw value %} </p>
          # Py調用內容
          Template(t_html).render(my_title="<label>顯示標簽</label>")
          

          3. 條件控制。支持Python的 if,elif,else 。條件代碼需要放在 {% %} 內部,并且在條件結束后需要額外增加 {% end %} ,用于標識條件控制語句塊范圍。

          # 模板文件內容
          {% if a > 1%}
          <label>A大于1</label>
          {% else %}
          <label>A小于或等于1</label>
          {% end %}
          # py調用
          Template(t_html).render(a=1)
          

          4. 循環控制。支持Python的 forwhile 。與條件控制一樣也需要放在 {% %} 內部,并且結束處需要額外增加 {% end %} ,用于標識循環控制語句塊的范圍。

          # 模板文件內容
          {% for i in range(10) %}
            <label>當前序號:{{i+1}}</label>
          {% end %}
          # py調用
          Template(t_html).render()  
          

          5. 變量聲明。如果需要在模板文件內聲明一個變量,方便使用時,可以通過 set 來實現。具體格式為 {% set v = xx %} 。通過 set 聲明的變量在整個模板文件中都可以使用,包括在條件控制和循環控制中作為條件判斷也可以。

          # 模板文件內容
          {% set a = 1 %}
          <label>a的值:{{a}}</label>
          

          三、源碼

          這個模板語言模塊是在 Python2.7 上面開發使用的,如果要在 Python3+ 上使用需要對 strbytes 進行一些處理即可,由于沒有引用任何其他模塊,可以很好地獨立使用。

            1 # -*- coding:utf-8 -*-
            2 
            3 """ 模板語言"""
            4 
            5 # TOKEN相關的定義
            6 TOKEN_S_BRACE = "{"
            7 TOKEN_S_BLOCK = "%"
            8 TOKEN_EXPRESSION_L = "{{"  
            9 TOKEN_EXPRESSION_R = "}}"
           10 TOKEN_BLOCK_L = "{%"
           11 TOKEN_BLOCK_R = "%}"
           12 TOKEN_KEY_SET = "set"
           13 TOKEN_KEY_RAW = "raw"
           14 TOKEN_KEY_IF = "if"
           15 TOKEN_KEY_ELIF = "elif"
           16 TOKEN_KEY_ELSE = "else"
           17 TOKEN_KEY_FOR = "for"
           18 TOKEN_KEY_WHILE = "while"
           19 TOKEN_KEY_END = "end"
           20 TOKEN_KEY_BREAK = "break"
           21 TOKEN_KEY_CONTINUE = "continue"
           22 TOKEN_SPACE = " "
           23 TOKEN_COLON = ":"
           24 # Token標記 {{}} {% %}
           25 TOKEN_FLAG_SET = {TOKEN_S_BRACE, TOKEN_S_BLOCK}
           26 # 簡單的語句
           27 TOKEN_KEY_SET_SIMPLE_EXPRESSION = {TOKEN_KEY_SET, TOKEN_KEY_RAW}
           28 # 前置條件
           29 TOKEN_KEY_PRE_CONDITION = {
           30     # end 必須在if/elif/else/for/while 后面
           31     TOKEN_KEY_END: {TOKEN_KEY_IF, TOKEN_KEY_ELIF, TOKEN_KEY_ELSE, 
           32                     TOKEN_KEY_FOR, TOKEN_KEY_WHILE},
           33     # elif 必須在if 后面
           34     TOKEN_KEY_ELIF: {TOKEN_KEY_IF},
           35     # else 必須在if/elif 后面
           36     TOKEN_KEY_ELSE: {TOKEN_KEY_IF, TOKEN_KEY_ELIF, TOKEN_KEY_FOR, TOKEN_KEY_WHILE},
           37 }
           38 # 循環語句
           39 TOKEN_KEY_LOOP = {TOKEN_KEY_WHILE, TOKEN_KEY_FOR}
           40 # 循環的控制break continue
           41 TOKEN_KEY_LOOP_CTRL = {TOKEN_KEY_BREAK, TOKEN_KEY_CONTINUE}
           42 
           43 class ParseException(Exception):
           44     pass
           45 
           46 class TemplateCode(object):
           47     def __init__(self):
           48         self.codeTrees = {"parent": None, "nodes": []}
           49         self.cursor = self.codeTrees
           50         self.compiled_code = None
           51 
           52     def create_code(self):
           53         """創建一個代碼子塊"""
           54         child_codes = {"parent": self.cursor, "nodes": []}
           55         self.cursor["nodes"].append(child_codes)
           56         self.cursor = child_codes
           57 
           58     def close_code(self):
           59         """ 關閉一個代碼子塊 """
           60         assert self.cursor["parent"] is not None, "overflow"
           61         self.cursor = self.cursor["parent"]
           62 
           63     def append_text(self, text):
           64         """ 添加文本 """
           65         # 排除空行
           66         self.cursor["nodes"].append("_add(%r)" % text)
           67 
           68     def append_express(self, express, raw=False):
           69         """ 表達式 """
           70         if raw:
           71             temp_exp = "_t_exp = _str_(%s)" % express
           72         else:
           73             temp_exp = "_t_exp = _esc_(%s)" % express
           74         self.cursor["nodes"].append(temp_exp)
           75         self.cursor["nodes"].append("_add(_t_exp)")
           76 
           77     def append_statement(self, statement):
           78         """ 語句 """
           79         temp_statement = "%s" % statement
           80         self.cursor["nodes"].append(temp_statement)
           81 
           82     def reset(self):
           83         self.codeTrees = {"parent": None, "nodes": []}
           84         self.cursor = self.codeTrees
           85         self.compiled_code = None
           86 
           87     def build_code(self, filename):
           88         temp_code_buff = []
           89         self.write_buff_with_indent(temp_code_buff, "def _template_render():", 0)
           90         self.write_buff_with_indent(temp_code_buff, "_codes = []", 4)
           91         self.write_buff_with_indent(temp_code_buff, "_add = _codes.append", 4)
           92         self.write_codes(temp_code_buff, self.codeTrees, 4)
           93         self.write_buff_with_indent(temp_code_buff, "return ''.join(_codes)", 4)
           94         temp_code = "".join(temp_code_buff)
           95         self.compiled_code = compile(temp_code,filename, "exec", dont_inherit=True)
           96 
           97     def write_codes(self, code_buff, codes, indent):
           98         for node in codes.get("nodes", []):
           99             if isinstance(node, dict):
          100                 self.write_codes(code_buff, node, indent+4)
          101             else:
          102                 self.write_buff_with_indent(code_buff, node, indent)
          103 
          104     def generate(self, **kwargs):
          105         temp_namespace = {}
          106         temp_namespace['_str_'] = self.to_utf8
          107         temp_namespace['_esc_'] = self.to_safe_utf8
          108         temp_namespace.update(kwargs)
          109         exec(self.compiled_code, temp_namespace)
          110         return temp_namespace['_template_render']()
          111 
          112     @staticmethod
          113     def write_buff_with_indent(code_buff, raw_str, indent):
          114         """"""
          115         temp = (" " * indent) + raw_str + "\n"
          116         code_buff.append(temp)
          117 
          118     @staticmethod
          119     def to_utf8(raw_str):
          120         """ 轉換 """
          121         if isinstance(raw_str, str):
          122             return raw_str
          123         elif isinstance(raw_str, bytes):
          124             return raw_str.decode()
          125         return str(raw_str)
          126 
          127     @staticmethod
          128     def to_safe_utf8(raw_str):
          129         """ 過濾html轉義 """
          130         text = TemplateCode.to_utf8(raw_str)
          131         return text.replace("&", "&").replace("<", "<").replace(">", ">")
          132 class Template(object):
          133     """模板類"""
          134     def __init__(self, input_obj,filename="<string>", **namespace):
          135         """模板初始化"""
          136         self.namespace = {}
          137         self.namespace.update(namespace)
          138         # 將數據丟進去解析生成編譯代碼
          139         self.lexer = TemplateLexer(input_obj, filename)
          140 
          141     def render(self, **kwargs):
          142         """渲染模板 """
          143         temp_name_space = {}
          144         temp_name_space.update(self.namespace)
          145         temp_name_space.update(kwargs)
          146         # 執行渲染
          147         return self.lexer.render(**kwargs)
          148 
          149 class TemplateLexer(object):
          150     """模板語法分析器 """
          151     def __init__(self, input_obb, filename="<string>"):
          152         if hasattr(input_obb, "read"):
          153             self.raw_string = input_obb.read()
          154         else:
          155             self.raw_string = input_obb
          156         self.filename = filename
          157         # 記錄當前的位置
          158         self.pos = 0
          159         # 記錄原始數據的總長度
          160         self.raw_str_len = len(self.raw_string)
          161         # 記錄解析的數據
          162         self.code_data = TemplateCode()
          163         # 開始解析
          164         self.parse_template()
          165 
          166     def match(self, keyword, pos=None):
          167         return self.raw_string.find(keyword, pos if pos is not None else self.pos)
          168 
          169     def cut(self, size=-1):
          170         """剪取數據 size切割數據的大小,-1表示全部"""
          171         if size == -1:
          172             new_pos = self.raw_str_len
          173         else:
          174             new_pos = self.pos + size
          175         s = self.raw_string[self.pos: new_pos]
          176         self.pos = new_pos
          177         return s
          178 
          179     def remaining(self):
          180         """獲取剩余大小 """
          181         return self.raw_str_len - self.pos
          182 
          183     def function_brace(self):
          184         """ 獲取{{  / {% """
          185         skip_index = self.pos
          186         while True:
          187             index = self.match(TOKEN_S_BRACE, skip_index)  # {% {{
          188             # 沒找到
          189             if index == -1:
          190                 return None, -1
          191             # 末尾
          192             if index >= self.raw_str_len:
          193                 return None, -1
          194             # 匹配類型
          195             next_value = self.raw_string[index + 1:index + 2]
          196             if next_value not in TOKEN_FLAG_SET:
          197                 skip_index = index + 1
          198                 # 說明不是關鍵類型
          199                 continue
          200             brace = self.raw_string[index: index + 2]
          201             return brace, index
          202         return None, -1
          203 
          204     def read_content_with_token(self, index, begin_token, end_token):
          205         """
          206         讀取匹配token的內容
          207         """
          208         end_index = self.match(end_token)
          209         if end_index == -1:
          210             return ParseException("{0} missing end token {1}".format(begin_token, end_token))
          211         # 過濾 begin_token
          212         self.pos = index + len(begin_token)
          213         content = self.cut(end_index - self.pos)
          214         # 去除末尾 end_token
          215         self.cut(len(end_token))
          216         return content
          217 
          218     def add_simple_block_statement(self, operator, suffix):
          219         if not suffix:
          220             raise ParseException("{0} missing content".format(operator))
          221         if operator == TOKEN_KEY_SET:
          222             self.code_data.append_statement(suffix)
          223         elif operator == TOKEN_KEY_RAW:
          224             self.code_data.append_express(suffix, True)
          225         else:
          226             raise ParseException("{0} is undefined".format(operator))
          227 
          228     def parse_template(self):
          229         """解析模板 """
          230         # TODO 檢查模板文件是否更改過,如果沒有則不需要重新解析
          231         self.code_data.reset()
          232         # 解析模板原文件
          233         self.__parse()
          234         # 生成編譯code
          235         self.__compiled_code()
          236 
          237     def render(self, **kwargs):
          238         return self.code_data.generate(**kwargs)
          239 
          240     def __parse(self, control_operator=None, in_loop=False):
          241         """開始解析"""
          242         while True:
          243             if self.remaining() <= 0:
          244                 if control_operator or in_loop:
          245                     raise ParseException("%s missing {%% end %%}" % control_operator)
          246                 break
          247             # 讀取 {{ {%
          248             brace, index = self.function_brace()
          249             # 說明沒有找到
          250             if not brace:
          251                 text = self.cut(index)
          252                 self.code_data.append_text(text)
          253                 continue
          254             else:
          255                 text = self.cut(index - self.pos)
          256                 if text:
          257                     self.code_data.append_text(text)
          258 
          259             if brace == TOKEN_EXPRESSION_L:
          260                 content = self.read_content_with_token(index, TOKEN_EXPRESSION_L, TOKEN_EXPRESSION_R).strip()
          261                 if not content:
          262                     raise ParseException("Empty Express")
          263                 self.code_data.append_express(content)
          264                 continue
          265             elif brace == TOKEN_BLOCK_L:
          266                 content = self.read_content_with_token(index, TOKEN_BLOCK_L, TOKEN_BLOCK_R).strip()
          267                 if not content:
          268                     raise ParseException("Empty block")
          269 
          270                 # 得到表達式 for x in x ;  if x ;  elif x ;  else ;  end ;  set ;  while x ;
          271                 operator, _, suffix = content.partition(TOKEN_SPACE)
          272                 if not operator:
          273                     raise ParseException("block missing operator")
          274 
          275                 suffix = suffix.strip()
          276                 # 簡單語句,set / raw
          277                 if operator in TOKEN_KEY_SET_SIMPLE_EXPRESSION:
          278                     self.add_simple_block_statement(operator, suffix)
          279                 elif operator in TOKEN_KEY_LOOP_CTRL:
          280                     if not in_loop:
          281                         raise ParseException("{0} must in loop block".format(operator))
          282                     self.code_data.append_statement(operator)
          283                 else:
          284                     # 控制語句 檢查匹配if 后面可以跟elif/else
          285                     pre_condition = TOKEN_KEY_PRE_CONDITION.get(operator, None)
          286                     if pre_condition:
          287                         # 里面就是elif/else/end
          288                         if control_operator not in pre_condition:
          289                             raise ParseException("{0} must behind with {1}".format(operator, pre_condition))
          290                         elif operator == TOKEN_KEY_END:
          291                             # 遇到{% end %}則結束
          292                             self.code_data.close_code()
          293                             return
          294                         else:
          295                             # 由于是依據if 進入 來計算elif ,因此elif與if是同級的
          296                             self.code_data.close_code()
          297                             self.code_data.append_statement(content + TOKEN_COLON)
          298                             self.code_data.create_code()
          299                             self.__parse(operator, in_loop or (operator in TOKEN_KEY_LOOP))
          300                             break
          301                     # 添加控制語句及內部語句體 if for while
          302                     self.code_data.append_statement(content + TOKEN_COLON)
          303                     self.code_data.create_code()
          304                     self.__parse(operator, in_loop or (operator in TOKEN_KEY_LOOP))
          305             else:
          306                 raise ParseException("Unkown brace")
          307         return
          308 
          309     def __compiled_code(self):
          310         """生成 編譯code """
          311         self.code_data.build_code(self.filename)
          312 if __name__ == "__main__":
          313         t = Template("<html>{{hello}}</html>")
          314         t.render(hello="你好"

          原文鏈接:
          http://www.cnblogs.com/jeffxun/p/15585073.html

          面的表格列出了所有用于處理 HTML 和 CSS 的 jQuery 方法。

          下面的方法適用于 HTML 和 XML 文檔。除了:html() 方法。

          方法描述
          addClass()向被選元素添加一個或多個類名
          after()在被選元素后插入內容
          append()在被選元素的結尾插入內容
          appendTo()在被選元素的結尾插入 HTML 元素
          attr()設置或返回被選元素的屬性/值
          before()在被選元素前插入內容
          clone()生成被選元素的副本
          css()為被選元素設置或返回一個或多個樣式屬性
          detach()移除被選元素(保留數據和事件)
          empty()從被選元素移除所有子節點和內容
          hasClass()檢查被選元素是否包含指定的 class 名稱
          height()設置或返回被選元素的高度
          html()設置或返回被選元素的內容
          innerHeight()返回元素的高度(包含 padding,不包含 border)
          innerWidth()返回元素的寬度(包含 padding,不包含 border)
          insertAfter()在被選元素后插入 HTML 元素
          insertBefore()在被選元素前插入 HTML 元素
          offset()設置或返回被選元素的偏移坐標(相對于文檔)
          offsetParent()返回第一個定位的祖先元素
          outerHeight()返回元素的高度(包含 padding 和 border)
          outerWidth()返回元素的寬度(包含 padding 和 border)
          position()返回元素的位置(相對于父元素)
          prepend()在被選元素的開頭插入內容
          prependTo()在被選元素的開頭插入 HTML 元素
          prop()設置或返回被選元素的屬性/值
          remove()移除被選元素(包含數據和事件)
          removeAttr()從被選元素移除一個或多個屬性
          removeClass()從被選元素移除一個或多個類
          removeProp()移除通過 prop() 方法設置的屬性
          replaceAll()把被選元素替換為新的 HTML 元素
          replaceWith()把被選元素替換為新的內容
          scrollLeft()設置或返回被選元素的水平滾動條位置
          scrollTop()設置或返回被選元素的垂直滾動條位置
          text()設置或返回被選元素的文本內容
          toggleClass()在被選元素中添加/移除一個或多個類之間切換
          unwrap()移除被選元素的父元素
          val()設置或返回被選元素的屬性值(針對表單元素)
          width()設置或返回被選元素的寬度
          wrap()在每個被選元素的周圍用 HTML 元素包裹起來
          wrapAll()在所有被選元素的周圍用 HTML 元素包裹起來
          wrapInner()在每個被選元素的內容周圍用 HTML 元素包裹起來
          $.escapeSelector()轉義CSS選擇器中有特殊意義的字符或字符串
          $.cssHooks提供了一種方法通過定義函數來獲取和設置特定的CSS值

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


          主站蜘蛛池模板: 亚洲.国产.欧美一区二区三区| 无码人妻精品一区二区三区蜜桃 | 精彩视频一区二区三区| 少妇特黄A一区二区三区| 精品一区二区久久久久久久网精| 国产婷婷一区二区三区| 丝袜美腿一区二区三区| 国产亚洲一区二区在线观看| 国产一区二区精品久久91| 国产电影一区二区| 亚洲综合av永久无码精品一区二区 | 国产亚洲综合精品一区二区三区| 亚洲AV无码一区二区二三区入口 | 亚洲一区二区在线免费观看| 变态调教一区二区三区| 无码人妻aⅴ一区二区三区有奶水| 久久精品视频一区二区三区| 香蕉视频一区二区| 日韩精品无码久久一区二区三| 一本一道波多野结衣AV一区 | 无码AV一区二区三区无码| 无码人妻一区二区三区兔费| 一区二区视频在线播放| 久久精品国产亚洲一区二区| 中文字幕一区二区三区精华液| 免费无码一区二区| 免费一区二区三区在线视频| 国产成人精品视频一区| 免费精品一区二区三区在线观看 | 国产免费一区二区三区不卡| jizz免费一区二区三区| 乱中年女人伦av一区二区| 国产日韩精品一区二区在线观看| 国产精品视频免费一区二区| 中文字幕AV无码一区二区三区| 国产香蕉一区二区在线网站 | 国产精品合集一区二区三区| 人妻av无码一区二区三区| 人妻无码久久一区二区三区免费| 亚洲一区二区三区电影| 亚洲区精品久久一区二区三区 |