從今天開始,學習前端基礎。css
前端,就是HTML CSS JS 等html
對於咱們這種初學者,並不知道這些專業術語都是什麼,給你們舉一個形象的例子:前端
HTML 就是一我的,赤裸裸的人python
CSS 就是衣服,用來給人裝扮的衣服,能夠裝扮的很漂亮web
JS 就是讓人動起來,否則人就是一個木頭人,沒法動彈,只有經過這個纔可讓這我的變得活動起來。chrome
想知道前端和後端是如何交互的嗎?數據庫
我也是第一次知道,感受很好玩,我給你們作個demo 來演示一下客戶端是如何經過瀏覽器和服務器交互的小程序
服務器端:後端
#!/usr/bin/env python3 # Author: Shen Yang import socket def handle_request(client): buf = client.recv(1024) client.send(bytes("HTTP/1.1 200 OK\r\n\r\n",encoding='utf-8')) f = open('index.html', 'r', encoding='utf-8') data = f.read() f.close() import time r = str(time.time()) data.replace('@@@@@',r) re=data.encode() client.send(re) def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('192.168.1.27', 8000)) sock.listen(5) while True: connection, address = sock.accept() handle_request(connection) connection.close() if __name__ == '__main__': main()
很好,咱們完成了一個最基本的socket server 端瀏覽器
好了,說了這些,相信你們已經能理解了。下面從HTML 開始
HTML 就是一套規則,是瀏覽器認識的規則,瀏覽器會根據相應的標籤,來渲染對應方式的網頁。
若是想開發HTML 網頁,就要學習這套規則,咱們寫html 寫好一個模板,而後經過後端程序去查詢數據庫把獲取的結果放到對應的位置,這樣就成了動態網頁了。
HTML 怎麼測試呢?很簡單,寫好文件直接使用瀏覽器打開便可,也能夠經過pycharm 來打開這個頁面,效果都同樣。
一個HTML 文件都有什麼呢?
1 頭部 head,和人同樣,須要有頭
2 身體 body,同上
記住,一個HTML 文件只有一個html 標籤,第一行的意思是要說明這個html文件遵循的是什麼標準,由於瀏覽器不少,因此有不少不一樣的標準,可是目前你們都遵循這個標準,因此之後寫html就寫上這一行就能夠了。
這個標籤裏的意思是html 的屬性,lang 是說使用en 語言
head 標籤裏的內容是一些特殊的屬性:
body 裏寫網頁的主題內容,就是咱們人類可見的信息。
html 註釋的方法是 :
<!DOCTYPE html>
<!-- 這裏是註釋
相似於html 這種尖括號的東西叫作標籤,裏面的東西就是標籤的屬性 -->
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="http://www.baidu.com">百度一下</a>
</body>
</html>
其實html 標籤按大的分類 分爲兩種:
1 自閉合標籤
2 主動閉合標籤
可是之後建議寫標籤的時候全寫爲主動閉合標籤,這樣在查找和修改的時候是很方便的。
先說自閉合標籤:
1 指定字符集
<meta charset='UTF-8'>
2 刷新和跳轉
這個不經常使用,很差,看不到有幾秒 救急用
< meta http-equiv=「Refresh」 Content=「30″>
< meta http-equiv=」Refresh「 Content=」5; Url=http://www.autohome.com.cn「 />
3 關鍵詞
< meta name="keywords" content="星際2,星際老男孩,專訪,F91,小色,JOY" >
4 描述
例如:cnblogs
5 X-UA-Compatible 兼容IE 的設置,若是不關心IE 下的效果的就不用寫
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
6 icon 網站在瀏覽器中的小圖標
自閉合標籤基本就這些,下面開始學習重要的主動閉合標籤,這些標籤是咱們最經常使用的標籤,咱們在寫html的時候用的最多的就是這些標籤:
1 <p></p> 段落標籤 佔一行
3 <span></span> 標籤,是行內標籤,不換行
說到這裏咱們能夠爲全部的標籤根據是否佔一行來分類:
1 塊級標籤,無論多少字都佔一行 例如: h 系列 b 標籤
咱們來寫一個簡單的文件看一下他們的區別:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>個人小站</title>
</head>
<body>
<p>這裏是一個段落<br/>這是一個段落</p>
<p>新的段落</p><p>新的段落2</p>
<h1>最大的標題,無論標題文字多少,都佔用一行</h1>
<h2>第二大標題,無論標題文字多少,都佔用一行</h2>
<span>行內標題,標題多大佔用多大</span>
</body>
</html>
繼續說主動閉合標籤:
4 <div></div> 是一個白板,可是是塊級標籤 用的最多, 經過css 能夠來回轉換爲span 等
<span></span> 也是一個白板,可是是行內標籤
還有,標籤之間是能夠鑲嵌的:
讓咱們來個小結:
寫了這麼多全是看得見的東西,讓咱們寫一個能夠輸入的東西吧,寫一個登錄的小程序:
<body> <input type="text" name="user"/> <input type="text" name="email"/> <input type="password" name="pwd"/> <input type="submit" value="提交"/> </body>
打開是這樣的:
能夠輸入信息,能夠點提交,可是咱們並不知道要提交到哪裏,並不能看到如何和服務器交互。
其實想和服務器交互是須要提交數據給服務器的,html 會把這裏的數據以一個字典的形式發送給服務器。
因此咱們須要把這段代碼用form 包裹起來,並指定要提交的服務器及提交的方式:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="http://192.168.16.35:8888/index" method="POST"> <input type="text" name="user"/> <input type="text" name="email"/> <input type="password" name="pwd"/> <input type="submit" value="提交"/> </form> </body> </html>
這樣咱們看到的網頁是這個樣子的,當點擊提交之後會出現一個表單數據,是以一個字典方式提交的,服務器就是從這裏取數據的。
加入請求方式 POST
就是把數據放到了請求頭中發送
寫一個helloworld 服務端和客戶端,使用chrome 來請求,讓咱們看下服務器是如何和瀏覽器交互的:
server:
import tornado.ioloop import tornado.web # pip3 install tornado class MainHandler(tornado.web.RequestHandler): def get(self): print(111) u = self.get_argument('user') e = self.get_argument('email') p = self.get_argument('pwd') if u == 'yang' and p == '123' and e == 'yang@qq.com': self.write("OK") else: self.write("滾") def post(self, *args, **kwargs): u = self.get_argument('user',None) e = self.get_argument('email',None) p = self.get_argument('pwd',None) print(u,e,p) self.write('POST') application = tornado.web.Application([ (r"/index", MainHandler), ]) if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start()
啓動
客戶端網頁:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="http://192.168.1.27:8888/index" method="GET"> <input type="text" name="user"/> <input type="text" name="email"/> <input type="password" name="pwd"/> <input type="submit" value="提交"/> </form> </body> </html>
打開這個網頁,輸入數據,提交
GET 方式:
能夠看到數據是從url 中提交的:
服務器端的響應:
使用POST 提交:
服務端相應:
固然表單也是能夠提交給別人的:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>Yang 搜索!搜天下</h1> <form action="https://www.sogou.com/web"> <input type="text" name="query"/> <input type="submit" value="搜索" /> </form> </body> </html>
這樣作出的網頁是直接用搜狗搜索的
作一個小總結:
默認值:
上傳文件依賴於form 的屬性 ,form 加上這個屬性
實踐一個完整的例子:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form enctype="multipart/form-data"> <div> 用戶:<input type="text" name="user"/> 密碼:<input type="text" name="pwd"/> <p>請選擇性別:</p> 男:<input type="radio" name="gender" value="1" checked="checked"/> 女:<input type="radio" name="gender" value="2"/> <p>愛好</p> 籃球:<input type="checkbox" name="favor" value="1"/> 足球:<input type="checkbox" name="favor" value="2"/> 檯球:<input type="checkbox" name="favor" value="3"/> 網球:<input type="checkbox" name="favor" value="4"/> <p>技能</p> 撩妹:<input type="checkbox" name="skill" value="1"/> 寫代碼:<input type="checkbox" name="skill" value="2"/> <p>上傳文件</p> <input type="file" name="fname"/> </div> <input type="submit" value="提交"/> <input type="reset" value="重置"/> </form> </body> </html>
效果:
多行數據:
下拉框:
取數據:
分組:
select 定義name option 定義value 就能夠提交到後臺了
實踐一下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form enctype="multipart/form-data"> <div> <select name="city"> <option value="1">上海</option> <option value="2">北京</option> <option value="3">廣州</option> </select> 用戶:<input type="text" name="user"/> 密碼:<input type="text" name="pwd"/> <p>請選擇性別:</p> 男:<input type="radio" name="gender" value="1" checked="checked"/> 女:<input type="radio" name="gender" value="2"/> <p>愛好</p> 籃球:<input type="checkbox" name="favor" value="1"/> 足球:<input type="checkbox" name="favor" value="2"/> 檯球:<input type="checkbox" name="favor" value="3"/> 網球:<input type="checkbox" name="favor" value="4"/> <p>技能</p> 撩妹:<input type="checkbox" name="skill" value="1"/>p 寫代碼:<input type="checkbox" name="skill" value="2"/> <p>上傳文件</p> <input type="file" name="fname"/> <textarea name="meno">請文明發言,否則會封禁你的IP</textarea> <select name="df" multiple="multiple" size="2"> <option>昌平</option> <option>昌平2</option> <option>昌平3</option> </select> </div> <input type="submit" value="提交"/> <input type="reset" value="重置"/> </form> </body> </html>
a標籤的跳轉屬性:
例子:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form> <div> <select name="city"> <option value="1">上海</option> <option value="2">北京</option> <option value="3">廣州</option> </select> </div> <a href="#i1">第1個目錄</a> <a href="#i2">第2個目錄</a> <a href="#i3">第3個目錄</a> <a href="#i4">第4個目錄</a> <div id="i1" style="height: 600px;">第1個</div> <div id="i2" style="height: 600px;">第2個</div> <div id="i3" style="height: 600px;">第3個</div> <div id="i4" style="height: 600px;">第4個</div> </form> </body> </html>
在html 中 id 是不能重複的,name 能夠重複
圖片標籤:
效果:
總結一下:
列表標籤:
兩種:
效果:
實踐:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <table border="1"> <tr> <td>主機</td> <td>端口</td> <td>操做</td> </tr> <tr> <td>192.168.1.1</td> <td>80</td> <td> <a href="#">刪除</a> <a href="#">詳細</a> </td> </tr> <tr> <td>192.168.1.2</td> <td>88</td> <td> <a href="#">刪除</a> <a href="#">詳細</a> </td> </tr> </table> </body> </html>
上面的不規範,規範的就是分表格的表頭和表身
上下佔幾行:(縱向合併)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <table border="1"> <thead> <tr> <td>主機</td> <td>端口</td> <td>操做</td> </tr> </thead> <tbody> <tr> <td colspan="2">192.168.1.1</td> <td>80</td> <!--<td>--> <!--<a href="#">刪除</a>--> <!--<a href="#">詳細</a>--> <!--</td>--> </tr> <tr> <td>192.168.1.2</td> <td>88</td> <td> <a href="#">刪除</a> <a href="#">詳細</a> </td> </tr> <tr> <td>192.168.1.3</td> <td>99</td> <td> <a href="#">刪除</a> <a href="#">詳細</a> </td> </tr> </tbody> </table> </body> </html>
合併列:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <table border="1"> <thead> <tr> <td>主機</td> <td>端口</td> <td>操做</td> </tr> </thead> <tbody> <tr> <td rowspan="2">192.168.1.1</td> <td>80</td> <td> <a href="#">刪除</a> <a href="#">詳細</a> </td> </tr> <tr> <!--<td>192.168.1.2</td>--> <td>88</td> <td> <a href="#">刪除</a> <a href="#">詳細</a> </td> </tr> <tr> <td>192.168.1.3</td> <td>99</td> <td> <a href="#">刪除</a> <a href="#">詳細</a> </td> </tr> </tbody> </table> </body> </html>
點label 就會能輸入
CSS 能夠給白板來着色:
若是標籤是i1 就會應用這個樣式
雖然這樣能夠,可是不規範,id都同樣了,在html 中 id 是不能同樣的!!
第三種方法: {最最最經常使用}
這裏又引出了一個名詞:
意思是找到本頁全部的div 並設置對應的顏色,無論你在幾層裏,都會設置
span 下面的全部div 標籤給渲染了
類和層級的混合選擇:
意思是查找 class="c1" 的標籤下的 div 標籤
組合選擇器:
能夠選擇多個,class等都是這樣使用
屬性選擇器:
把type爲text 屬性的標籤所有渲染
屬性能夠自定義:
根據標籤裏的屬性再作一次篩選
總結:
.
CSS 樣式的優先級:
引入文件中的樣式:
全部的其餘文件均可以引入這個文件,重用性最好的:
默認給你把上下左右都加上了,也能夠單獨加不一樣的邊
指定長寬等:
固然,也能夠經過百分比來調整
水平居中:
水平和上下都居中,加上line-height
line-height 的意思爲設置文字在那個像素之間垂直居中
加粗:
實踐:
<dev style="border: 2px solid deepskyblue; height: 48px; width: 200px; text-align: center; color: palevioletred; font-size: 25px; font-weight: bold; ">This is my name</dev>
效果:
float
飄起來,定義從哪裏飄,飄的位置:
也能夠另外一個從右邊開始飄,這樣中間就會留下一個空白
若是超過百分之多少就另起一行
重要的一點,飄起來後的結尾必定要添加:
<div style="clear: both;"></div>
否則就下不來了,出現錯版
效果:
這種就是默認display = none 當點的時候就會顯示:
離上邊的高度有多少:
針對內部的來看 是他的外部增長了多少