基本知識點
媒體查詢
- 關鍵字
- and
- or
- not(not 的范圍到逗號為止)
media = "only screen and (min-width:401px)"
使用媒體查詢的時候最好帶上 only
關鍵字,因為舊的瀏覽器不支持媒體查詢這樣反而不識別這段查詢代碼,不會響應布局。如果不帶關鍵字 only
那么瀏覽器會只識別 `media = "screen...",就只會有一種布局。
-
常用的屬性簡介
- width/height:視口寬度/布局視口
- device-width/height:屏幕寬度/可視視口
- 以上四個屬性都可以添加
min-
/max-
前綴 - orientation:設備方向
理想視口
<meta name="viewport" content="width=device-width" />
分析設計圖
- 設計原則
- 漸進增強
- 優雅降級(推薦)
- 先設計大屏還是小屏根據實際案例
- 先在一個瀏覽器調試好(推薦谷歌)
- 設置斷點(屏幕分辨率的分界點)
- 一般根據屏幕尺寸類別(大中?。┰O置臨界點而不不是針對某個特定手機分辨率
一般小型項目的目錄結構
- ResponsiveWeb(總項目)
- doc(項目相關文檔文件夾)
- .editorconfig(統一代碼風格,編輯器會優先按照里面的設置來格式化代碼)
- .gitignore(git提交時要忽略的文件)
- LICENSE.txt(保存版權聲明)
- README.md(項目簡介)
- CHANGLOG.md(項目版本更新、修復內容介紹)
- src(源代碼)
- css
- main.css(通用)
- normalize.css(重置)
- login.css(對應頁面)
- js
- main.js(通用頁面)
- verdor(第三方庫文件夾)
- jquery.js
- img(圖片)
- index.html
- login.html(功能頁面)
- 404.html(默認錯誤頁)
- robots.txt(搜索引擎查看的文件,確定可以抓取的內容(非強制))
- favicon.ico(網站logo)
- humans.txt(保存網站團隊信息等,給別人看的)
開始編寫代碼
編碼格式
<meta charset="utf-8">
,要放在 title 之前,否則會無效兼容模式(IE8后開始,IE11后此文檔模式被棄用)
<meta http-equiv="x-ua-compatible" content="ie-edge">
<!-- equiv中的內容表示對 IE 瀏覽器開啟兼容模式,content 中的內容表示渲染模式,edge表示強制使用 IE 最新的渲染模式,content="ie=EmulateIE7"表示IE7渲染模式 -->
- IE條件注釋
//IE hack gt(大于),lt(小于),gte(大于等于),lte。IE8不支持H5和媒體查詢,注意IE 和版本號之間要有空格
<!--[if lte IE 8]>
<p>您的瀏覽器版本過低,請更新<a >browsehappy</a></p>
<![endif]-->
-
命名規范
注意標簽語義化,class 命名使用-
分割,id 命名一般用于 js,使用_
分割(或者駝峰命名法)。- section,article 最好有標題,沒有合適的標題用 DIV 嵌套即可。
使用圖片
必不可少的圖片使用<img>
引入,而裝飾線的圖片可以使用 CSS 樣式引入。
PC 端開發
CSS Resets(重置默認樣式)
推薦使用 Normalize.css。-
px,em,rem
響應式布局一般使用 em/rem,響應式布局一般不要求百分百還原。- rem
- 不建議使用 rem 設置行高,因為谷歌瀏覽器有字體號下限
- rem
小技巧
關于相鄰選擇符
設置導航欄時,有的時候第一個元素不需要設置樣式,可以通過相鄰選擇符來設置,比如li + li
-
關于 inline-block 產生的間距解決方案
- 可以給子元素設置 margin 負值
- 刪除 html 中子元素的空白字符
- 給父元素 font-size:0 子元素再設置 font-size
- 給父元素和子元素設置不同的 letter-spacing
-
雪碧圖 siprites
- 利用 background-position 定位
-
透明度
- 只需要背景色透明,利用 RGBA
-
box-sizing
- 可以改變盒模型的計算方式,對于inline-block 的布局可以簡化計算
-
content 中的空格
- 使用
content:'最新公告:\00a0\00a0';//\00a0即空格
- 使用
文字不換行并使用省略號
text-overflow:ellipsis;
overflow:hidden;
white-space:nowrap;
-
相同圖片不同顏色
- 使用濾鏡 filter 屬性
- 前綴可以通過 在線添加前綴網站 生成
-
清除浮動
父容器末尾添加一個子元素,樣式
clear:both
(不建議)給父容器添加
overflow:auto/hidden;
屬性給父元素也設置浮動屬性(不建議,影響頁面布局)
-
使用
:after
偽元素.clearfix:after { content: "."; display:block; height:0; clear:both; visibility:hidden; } .clearfix { zoom: 1;//為了兼容 IE6,IE7,觸發 haslayout }
-
觸發 BFC(原理就是觸發BFC)
- float
- overflow:auto/hidden
- display:table-cell/table-caption/inbline-block
- position:fixed/absolute
-
改進方案
.clearfix:before, .clearfix:after { //before防止頂部疊加 content: " "; display: table; } .clearfix:after { clear: both; }
移動端開發
媒體查詢
可以寫在樣式表最后或則每個變化元素之后。-
確定斷點
- 根據設計稿來設計。利用谷歌開發者工具查看。最低寬度可以限制為 320px,低于這個就不需要適配了。
- 寫媒體查詢的時候可以同屏顯示兩個窗口,方便寫樣式
CSS3選擇器
-
表格響應式處理(在小屏幕下的解決方案)
- 隱藏表格不重要的列
- 表格橫列倒置
- 轉變成表單格式展示
針對打印的 樣式
@media print {
*,
*:before,
*:after { // 清除背景色
background: transparent !important;
color: #000 !important;
box-shadow: none !important;
text-shadow: none !important;
}
a,
a:visited { // 加下劃線
text-decoration: underline;
}
a[href]:after {
content: "("attr"(href)")";
}
footer {
width: 100%;
}
a[href^="#"]:after,
a[href^="javascript:"]:after { // js調試的不用打
content: "";
}
pre,
blockquote {
border: 1px solid #999;
page-break-inside: avoid;
}
thead {
display: table-header-group;
}
tr,
img {
page-break-inside: avoid;
}
img {
max-width: 100% !important;
}
p,
h2,
h3 {
orphans: 3; // 分頁時底部保留的最少行數
widows: 3; // 分頁時頂部保留的最少行數
}
h2,
h3 {
page-break-after: avoid; //避免在元素后插入分頁符
}
}
-
響應式廣告和圖片
- 挑選第三方組件
- 使用人數
- 是否開源
- 文檔是否齊全
- 活躍性
- 輕量級
- OwlCarousel2(建議使用。201610)
- 挑選第三方組件
-
響應式圖片
- js 或服務端
- 獲取客戶端尺寸后動態更改圖片源或者服務器判斷后返回
- srcset 屬性配合 sizes(實現在不同分辨率下顯示一張圖片的不同規格)
<img srcset="img/480.png 480w,img/800.png 800w" sizes="(min-width:800px) 800px, 100vw">
- w 為圖片尺寸,vw 為視口寬度,sizes 告訴瀏覽器圖片的寬度占整個div的百分比,瀏覽器也會根據此來設置圖片寬度,可以設置媒體查詢 瀏覽器會用自己的規則(網絡,尺寸等)綜合考慮后更改圖片源
- picture(實現多組圖片匹配)
<picture> <source media="(min-width:36em)" srcset="img/xxx.jpg 768w"/> <source media="(min-width:36em)" srcset="img/xxx.jpg 1800w"/> <source type="image/svg+xml" srcset="xxx.svg 800w,xxx.svg 1800w"/>//如果瀏覽器支持該格式的圖片就會顯示 <img src="xxx.jpg"> </picture> // 瀏覽器會匹配媒體查詢/或者條件查詢后的結果然后顯示對應的圖片
-
使用 svg
- js 或服務端
-
小工具
- polyfill(填平瀏覽器兼容的坑,解決兼容性的統稱,腳本,可以放心的使用新特效)
- picturefill 庫(可以使用上面提到的 picture srcset)
- 圖片在線壓縮網站
- polyfill(填平瀏覽器兼容的坑,解決兼容性的統稱,腳本,可以放心的使用新特效)
設備兼容性調試
發布前需要進行兼容性測試,虛擬機。
安卓虛擬機
iOS虛擬機可以用 XCode
-
兼容性解決
- 使用新特性前去 caniuse 查看
- 瀏覽器hacks
- 使用庫
- polyfill
- resopnd(IE678 媒體查詢)
- shiv
- html5shiv(HTML5新標簽)
- Modernizr(檢測新特性的兼容性,再做不同情況的樣式處理)
- polyfill
-
在多個設備進行測試
browsersync
可以多個瀏覽器同時查看網頁。http://www.browsersync.cn/??梢酝ㄟ^ npm 安裝-
啟動服務
- `browser-sync start --server "目錄" --files "監聽的文件,可以通配符或者文件夾,寫目錄也行"
Node.js簡介
是一個基于 Chrome V8 引擎的 JS 運行環境??梢栽诜?JS 環境下運行 JS 代碼。npm 是其中一個功能。
npm 的使用
-
install xx
在當前文件目錄下執行
npm install jquery
就會安裝插件 -
node_modules 文件夾
使用 npm 安裝的第三方庫會統一安裝到這個目錄下,沒有必要進行 git,svn 版本管理,使用 package.json 進行統一的包管理即可。
-
package.json
運行命令
npm init
,向導配置后生成一個 json 文件
{
"name": "nodetest",
"version": "1.0.0",
"description": "readme.txt",
"main": "test.js",
"dependencies": {
"jquery": "^3.1.1"
},
"devDependencies": {},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
}
"author": "",
"license": "ISC"
}
dependencies,生產環境(上線)所需要的包
devDependencies,開發項目時需要的包寫在這里
-
"jquery": "^3.1.1"
- ^ 表示大版本號要一致,總的版本號要大于等于該版本
- ~ 表示前幾位要一致,后一位可以不同
- 如果無前綴則是精確版本
-
利用 npm 安裝依賴包
直接運行 npm install 即可,會根據 package.json 安裝依賴的包
-
npm install xx --production
安裝到生產包 -
npm install xx --dev
安裝到開發環境包 -
npm install -g jquery
安裝后全部本地項目不需要安裝
-
-
更新 package.json
安裝包的時候加上后綴。
-
--save-dev
開發環境 -
--save
生產環境
-
-
卸載包
uninstall,要更新 package.json 也要加上 save 后綴
-
更新包
update 包
局域網訪問(遠程訪問)
-
使用 http-server
npm install http-server -g
-
設定根目錄
-
http-server [path][options]
//path 即文件路徑。啟動后會提供兩個地址,一個本地一個局域網 -
http-server [path] -p [端口號]
指定端口
-
Ctrl+C結束服務。
打包發布
發布前的代碼優化
- 壓縮/合并/增加版本號
- 手動在線壓縮
- 使用工具
- Grunt/自動化構建工具
- Gulp/自動化構建工具,推薦
- Webpack/靜態資源打包工具
Gulp 介紹
npm 安裝,一般作為開發依賴項安裝,生產環境不需要使用。npm install gulp --save-dev
注意:該包全局安裝后還需要在項目安裝一次。繼續安裝插件(可以在gulp官網查詢功能)
npm install gulp-rev gulp-rev-replace gulp-useref gulp-filter gulp-uglify gulp-csso --save-dev
- gulp-rev 添加版本號,給文件名添加哈希碼,內容更新后哈希碼會改變,告訴客戶端的緩存需要更新。減少人工維護
- gulp-rev-replace 添加哈希碼后,更新文件中的引用名
- gulp-useref 可以在HTML里通過注釋的形式寫方法,告訴 gulp 應該如何操作注釋里面的內容
<!-- build:css css/combined.css -->
引用CSS//把全部CSS壓縮為 combined.css
<!-- endbuild -->
<!-- build:js js/combined.js -->
引用js
<!-- endbuild -->
- gulp-filter 過濾器,比如篩選出全部js文件壓縮后放回,再選擇其他文件操作
- gulp-uglify 壓縮 js 代碼
- gulp-csso 壓縮 css 代碼
創建 gulpfile.js 定義 gulp 的任務,在里面定義好任務,然后通過 gulp taskName//若名字為 default 即默認任務
執行任務。
// 簡單的一個打包壓縮代碼,gulpfile.js
var gulp = require('gulp');
var rev = require('gulp-rev');
var revReplace = require('gulp-rev-replace');
var useref = require('gulp-useref');
var filter = require('gulp-filter');
var uglify = require('gulp-uglify');
var csso = require('gulp-csso');
// 如果是default任務名,執行時可不聲明
gulp.task('default',function(){
var jsFilter = filter('**/*.js',{restore: true});
var cssFilter = filter('**/*.css',{restore: true});
var indexHtmlFilter = filter(['**/*','!**/index.html'],{restore: true})//抓取全部文件但排除index.html(為了保留默認首頁文件名);
return gulp.src('src/index.html')//這里src設置要操作的文件
.pipe(useref())//抓取注釋后需要操作的代碼到“水流中”
.pipe(jsFilter)//篩選出JS
.pipe(uglify())//進行壓縮操作
.pipe(jsFilter.restore)//操作完JS后扔回流里
.pipe(cssFilter)
.pipe(csso())
.pipe(cssFilter.restore)
.pipe(indexHtmlFilter)
.pipe(rev())//生成哈希號版本名
.pipe(indexHtmlFilter.restore)
.pipe(revReplace())//更新引用
.pipe(gulp.dest('dist'));//扔入到該目錄
});
//注意:注釋中 `/*! 這樣寫的注釋不會被壓縮 */ `
壓縮完改動后生成的舊版本 css 不要去刪除,因為可能有用戶在訪問,除非過去很多個版本了。