基本知识点
媒体查询
- 关键字
- and
- or
- not(not 的范围到逗号为止)
media = "only screen and (min-width:401px)"
使用媒体查询的时候最好带上 only
关键字,因为旧的浏览器不支持媒体查询这样反而不识别这段查询代码,不会响应布局。如果不带关键字 only
那么浏览器会只识别 `media = "screen...",就只会有一种布局。
-
常用的属性简介
- width/height:视口宽度/布局视口
- device-width/height:屏幕宽度/可视视口
- 以上四个属性都可以添加
min-
/max-
前缀 - orientation:设备方向
理想视口
分析设计图
- 设计原则
- 渐进增强
- 优雅降级(推荐)
- 先设计大屏还是小屏根据实际案例
- 先在一个浏览器调试好(推荐谷歌)
- 设置断点(屏幕分辨率的分界点)
- 一般根据屏幕尺寸类别(大中小)设置临界点而不不是针对某个特定手机分辨率
一般小型项目的目录结构
- 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(保存网站团队信息等,给别人看的)
开始编写代码
编码格式
,要放在 title 之前,否则会无效
兼容模式(IE8后开始,IE11后此文档模式被弃用)
- IE条件注释
//IE hack gt(大于),lt(小于),gte(大于等于),lte。IE8不支持H5和媒体查询,注意IE 和版本号之间要有空格
-
命名规范
注意标签语义化,class 命名使用-
分割,id 命名一般用于 js,使用_
分割(或者驼峰命名法)。- section,article 最好有标题,没有合适的标题用 DIV 嵌套即可。
使用图片
必不可少的图片使用引入,而装饰线的图片可以使用 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(实现在不同分辨率下显示一张图片的不同规格)
- w 为图片尺寸,vw 为视口宽度,sizes 告诉浏览器图片的宽度占整个div的百分比,浏览器也会根据此来设置图片宽度,可以设置媒体查询 浏览器会用自己的规则(网络,尺寸等)综合考虑后更改图片源
- picture(实现多组图片匹配)
// 浏览器会匹配媒体查询/或者条件查询后的结果然后显示对应的图片
-
使用 svg
- 在线创建网站1 icomoon
- 在线创建网站2 editor
- 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 应该如何操作注释里面的内容
引用CSS//把全部CSS压缩为 combined.css
引用js
- 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 不要去删除,因为可能有用户在访问,除非过去很多个版本了。