整合營銷服務商

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

          免費咨詢熱線:

          網頁編程:如何在HTML中插入一條水平線?

          天的主題是網頁編程中的水平線。

          同學們好,今天我來分享一些免費的少兒編程知識。只要每天堅持學習一行代碼,你也可以成為編程高手!今天我們要學習如何在HTML中插入一條水平線,使用的是HR標簽。HR是一個自閉合標簽,雖然它沒有標準的屬性,但我們可以通過CSS來控制它的外觀。

          先來看看我們的實例效果。在頁面上,兩行文字被一條直線分開。這條直線就是HR標簽,效果已經展示出來了。現在我們來看看實現的代碼。HR標簽的寫法非常簡單,但在最開始的時候,它有四個屬性,現在已經不被標準支持了。盡管如此,我們仍然可以使用它。

          今天的實例中,我們已經將這些標簽加入到了代碼中。如果你感興趣,可以查看下方的代碼。按下空格鍵可以看到過時的屬性不會被智能提示,但這并不影響代碼的正確性。將注釋取消后保存,然后回到瀏覽器刷新,可以看到屬性仍然有效。線條的高度為3,寬度為400,并且居中顯示。取消陰影后,線條將變為純色。

          這只是一個演示,你可以參考一下。從這個示例中,我們可以看到,HR標簽的寬度是根據頁面寬度自動調整的。當它的寬度達到整個瀏覽器時,它會自動換行。既然屬性已經過時了,那么我們如何通過HTML來控制外觀呢?CSS是我們今天要學習的內容。

          先取消注釋的代碼,讓HTML失效,然后保存。回到瀏覽器刷新,就可以看到線條變成了藍色。

          今天的分享就到這里,希望各位同學可以試著寫三遍,不需要看視頻也可以掌握這個技巧。如果你需要案例和相關文檔,可以向我咨詢。

          我們下期再見,想學習編程的同學記得關注哦。

          了執行Javascript,需要在HTML文件內以特定的方式書寫JavaScript的代碼,JavaScript的書寫方法有多種,其執行的流程也各不相同:

          1 <script>標簽嵌入

          此種嵌入方法無法操作<script>之后的DOM元素。因為<script>之后的DOM元素還未構造,因此在<script>標簽內就無法取得位于其后的DOM元素。

          2 讀取外部JavaScript文件

          此種嵌入方法可以指定defer、async屬性。defer可以推遲執行,async可以異步執行。

          3 onload嵌入

          此種嵌入方法在頁面讀取完后再對其執行,所以可以對所有的DOM元素操作。

          <body onload="alert('hello')">
          window.onload = function(){alert('hello');};

          當window.onload事件觸發時,頁面上所有的DOM、樣式表、腳本、圖片、flash都已經加載完成了。

          //window.onload不能同時編寫多個。
          //以下代碼無法正確執行,結果只輸出第二個。
          window.onload = function(){
            alert("test1");
          };
          
          window.onload = function(){
            alert("test2");
          };
          
          //$(document).ready()能同時編寫多個
          //結果兩次都輸出
          $(document).ready(function(){ 
             alert("Hello World"); 
          }); 
          $(document).ready(function(){ 
             alert("Hello again"); 
          }); 

          window.onload和body中onload也有些許區別:

          <html xmlns="http://www.w3.org/1999/xhtml">
          <head>
              <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
              <title></title>
              <script type="text/javascript" src="http://code.jquery.com/jquery-1.9.0.js"></script>
              <script language="javascript">
                  window.onload = haha;
                  function haha(){console.log("window.onload");}
          
                  if(document.addEventListener){
                      function DOMContentLoaded(){
                          console.log("DOMContentLoaded");
                      }
                      document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
                  }</script>
          </head>
          <body onload="console.log('bodyonload');">
                  <div id="div1">a</div>
          </body>
          </html>

          在IE10和FireFox下,結果為 :

          "DOMContentLoaded"
          "bodyonload"

          說明body中的onload會覆蓋window.onload

          在chrome下,結果為:

          DOMContentLoaded
          window.onload
          bodyonload

          然后,如果把javascript代碼移到最下面,結果又會是什么樣呢?

          chrome和IE10、FireFox的結果竟然是一樣的:

          DOMContentLoaded
          window.onload

          IE 10、Fire Fox可以理解,window.on load和body中的 on load 誰在下面就是誰覆蓋誰,只會執行后面的那個。

          4 DOM ContentLoaded嵌入

          onload方法可能需要等待時間,而本方法可以在完成HTML解析后發生的事件,減少等待時間。

          在chrome、IE10和FireFox中,執行結果是:DOMContentLoaded然后才是onload的輸出。所以說一般情況下,DOMContentLoaded事件要在window.onload之前執行,當DOM樹構建完成的時候就會執行DOMContentLoaded事件。

          <html xmlns="http://www.w3.org/1999/xhtml">
          <head>
              <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
              <title></title>
              <script type="text/javascript" src="jquery2.js"></script>
              <script language="javascript">
                  window.onload = haha;
                  function haha(){console.log(document.getElementById("div1"));}
                  if(document.addEventListener){
                      function DOMContentLoaded(){
                          console.log("DOMContentLoaded");
                      }
                      document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
                  }
              </script>
          </head>
          <body>
              <div id="div1">a</div>
          </body>
          </html>

          如果你是個jQuery使用者,你可能會經常使用$(document).ready();或者$(function(){}),這都是使用了DOMContentLoaded事件

          5 動態載入JavaScript文件

          5.1 使用原生js方法

          動態創建script標簽,并指定script的src屬性

          function loadJs(url, callback) {
              var script = document.createElement('script');
              script.type = "text/javascript";
              if (typeof(callback) != "undefined") {
                  if (script.readyState) {
                      script.onreadystatechange = function() {
                          if (script.readyState == "loaded" || script.readyState == "complete") {
                              script.onreadystatechange = null;
                              callback();
                          }
                      }
                  } else {
                      script.onload = function() {
                          callback();
                      }
                  }
              }
              script.src = url;
              document.body.appendChild(script);
          }
          loadJs("test.js", function() {
              alert('done');
          });

          還可以使用同樣的原理動態加載css文件,只不過插入的的父節點是head標簽。

          5.2 使用document.write/writeln()方式

          該種方式可以實現js文件的動態加載,原理就是在重寫文檔流,這種方式會導致整個頁面重繪。

          document.writeln("<script src=\"http://lib.sinaapp.com/js/jquery/1.6/jquery.min.js\"></script>");

          需要注意的是特殊字符的轉義。

          5.3 使用jQuery

          使用getScript(url,callback)方法實現動態加載js文件

          $.getScript('test.js',function(){
              alert('done');
          });

          -End-

          比于早些年前后端代碼緊密耦合、后端工程師還得寫前端代碼的時代,如今已發展到前后端分離,這種開發方式大大提升了前后端項目的可維護性與開發效率,讓前后端工程師關注于自己的主業。然而在帶來便利的同時,也帶來了一些弊端,比如首屏渲染時間(FCP)因為首屏需要請求更多內容,比原來多了更多HTTP的往返時間(RTT),這造成了白屏,如果白屏時間過長,用戶體驗會大打折扣,如果用戶網速差,則FCP會更長。

          由此引申出一系列的優化方法,骨架屏也因此被提出,本文就以 Vue 項目中的骨架屏為例,探討一下骨架屏的優缺點和注入方式。

          感興趣的同學可以加一下微信群,一起討論吧~

          1. FCP 優化

          在 Google 提出的以用戶為中心的四個頁面性能衡量指標中,FP/FCP可能是開發者們最熟悉的了:

          為了優化首屏渲染時間這個指標,減少白屏時間,前端仔們想了很多辦法:

          • 加速或減少HTTP請求損耗:使用CDN加載公用庫,使用強緩存和協商緩存,使用域名收斂,小圖片使用Base64代替,使用Get請求代替Post請求,設置 Access-Control-Max-Age 減少預檢請求,頁面內跳轉其他域名或請求其他域名的資源時使用瀏覽器prefetch預解析等;
          • 延遲加載:非重要的庫、非首屏圖片延遲加載,SPA的組件懶加載等;
          • 減少請求內容的體積:開啟服務器Gzip壓縮,JS、CSS文件壓縮合并,減少cookies大小,SSR直接輸出渲染后的HTML等;
          • 瀏覽器渲染原理:優化關鍵渲染路徑,盡可能減少阻塞渲染的JS、CSS;
          • 優化用戶等待體驗:白屏使用加載進度條、菊花圖、骨架屏代替等;

          這里要介紹的就是優化用戶等待體驗的骨架屏,它可以被視為是原來加載菊花圖的一種升級版,結合傳統的首屏優化方法對應用進行優化可以達到不錯的效果。

          2. 骨架屏

          骨架屏可以理解為是當數據還未加載進來前,頁面的一個空白版本,一個簡單的關鍵渲染路徑。可以看一下下面Facebook的骨架屏實現,可以看到在頁面完全渲染完成之前,用戶會看到一個樣式簡單,描繪了當前頁面的大致框架的骨架屏頁面,然后骨架屏中各個占位部分被實際資源完全替換,這個過程中用戶會覺得內容正在逐漸加載即將呈現,降低了用戶的焦躁情緒,使得加載過程主觀上變得流暢。

          可以看一下下面的示例圖,第一個為骨架屏,第二個為菊花圖,第三個為無優化,可以看到相比于傳統的菊花圖會在感官上覺得內容出現的流暢而不突兀,體驗更加優良。

          如今這項技術已經在Facebook、Google、支付寶、餓了么、簡書、新浪微博、知乎、美團、領英等公司的產品中被廣泛的使用。在論壇和社區也都有不少文章討論骨架屏的實現和使用場景等。

          3. 生成骨架屏的方法

          生成骨架屏的方式主要有:

          1. 手寫HTML、CSS的方式為目標頁定制骨架屏 做法可以參考,主要思路就是使用 vue-server-renderer 這個本來用于服務端渲染的插件,用來把我們寫的 .vue文件處理為 HTML,插入到頁面模板的掛載點中,完成骨架屏的注入。這種方式不甚文明,如果頁面樣式改變了,還得改一遍骨架屏,增加了維護成本。
          2. 使用圖片作為骨架屏;簡單暴力,讓UI同學花點功夫吧哈哈;小米商城的移動端頁面采用的就是這個方法,它是使用了一個Base64的圖片來作為骨架屏。
          3. 自動生成并自動插入靜態骨架屏 這種方法跟第一種方法類似,不過是自動生成骨架屏,可以關注下餓了么開源的插件 page-skeleton-webpack-plugin ,它根據項目中不同的路由頁面生成相應的骨架屏頁面,并將骨架屏頁面通過 webpack 打包到對應的靜態路由頁面中,不過要注意的是這個插件目前只支持history方式的路由,不支持hash方式,且目前只支持首頁的骨架屏,并沒有組件級的局部骨架屏實現,作者說以后會有計劃實現。

          另外還有個插件 vue-skeleton-webpack-plugin,它將插入骨架屏的方式由手動改為自動,原理在構建時使用 Vue 預渲染功能,將骨架屏組件的渲染結果 HTML 片段插入 HTML 頁面模版的掛載點中,將樣式內聯到 head標簽中。這個插件可以給單頁面的不同路由設置不同的骨架屏,也可以給多頁面設置,同時為了開發時調試方便,會將骨架屏作為路由寫入router中,可謂是相當體貼了。

          vue-skeleton-webpack-plugin 的具體使用參考 vue-style-codebase,主要關注build目錄的幾個文件,實例跑起來之后在 Chrome 的 DevTools 中把 network 的網速調為 Gast3G/Slow3G 就能看到效果了~


          主站蜘蛛池模板: 国产精品综合一区二区三区| 久久精品一区二区三区资源网| 无码人妻精品一区二区三区不卡| 久久久久女教师免费一区| 精品国产一区二区三区2021| 精品国产乱码一区二区三区 | 大帝AV在线一区二区三区| 激情综合丝袜美女一区二区| 在线观看亚洲一区二区| 99国产精品欧美一区二区三区| 久久se精品一区精品二区国产| 久久久久久人妻一区精品 | 国产精品无码一区二区三区毛片| 变态调教一区二区三区| 国产一区二区三区影院| 国产精品一区二区av不卡| 亚洲国产精品无码第一区二区三区| 人妻无码一区二区三区| 无码人妻一区二区三区免费| 久久精品亚洲一区二区三区浴池| 无码毛片一区二区三区视频免费播放 | 老湿机一区午夜精品免费福利| 亚洲老妈激情一区二区三区| 国产美女av在线一区| 国模极品一区二区三区| 国产精品无圣光一区二区| 亚洲一区二区三区免费视频 | 99久久精品国产一区二区成人 | 国产午夜福利精品一区二区三区| 影院成人区精品一区二区婷婷丽春院影视| 久久久久久免费一区二区三区| 中文字幕一区二区三区日韩精品| 色精品一区二区三区| 日韩精品无码Av一区二区| 无码人妻精品一区二| 亚洲国产精品成人一区| 久久精品国产亚洲一区二区| 九九久久99综合一区二区| 人体内射精一区二区三区| 中文字幕在线不卡一区二区| 国产日韩精品一区二区三区|