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
文基于掘金作者kkkkkkkkeep的文章,略作補充修改,文末有版權申明
amfe-flexible:根據設備寬度,修改根元素html的大小,以適配不同終端
px2rem-loader:將css中的px轉為rem單位,用了它就不用自己計算rem值了
注意:amfe-flexible是lib-flexible的優化,主要區別是amfe-flexible不會改變視口大小
復制代碼npm install -s amfe-flexible
npm i px2rem-loader --save -dev
復制代碼// 入口文件main.js中引入
import 'amfe-flexible/index.js'
復制代碼// 在index.html中修改meta
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
amfe-flexible干了什么呢?
復制代碼// build/utils.js
const px2remLoader = {
loader: 'px2rem-loader',
options: {
remUnit: 75 //默認換算為1rem為75px,可根據你的原型圖修改
}
}
// 在generateLoaders方法中添加px2remLoader
function generateLoaders (loader, loaderOptions) {
const loaders = options.usePostCSS ? [cssLoader, postcssLoader, px2remLoader] : [cssLoader, px2remLoader]
if (loader) {
loaders.push({
loader: loader + '-loader',
options: Object.assign({}, loaderOptions, {
sourceMap: options.sourceMap
})
})
}
// Extract CSS when that option is specified
// (which is the case during production build)
if (options.extract) {
return ExtractTextPlugin.extract({
use: loaders,
fallback: 'vue-style-loader'
})
} else {
return ['vue-style-loader'].concat(loaders)
}
}
主要用來處理元素容器寬高比。
如果我們想要做一個188:246(188是容器寬度,246是容器高度)這樣的比例容器,只需要這樣使用:
復制代碼[w-188-246] {
aspect-ratio: '188:246';
}
有一點需要特別注意:aspect-ratio屬性不能和其他屬性寫在一起,否則編譯出來的屬性只會留下aspect-ratio的值。主要是因為在插件中做了相應的處理,不在每次調用aspect-ratio時,生成前面指定的默認樣式代碼,這樣代碼沒那么冗余。所以在使用的時候,需要分開來寫:
復制代碼// 編譯前
[w-188-246] {
width: 188px;
background-color: red;
}
[w-188-246] {
aspect-ratio: '188:246';
}
復制代碼// 編譯后
[w-188-246] {
width: 25.067vw;
background-color: red;
}
[w-188-246]:before {
padding-top: 130.85106382978725%;
}
postcss-px-to-viewport主要用來把px單位轉換為vw、vh、vmin或者vmax這樣的視窗單位。
目前出視覺設計稿,我們都是使用750px寬度的,那么100vw = 750px,即1vw = 7.5px。在不想要把px轉換為vw的時候,首先在對應的元素(html)中添加配置中指定的類名.ignore或.hairlines(.hairlines一般用于設置border-width:0.5px的元素中)
復制代碼// 編譯前
.test {
border: .5px solid black;
border-bottom-width: 4px;
font-size: 14px;
line-height: 20px;
position: relative;
}
[w-188-246] {
width: 188px;
}
復制代碼// 編譯后
.test {
border: .5px solid #000;
border-bottom-width: .533vw;
font-size: 1.867vw;
line-height: 2.667vw;
position: relative;
}
[w-188-246] {
width: 25.067vw;
}
postcss-write-svg插件主要使用的是border-image和background來做1px的相關處理。
復制代碼// 編譯前
@svg 1px-border {
height: 2px;
@rect {
fill: var(--color, black);
width: 100%;
height: 50%;
}
}
.example {
border: 1px solid transparent;
border-image: svg(1px-border param(--color #00b1ff)) 2 2 stretch;
}
復制代碼// 編譯后
.example {
border: 1px solid transparent;
border-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='2px'%3E%3Crect fill='%2300b1ff' width='100%25' height='50%25'/%3E%3C/svg%3E") 2 2 stretch;
}
復制代碼// 編譯前
@svg square {
@rect {
fill: var(--color, black);
width: 100%;
height: 100%;
}
}
#example {
background: white svg(square param(--color #00b1ff));
}
復制代碼// 編譯后
#example {
background: white url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Crect fill='%2300b1ff' width='100%25' height='100%25'/%3E%3C/svg%3E");
}
主要用來讓我們使用CSS未來的特性,其會對這些特性做相關的兼容性處理。
cssnano主要用來壓縮和清理CSS代碼。在Webpack中,cssnano和css-loader捆綁在一起,所以不需要自己加載它。不過你也可以使用postcss-loader顯式的使用cssnano。
cssnano集成了一些其他的PostCSS插件,如果你想禁用cssnano中的某個插件的時候,可以像下面這樣操作:
復制代碼"cssnano": {
autoprefixer: false,
"postcss-zindex": false
}
postcss-viewport-units插件主要是給CSS的屬性添加content的屬性,配合viewport-units-buggyfill庫給vw、vh、vmin和vmax做適配的操作。
默認PostCSS插件(通過Vue-cli構建的項目默認安裝了):
復制代碼npm i postcss-import --S
npm i postcss-url --S
npm i autoprefixer --S
其他PostCSS插件:
復制代碼npm i postcss-aspect-ratio-mini --S
npm i postcss-px-to-viewport --S
npm i postcss-write-svg --S
npm i postcss-cssnext --S
npm i postcss-viewport-units --S
npm i cssnano --S
復制代碼// 根目錄下的.postcssrc.js
module.exports = {
"plugins": {
"postcss-import": {},
"postcss-url": {},
"postcss-aspect-ratio-mini": {},
"postcss-write-svg": {
utf8: false
},
"postcss-cssnext": {},
"postcss-px-to-viewport": {
viewportWidth: 750, // 視窗的寬度,對應的是我們設計稿的寬度,一般是750
viewportHeight: 1334, // 視窗的高度,根據750設備的寬度來指定,一般指定1334,也可以不配置
unitPrecision: 3, // 指定`px`轉換為視窗單位值的小數位數(很多時候無法整除)
viewportUnit: 'vw', // 指定需要轉換成的視窗單位,建議使用vw
selectorBlackList: ['.ignore', '.hairlines'], // 指定不轉換為視窗單位的類,可以自定義,可以無限添加,建議定義一至兩個通用的類名
minPixelValue: 1, // 小于或等于`1px`不轉換為視窗單位,你也可以設置為你想要的值
mediaQuery: false // 允許在媒體查詢中轉換`px`
}
"postcss-viewport-units":{},
"cssnano": {
"cssnano-preset-advanced": {
zindex: false,
autoprefixer: false
},
}
}
}
復制代碼// 在index.html中修改meta
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no" />
什么情況下適合使用vw呢?
https://github.com/wswmsword/postcss-mobile-forever
一款 PostCSS 插件,用于將固定尺寸的移動端視圖轉為具有最大寬度的可伸縮的移動端視圖。該插件可以轉換視口單位(px->vw)、限制視圖最大寬度(min(vw, px))、生成適應桌面端和橫屏的媒體查詢(@media)。
如果您在使用 postcss-px-to-viewport(后簡稱 px2vw) 實現伸縮界面的時候,不希望界面在大屏設備上撐滿整個屏幕而難以瀏覽,希望界面在達到某一個合適的寬度后停止伸縮(限制最大寬度),您可以使用本插件。
您可以在線查看一個范例,通過旋轉屏幕、改變窗口大小、在不同屏幕查看展示效果。范例頂部的文字會提示您,當前的視圖是移動端豎屏(Portrait)、移動端橫屏(Landscape)還是桌面端(Desktop)。
作者:kkkkkkkkeep
鏈接:https://juejin.cn/post/6844903917126434829
來源:稀土掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
使用Requests發送網絡請求非常簡單:
# 導入requests模塊,若未安裝需要先安裝(如: pip install requests) import requests # # GET請求 r = requests.get('https://api.github.com/events') # # POST請求 r = requests.post('http://httpbin.org/post', data={'key': 'value'}) # # DELETE請求 r = requests.delete('http://httpbin.org/delete') # # HEAD請求 r = requests.head('http://httpbin.org/get') # # OPTION請求 r = requests.options('http://httpbin.org/get')
Requests允許使用params關鍵字參數,以一個字符串字典來為URL提供參數:
# 將參數以字典形式傳遞給params payload = {'key1': 'value1', 'key2': 'value2'} r = requests.get('http://httpbin.org/get', params=payload) print(r.url) # # 還可以將一個列表作為值傳入 payload = {'key1': 'value1', 'key2': ['value2', 'value3']} r = requests.get('http://httpbin.org/get', params=payload) print(r.url)
三、響應內容
我們能讀取服務器響應的內容:
import requests r = requests.get('https://api.github.com/events') # # 使用r.text時,requests會自動檢測文本編碼并將內容打印出來 print(r.text) # # 我們可以通過修改r.encoding來修改編碼方式 print(r.encoding) # 'utf-8'非常常見 r.encoding = 'ISO-8859-1' # # 有些HTML、XML頁面指定了不同的編碼,我們可以通過r.content來找到編碼,然后設置r.encoding為響應的編碼,這樣既可正確解析r.text。
四、二進制響應內容
對于非文本請求,我們也能以字節的方式訪問請求響應體:
print(r.content) # # Requests會自動解碼gzip、deflate傳輸編碼的響應數據 # 例如,以請求返回的二進制數據創建一張圖片: from PIL import Image from io import BytesIO i = Image.open(BytesIO(r.content))
五、JSON響應內容
Requests中有一個內置的JSON解碼器,可以幫助我們處理JSON數據
import requests r = requests.get('https://api.github.com/events') # # 使用r.json()來解析json格式的數據,若解析失敗,會拋出一個異常。 print(r.json()) # # r.json()調用成功并不意味著響應成功,檢查請求是否成功可以使用如下兩個方式: print(r.raise_for_status()) print(r.status_code)
六、原始響應內容
在罕見的情況下,我們可能想獲取來自服務器的原始套接字響應:
r = requests.get('https://api.github.com/events', stream=True) print(r.raw) print(r.raw.read(10)) # # 但一般情況下,我們應該先將文本流保存到文件 with open(filename, 'wb') as writer: for chunk in r.iter_content(chunk_size): writer.write(chunk)
七、定制請求頭
如果想為請求添加HTTP頭部,只要簡單地傳遞一個dict給headers參數即可:
url = 'https://api.github.com/some/endpoint' headers = {'user-agent': 'my-app/0.0.1'} r = requests.get(url, headers=headers) # # 定制header的優先級低于某些特定的信息源,如: # 1. 如果在.netrc中設置了用戶認證信息,使用headers=設置的授權就不會生效,而如果設置了auth=參數,.netrc的設置就無效了。 # 2. 如果被重定向到別的主機,授權header就回被刪除 # 3. 代理授權header會被URL中提供的代理身份覆蓋掉 # 4. 在我們能判斷內容長度的情況下,header的Content-Length會被改寫。
八、更復雜的POST請求
通常,你想要發送一些編碼為表單形式的數據--非常像一個HTML表單,要實現這個,只需要簡單傳遞一個字典給data參數,它會自動編碼:
payload = {'key1': 'value1', 'key2': 'value2'} r = requests.post('http://httpbin.org/post', data=payload) print(r.text) # # data參數還接受元組的形式 payload = (('key1', 'value1'), ('key2', 'value2')) r = requests.post('http://httpbin.org/post', data=payload) print(r.text) # # 很多時候我們想要發送的數據并非編碼為表單形式的,比如我們就是要傳遞string而不是按照dict解析,那么數據將會被直接發布出去 import json url = 'https://api.github.com/some/endpoint' payload = {'some': 'data'} r = requests.post(url, data=json.dumps(payload)) # # 除了自行對dict編碼,還可以使用json參數直接傳遞: r = requests.post(url, json=payload)
九、POST一個多部分編碼(Multipart-Encoded)的文件
# 如:上傳xls文件 url = 'http://httpbin.org/post' files = {'file': open('report.xls', 'rb')} r = requests.post(url, files=files) print(r.text) # # 我們可以顯式地設置文件名、文件類型和請求頭: url = 'http://httpbin.org/post' files = {'file': ('report.xls', open('report.xls', 'rb'), \ 'application/vnd.ms-excel', {'Expires': '0'})} r = requests.post(url, files=files) print(r.text) # # 我們也可以發送作為文件來接收的字符串 url = 'http://httpbin.org/post' files = {'file': ('report.csv', 'some,data,to,send\nanather,row,to,send\n')} r = requests.post(url, files=files) print(r.text)
十、響應狀態碼
r = requests.get('http://httpbin.org/get') print(r.status_code) # # 為方便引用,Requests還附帶了一個內置的狀態碼查詢對象 print(r.status_code == requests.codes.ok) # # 如果發送了一個錯誤請求(比如一個4XX客戶端錯誤,或者5XX服務器錯誤響應),我們可以通過Response.raise_for_status()來拋出異常: bad_r = requests.get('http://httpbin.org/status/404') print(bad_r.status_code) bad_r.raise_for_status()
十一、響應頭
# 我們可以查看以字典形式展示的服務器響應頭 print(r.headers) # # eg.1 一個響應頭 { 'content-encoding': 'gzip', 'transfer-encoding': 'chunked', 'connection': 'close', 'server': 'nginx/1.0.4', 'x-runtime': '148ms', 'etag': '"e1ca502697e5c9317743dc078f67693f"', 'content-type': 'application/json' } # # HTTP頭部是大小寫不敏感的,因此如下都是可以的: print(r.headers['Content-Type']) print(r.headers.get('content-type')
十二、Cookie
# 通過.cookies可以訪問響應所包含的cookie url = 'http://example.com/some/cookie/setting/url' r = requests.get(url) print(r.cookies['example_cookie_name']) # # 要發送cookies到服務器,可以使用cookies參數: url = 'http://httpbin.org/cookies' cookies = dict(cookies_are='working') r = requests.get(url, cookies=cookies) print(r.text) # # Cookie的返回對象是RequestsCookieJar,它的行為和字典類似,但接口更完整,適合跨域名和跨路徑使用,我們還可以把Cookie Jar傳到Requests中: jar = requests.cookies.RequestsokieJar() jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies') jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere') url = 'http://httpbin.org/cookies' r = requests.get(url, cookies=jar) print(r.text)
十三、重定向與請求歷史
默認情況下,除了HEAD,Requests會自動處理所有重定向。
可以使用響應對象的history方法來追蹤重定向,Response.history是一個Response對象的列表,這個對象列表按照從最老到最近的請求進行排序。
r = requests.get('http://github.com') print(r.url) print(r.status_code) print(r.history) # # 如果使用的是GET、OPTIONS、POST、PUT、PATCH或者DELETE,那么我們可以通過allow_redirects參數禁用重定向處理: r = requests.get('http://github.com', allow_redirects=False) print(r.status_code) print(r.history) # # 如果使用了HEAD,我們也可以啟用重定向: r = requests.head('http://github.com', allow_redirects=True) print(r.url) print(r.history)
十四、超時
timeout參數用于設置等待響應的最長時間,即requests會在等待該時間之后停止等待響應。若不設置該參數,程序可能會永遠失去響應:
requests.get('http://github.com', timeout=0.001)
十五、錯誤與異常
安裝postcss-px2rem、px2rem-loader
打開命令行工具,輸入以下指令安裝插件
npm install postcss-px2rem px2rem-loader --save
安裝完后package.json文件會多如圖兩個插件
在根目錄src中新建utils目錄下新建rem.js等比適配文件
const baseSize = 16
// 設置 rem 函數
function setRem() {
// 當前頁面寬度相對于 1920寬的縮放比例,可根據自己需要修改。
const scale = document.documentElement.clientWidth / 1920
// 設置頁面根節點字體大小(“Math.min(scale, 2)” 指最高放大比例為2,可根據實際業務需求調整)
document.documentElement.style.fontSize = baseSize * Math.min(scale, 2) + 'px'
}
// 初始化
setRem()
// 改變窗口大小時重新設置 rem
window.onresize = function () {
setRem()
}
在main.js中引入適配文件
import './utils/rem'
vue.config.js文件中配置插件
*請認真填寫需求信息,我們會在24小時內與您取得聯系。