微信电影票前端工程师
Modern Web
html { font-family: sans-serif; }
button:focus { outline: 0; }
(PostCSS)
.foo { transtion: transform 1s; }
.foo { -webkit-transition: -webkit-transform 1s; transition: transform 1s }
Work with preprocessors (Sass, LESS)
.bar { display: flex; }
.bar { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex }
// work with Gulp gulp.task('autoprefixer', function () { var postcss = require('gulp-postcss'); var sourcemaps = require('gulp-sourcemaps'); var autoprefixer = require('autoprefixer-core'); return gulp.src('./src/*.css') .pipe(sourcemaps.init()) .pipe(postcss([ autoprefixer({ browsers: ['last 2 versions'] }) ])) .pipe(sourcemaps.write('.')) .pipe(gulp.dest('./dest')); });
// work with Webpack var autoprefixer = require('autoprefixer-core'); module.exports = { module: { loaders: [ { test: /\.css$/, loader: "style-loader!css-loader!postcss-loader" } ] }, postcss: [ autoprefixer({ browsers: ['last 2 versions'] }) ] }
Use next generation JavaScript, today.
//ES5 function Point(x, y){ this.x = x; this.y = y; } var p1 = new Point(100, 100);
//ES6 class Point{ constructor(x, y){ this.x = x; this.y = y; } } var p1 = new Point(100, 100);
Demo time
var React = require("react"); class HelloMessage extends React.Component { render() { return <div> Hello {this.props.name} </div> } } React.render( <HelloMessage name="ES6" />, document.body )
<meta name="msapplication-TileColor" content="#123456"/> <meta name="msapplication-square150x150logo" content="square.png"/>
<!-- Add to homescreen for Chrome on Android --> <meta name="mobile-web-app-capable" content="yes"> <!-- Add to homescreen for Safari on iOS --> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <meta name="apple-mobile-web-app-title" content="Lighten"> <!-- Tile icon for Win8 (144x144 + tile color) --> <meta name="msapplication-TileImage" content="images/touch/ms-touch-icon-144x144-precomposed.png"> <meta name="msapplication-TileColor" content="#3372DF"> <!-- iOS icons --> <link rel="apple-touch-icon-precomposed" sizes="144x144" href="images/touch/apple-touch-icon-144x144-precomposed.png"> <link rel="apple-touch-icon-precomposed" sizes="114x114" href="images/touch/apple-touch-icon-114x114-precomposed.png"> <link rel="apple-touch-icon-precomposed" sizes="72x72" href="images/touch/apple-touch-icon-72x72-precomposed.png"> <link rel="apple-touch-icon-precomposed" href="images/touch/apple-touch-icon-57x57-precomposed.png"> <!-- Generic Icon --> <link rel="shortcut icon" href="images/touch/touch-icon-57x57.png"> <!-- Chrome Add to Homescreen --> <link rel="shortcut icon" sizes="196x196" href="images/touch/touch-icon-196x196.png">
doctype html html head // meta include ./pagelets/head/meta.jade
Difficult to debug on Win10 Mobile
微信电影票前端工程师
User Agent 探测 (Sniffing)(uatools.js)
复杂的逻辑
很多浏览器UA互相模仿
Microsoft Edge (OS10159)
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10159
Chrome
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36
var browser={ versions:function(){ var u = navigator.userAgent, app = navigator.appVersion; return {//移动终端浏览器版本信息 trident: u.indexOf('Trident') > -1, //IE内核 presto: u.indexOf('Presto') > -1, //opera内核 webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核 gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核 mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端 ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端 android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或者uc浏览器 iPhone: u.indexOf('iPhone') > -1 , //是否为iPhone或者QQHD浏览器 iPad: u.indexOf('iPad') > -1, //是否iPad webApp: u.indexOf('Safari') == -1 //是否web应该程序,没有头部与底部 }; }() }
比UA 监听更科学
if (Modernizr.csstransitions) { // Browser supports CSS Transitions } if (!Modernizr.canvas) { loadCanvasPolyfill(); }
polyfill 是 shim 的一种
polyfill 特指 shim 成的 api 是遵循标准的
比如你想让IE6-8支持媒体查询
比如你想让Chrome/Safari支持Pointer Event
比如你想让IE6-9支持html5标签
<meta name="viewport" content="width=device-width, initial-scale=1.0">
对IE8或者更早的浏览器media-queries.js respond.js
来为 IE添加Media Query支持。
@charset "UTF-8" @media screen and (max-width: 960px) { } @media screen and (max-width: 768px) { } @media screen and (max-width: 550px) { } @media screen and (max-width: 320px) { }
Normalize.css 保护了有价值的默认值
Normalize.css 修复了浏览器的bug
Normalize.css 不会让你的调试工具变的杂乱
Normalize.css 是模块化的
Normalize.css 拥有详细的文档
Hey, don't be shy.