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
若客戶提出一個(gè)質(zhì)量屬性要求,要實(shí)現(xiàn)一個(gè)Web查詢,性能200毫秒以內(nèi),請(qǐng)問這個(gè)要求高還是低?
對(duì)一個(gè)web系統(tǒng)來說,200毫秒是一個(gè)比較高的性能。
憑啥這么說,你要是做過架構(gòu)的話,就明白這個(gè)道理。
作為架構(gòu)師,必須了解完整過程,每一個(gè)細(xì)節(jié)。
你應(yīng)該能把整個(gè)系統(tǒng)分解成若干個(gè)環(huán)節(jié),并且各環(huán)節(jié)的細(xì)節(jié)你都能了解。這個(gè)環(huán)節(jié)是硬的還是軟的?會(huì)不會(huì)影響這個(gè)部分的性能開銷?
看下圖,能看到你從發(fā)起請(qǐng)求,一直到頁面呈現(xiàn)完了之后的4個(gè)主要環(huán)節(jié)。
要細(xì)分的話,其實(shí)當(dāng)中還有更多的環(huán)節(jié)。
網(wǎng)絡(luò)大概走多少毫秒,差不多50ms,環(huán)節(jié)取決于網(wǎng)絡(luò)環(huán)境,要是跨國的話,從中國到美國,可能要上百。
這個(gè)是系統(tǒng)架構(gòu)改變不了的。
那就是200已經(jīng)去掉了50,或者100,剩下100多可以用。
收到數(shù)據(jù)之后,需要瀏覽器渲染出來,又需要多長時(shí)間呢?
這個(gè)時(shí)間不確認(rèn),看渲染結(jié)果復(fù)不復(fù)雜,有沒ajax再次請(qǐng)求這類情況。
可能簡單的,10幾毫秒,復(fù)雜的更長。
右邊從Web服務(wù)器到應(yīng)用服務(wù)器、從應(yīng)用服務(wù)器到數(shù)據(jù)庫DB之間,還有性能開銷。
數(shù)據(jù)庫檢索出來是一個(gè)值,這個(gè)值到了你的開發(fā)語言里面,經(jīng)過底層框架,需要做數(shù)據(jù)類型轉(zhuǎn)換,變成程序里的一個(gè)對(duì)象。
一個(gè)架構(gòu)師,就要學(xué)會(huì)區(qū)分,哪些是架構(gòu)能左右的,能夠改善的,哪些是我不能解決的,最后在你能解決的部分里想辦法。
你都了解了之后,你就能專業(yè)地跟客戶說,這個(gè)200毫秒我做不到。
或者說在什么條件下,我能做到。
一個(gè)事情,只有你都了解的情況下,才能給出一個(gè)可行方案。
讓我們一步步看一下整個(gè)過程:
對(duì)于成功的響應(yīng),狀態(tài)代碼為 200。
響應(yīng)中有 3 部分:HTML、CSS 、 Javascript。
瀏覽器渲染的順序:
1. 瀏覽器解析HTML并生成DOM樹。
2. 解析 CSS 并生成 CSSOM 樹。
3. 結(jié)合 DOM 樹和 CSSOM 樹來構(gòu)建渲染樹。
4. 節(jié)點(diǎn)布局
5. 最后頁面渲染,瀏覽器將內(nèi)容呈現(xiàn)并顯示給用戶。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登錄頁面</title>
/*總體的樣式*/
<style>
/*盒子樣式*/
#box{
width: 350px; //寬
height: 450px; //高
border: 1px solid black; //邊框
border-radius: 10px; //邊框弧度
font-family: 黑體; //字體
letter-spacing:8px; //段間距
word-spacing: 10px; //字間距
line-height: 40px; //行高
font-size: 18px; //字大小
padding: 20px; //內(nèi)邊框
}
/*給'注冊(cè)'賦予樣式*/
.register{
width:280px ; //寬
height: 50px; //高
background-color: skyblue; //背景顏色
border-radius: 10px; //邊框弧度
}
/*將所有邊框都改變*/
*{
border-radius: 5px; 邊框弧度
}
/*使用class選擇器,賦予number寬高和邊框*/
.number{
width: 185px; //寬
height: 27px; //高
border-width: 1px; //邊框?qū)挾?
}
/*id選擇器*/
#two{
width: 55px; //寬
border-width: 1px; 邊框?qū)挾? }
/*id選擇器*/
#phone{
width: 103px; //寬
}
/*class 選擇器*/
.boxs{
zoom: 75%; //清除浮動(dòng)
color: darkgray; //顏色
}
/*class選擇器*/
.box_a{
width: 50px; //寬
height: 50px; //高
background-image: url("../image/04.jpg "); //背景圖片
background-repeat: no-repeat; // 是否平鋪
background-size: 50px 25px; //背景尺寸
position: relative; //定位 相對(duì)定位
left: 310px; //定位后左移
bottom: 32px; //定位后下移
}
</style>
</head>
<body>
<div id="box">
<h1>請(qǐng)注冊(cè)</h1>
<p style="color: darkgray">已有帳號(hào)?<a href="https://im.qq.com/index">登錄</a></p>
<form action="" method="post">
<label for="name">用戶名</label>
<input type="text" placeholder="請(qǐng)輸入用戶名" id="name" class="number"> <br>
<label for="phone">手機(jī)號(hào)</label>
<select name="" id="two" class="number">
<optgroup>
<option style="" class="">+86</option>
</optgroup>
</select>
<input type="text" placeholder="請(qǐng)輸入手機(jī)號(hào)" id="phone" class="number"> <br>
<label for="mima">密?碼</label>
<input type="password" placeholder="請(qǐng)輸入密碼" id="mima" class="number"> <br>
<label for="mima">驗(yàn)證碼</label>
<input type="password" placeholder="請(qǐng)輸入驗(yàn)證碼" id="is" class="number">
<div class="box_a"></div>
<div class="boxs">
<input type="radio" id="" class="accept">閱讀并接受協(xié)議<br>
</div>
<input type="submit" value="注冊(cè)" class="register" >
</form>
</div>
</body>
</html>
在這里插入圖片描述
HTML 是一種描述網(wǎng)頁語言, 指的是超文本標(biāo)記語言 (Hyper Text Markup Language)。其中,超文本指的是網(wǎng)頁上可以包含圖片,視頻,連接信息。標(biāo)記也叫做標(biāo)簽,所以標(biāo)簽書寫的是<內(nèi)容>。語言就是一種交流工具,HTML 是用戶與瀏覽器之間交互工具。
簡單說,HTML 是由瀏覽器解析執(zhí)行的,它不會(huì)將 HTML 標(biāo)簽展示出來,而是會(huì)解析 HTML 標(biāo)簽,以特定效果展示出來。
<html>
<head>HEAD</head>
<body>BODY</body>
</html>
可以使用 JetBrains WebStorm 或者 VS Code 進(jìn)行開發(fā)。
<html> 代表當(dāng)前書寫的是一個(gè) HTML 文檔
<head> 存儲(chǔ)的本頁面的一些重要的信息,它不會(huì)顯示
標(biāo)簽下有一個(gè)子標(biāo)簽 <title> 它是用于定義頁面的標(biāo)題的
<body> 書寫的內(nèi)容會(huì)顯示出來,屬性:1. text 用于設(shè)置文字顏色;2. bgcolor 用于設(shè)置頁面的背景色;3. background 用于設(shè)置頁面的背景圖片
<!-- 注釋不會(huì)在瀏覽器中顯示 -->
br 標(biāo)簽就是一個(gè)換行功能標(biāo)簽
在 p 標(biāo)簽中的內(nèi)容會(huì)在開始與結(jié)束之間產(chǎn)生一個(gè)空白行并且它會(huì)自動(dòng)換行
常用屬性 align 的作用是設(shè)置段落中的內(nèi)容對(duì)齊方式,可取值有 left right center
hr 標(biāo)簽會(huì)在頁面上產(chǎn)生一個(gè)水平線
常用屬性:
align:可取值有 left right center 代表水平線位置
size:代表水平線高度(厚度)
width:代表水平線寬度
color:水平線的顏色
兩種方式:
Div 是一個(gè)塊標(biāo)簽
Div 與 CSS 結(jié)合,會(huì)更好對(duì)頁面進(jìn)行排版
Span 標(biāo)簽也是一個(gè)塊標(biāo)簽Div 與 span 區(qū)別:Div 會(huì)自動(dòng)換行,我們也叫這樣的標(biāo)簽為行級(jí)元素Span 標(biāo)簽它不會(huì)自動(dòng)換行,我們也叫它為行內(nèi)元素
Font 標(biāo)簽可以設(shè)置字體,字的大小及顏色
常用屬性:
Face:用于設(shè)置字體,例如 宋體 隸書 楷體
Size:用于設(shè)置字的大小
Color:用于設(shè)置字的顏色
我們所看到的屏幕上所有的顏色都是由紅、綠、藍(lán)這三種基色調(diào)混合而成的。每一種顏色的飽和度和透明度都是可以變化的,用 0~255 的數(shù)值來表示。如純紅色表示為 (255,0,0),十六進(jìn)制表示為 #FF0000。按這種表達(dá)方式,理論上我們可以得到 256 * 256 *256=16777216 種顏色。
<h1> 最大 <h6> 最小,它們代表的是標(biāo)題,可以使用 <b> <i> 對(duì)文字設(shè)置加粗或傾斜
注意:在 HTML 中允許標(biāo)簽進(jìn)行嵌套的,但是一般都包裹嵌套,而不可以進(jìn)行交叉嵌套
有序清單:
<!-- 有序列表 I II III-->
<ol type="I" start="3">
<li>張三</li>
<li>李四</li>
<li>王五</li>
</ol>
<!-- 無序列表 -->
<ul type="square">
<li>Java</li>
<li>Python</li>
<li>C#</li>
</ul>
<img> 可以讓我們?cè)诰W(wǎng)頁引入一張圖片
常用屬性
<a> 標(biāo)簽可以實(shí)現(xiàn)跳轉(zhuǎn)到其它頁面操作。超鏈接內(nèi)容不僅可以是文本,也可以是圖片等信息
常用屬性
<!-- 學(xué)習(xí)表格標(biāo)簽 -->
<table border="2" align="center" width="400px">
<caption>學(xué)生成績單</caption>
<tr>
<th>姓名</th>
<th>語文成績</th>
<th>數(shù)學(xué)成績</th>
<td colspan="2" align="center"><b>操作</b></td>
</tr>
<tr align="center">
<td>張三</td>
<td>99</td>
<td>100</td>
<td>修改</td>
<td>刪除</td>
</tr>
<tr align="center">
<td>李四</td>
<td>90</td>
<td>66</td>
<td>修改</td>
<td>刪除</td>
</tr>
</table>
通過表單可以將要提交的數(shù)據(jù)提交到指定的位置
<!-- 表單:用戶注冊(cè)案例 -->
<form name="form1" action="user/login" method="POST">
<table border="1" width="64%" align="center">
<tr>
<td>用戶名:</td>
<td>
<input type="text" name="username">
</td>
</tr>
<tr>
<td>密碼:</td>
<td>
<input type="password" name="password">
</td>
</tr>
<tr>
<td>性別:</td>
<td>
<input type="radio" name="sex" checked="checked">男
<input type="radio" name="sex" >女
</td>
</tr>
<tr>
<td>地址:</td>
<td>
<select name="province">
<option value="0">--請(qǐng)選擇省--</option>
<option value="10001">廣東</option>
<option value="10002">上海</option>
<option value="10003">山東</option>
</select> 省
<select name="city">
<option>--請(qǐng)選擇市--</option>
<option value="1000301">廣州市</option>
<option>深圳市</option>
<option>東莞市</option>
</select> 市
</td>
</tr>
<tr>
<td>編程語言:</td>
<td>
<input type="checkbox" name="language" checked="checked">Java
<input type="checkbox" name="language">Python
<input type="checkbox" name="language">Go
</td>
</tr>
<tr>
<td>照片:</td>
<td>
<input type="file" name="image">
</td>
</tr>
<tr>
<td>自我介紹:</td>
<td>
<textarea name="remark" rows="5" cols="100"></textarea>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="注冊(cè)">
<input type="reset" value="取消">
</td>
</tr>
</table>
</form>
通過框架標(biāo)簽可以定制 HTML 頁面布局
在 HTML 頁面上去描述框架信息時(shí),不可以將 <frameset> 寫在 <body> 標(biāo)簽中
framesetTest.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>HTML 框架標(biāo)簽</title>
</head>
<!-- rows 定義了三行:第一行 100 像素,第三行:100 像素;第二行:剩下的像素 -->
<frameset rows="100, * , 100">
<frame name="topModule" src="./top.html"></frame>
<frameset cols="100, * ">
<frame name="menuModule" src="./menu.html"></frame>
<frame name="contentModule" src="./content.html"></frame>
</frameset>
<frame name="footModule" src="./foot.html"></frame>
</frameset>
</html>
top.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>top</title>
</head>
<body>
<div>頭部信息</div>
</body>
</html>
foot.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>footL</title>
</head>
<body>
<div>底部信息</div>
</body>
</html>
menu.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>menu</title>
</head>
<body>
<div>菜單信息</div>
</body>
</html>
content.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>content</title>
</head>
<body>
<div>內(nèi)容顯示區(qū)</div>
</body>
</html>
<meta> 標(biāo)簽必須寫在 <head> 標(biāo)簽之間
使用 link 標(biāo)簽來導(dǎo)入 CSS
詳情查看菜鳥教程:https://www.runoob.com/charsets/ref-html-ascii.html
DOM, Document Object Model -- 文檔對(duì)象模型,是 HTML 和 XML 文檔的編程接口,以樹結(jié)構(gòu)表達(dá) HTML 文檔。
DOM 是 W3C(萬維網(wǎng)聯(lián)盟)的標(biāo)準(zhǔn)。
DOM 定義了訪問 HTML 和 XML 文檔的標(biāo)準(zhǔn)。
W3C DOM 標(biāo)準(zhǔn)被分為 3 個(gè)不同的部分:
DOM 是被視為節(jié)點(diǎn)樹的 HTML。
根據(jù) W3C 的 HTML DOM 標(biāo)準(zhǔn),HTML 文檔中的所有內(nèi)容都是節(jié)點(diǎn):
HTML DOM 將 HTML 文檔視作樹結(jié)構(gòu),這種結(jié)構(gòu)被稱為節(jié)點(diǎn)樹。
節(jié)點(diǎn)樹中的節(jié)點(diǎn)彼此擁有層級(jí)關(guān)系。常用父(parent)、子(child)和同胞(sibling)等術(shù)語來描述這些關(guān)系。父節(jié)點(diǎn)擁有子節(jié)點(diǎn)。同級(jí)的子節(jié)點(diǎn)被稱為同胞(兄弟或姐妹)。
HTML DOM 方法是可以在節(jié)點(diǎn)(HTML 元素)上執(zhí)行的動(dòng)作。
HTML DOM 屬性是可以在節(jié)點(diǎn)(HTML 元素)設(shè)置和修改的值。
可通過 JavaScript (以及其他編程語言)對(duì) HTML DOM 進(jìn)行訪問。所有 HTML 元素被定義為對(duì)象,而編程接口則是對(duì)象方法和對(duì)象屬性。方法是能夠執(zhí)行的動(dòng)作(比如添加或修改元素)。屬性是能夠獲取或設(shè)置的值(比如節(jié)點(diǎn)的名稱或內(nèi)容)。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>DOM</title>
</head>
<body>
<div id="div1">
<p id="p1">Hello</p>
<p id="p2">Hello</p>
</div>
<script>
// 先獲取 P 元素
var element = document.getElementById("p1")
// 直接修改 p 元素的內(nèi)容
element.innerHTML = "此時(shí)已是修改后的內(nèi)容"
// 修改 p2 標(biāo)簽的樣式
var ele = document.getElementById("p2")
ele.style.color="blue"
ele.style.fontFamily="宋體"
ele.style.fontSize="larger"
// 添加元素
// 創(chuàng)建一個(gè)p元素
var elementP = document.createElement("p")
// 創(chuàng)建一個(gè)內(nèi)容
var nodeText = document.createTextNode("新加的 P 元素")
// 把文字內(nèi)容添加到p元素中
elementP.appendChild(nodeText)
// 把新創(chuàng)建的p元素添加div1元素中
var div1 = document.getElementById("div1")
div1.appendChild(elementP)
// 插入添加新的元素
// 創(chuàng)建一個(gè)新的元素
var eleP = document.createElement("p")
// 創(chuàng)建一個(gè)內(nèi)容
var noText = document.createTextNode("在 P1 元素前添加的新元素")
// 把文字內(nèi)容添加到 p 元素中
eleP.appendChild(noText)
// 把新創(chuàng)建的 p 元素添加 div 1 元素中
var parentDiv1 = document.getElementById("div1")
// 獲取指定被添加的元素
var p1 = document.getElementById("p1")
// 在元素前添加;參數(shù)說明:1.要添加的元素;2.在那個(gè)元素之前添加(指定一個(gè)元素)
parentDiv1.insertBefore(eleP, p1)
// 刪除元素
// 獲取父元素
var pdiv1 = document.getElementById("div1")
var removep1 = document.getElementById("p1")
// 使用父元素刪除該元素
pdiv1.removeChild(removep1)
</script>
</body>
</html>
HTML DOM 允許 JavaScript 對(duì) HTML 事件作出反應(yīng)。當(dāng)事件發(fā)生時(shí),可以執(zhí)行 JavaScript,比如發(fā)生用戶點(diǎn)擊一個(gè) HTML 元素的事件。
如需在用戶點(diǎn)擊某個(gè)元素時(shí)執(zhí)行代碼,可以把 JavaScript 代碼添加到 HTML 事件屬性中:onclick=JavaScript
HTML 事件的例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>DOM 事件</title>
<!-- JavaScript 代碼必須寫在 script 中 -->
<script>
function onLoadFun(){
alert("已載入...");
}
// 文本框失去焦點(diǎn)事件
function onBlurFun(){
alert("此方法是文本框失去焦點(diǎn)事件,用來校驗(yàn)此文本框輸入數(shù)據(jù)的")
}
// 表單被提交時(shí)執(zhí)行事件
function onSubmitFun(){
alert("此表單已提交,這個(gè)方法也可以來作為數(shù)據(jù)校驗(yàn)的");
}
// 元素被改變時(shí)觸發(fā)事件
function onChangeFun(){
alert("文本框元素已輸入新的數(shù)據(jù)")
}
// 當(dāng)鼠標(biāo)懸停在某一個(gè)元素上時(shí)執(zhí)行的方法
function onMouseOverFun(element){
element.innerHTML = "鼠標(biāo)已停在H1元素上了"
}
// 當(dāng)鼠標(biāo)離開某一個(gè)元素時(shí)執(zhí)行事件
function onMouseOutFun(element){
element.innerHTML = "鼠標(biāo)已離開H1元素上了..."
}
</script>
</head>
<!-- 需求:當(dāng)頁面被載入時(shí),執(zhí)行一個(gè)代碼,彈框提示已載入 -->
<body onload="onLoadFun()">
<!-- 需求:在一個(gè)表單中有用戶名錄入的文本框,當(dāng)輸入完文本框的時(shí)候進(jìn)行名稱校驗(yàn),提交的時(shí)候彈框顯示 -->
<form onsubmit="onSubmitFun()">
用戶名:<input id="username" name="username" onchange="onChangeFun()" >
<br/>
<button type="submit">提交</button>
</form>
<!-- 需求:有一個(gè) H1 標(biāo)簽元素,當(dāng)鼠標(biāo)移動(dòng)到 H1 元素上時(shí),修改文字,當(dāng)鼠標(biāo)移出元素時(shí)執(zhí)行事件 -->
<h1 onmouseover="onMouseOverFun(this)" onmouseout="onMouseOutFun(this)">我是一個(gè)標(biāo)題</h1>
</body>
</html>
想了解更多,歡迎關(guān)注我的微信公眾號(hào):Renda_Zhang
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。