frehaiku / audition Goto Github PK
View Code? Open in Web Editor NEWlots of quit-demos, tiny toys
lots of quit-demos, tiny toys
符号 | 含义 |
---|---|
\b |
元字符,代表单词的开头或结尾,也就是单词的分界处,不匹配任意一个字符,只匹配一个位置 |
. |
元字符,匹配除了换行符以外的任意字符 |
* |
可以连续重复使用任意次 |
\w |
匹配字母或数字或下划线 |
\s |
匹配空格符 |
\d |
匹配数字 |
^ |
匹配字符串开始 |
$ |
匹配字符串结束 |
符号 | 含义 |
---|---|
* |
重复0次或多次 |
+ |
重复1次或多次 |
? |
重复0次或1次 |
{n} |
重复N次 |
{n, } |
重复N次或更多次 |
{n, m} |
重复n到m次 |
符号 | 含义 |
---|---|
[] |
匹配[] 中的任意一个字符 |
例子:匹配(010)88886666
或022-22334455
或02912345678
,
正则表达式: /\(?0\d{2}[-\)]?\d{8}/
上述表达式中也能匹配010)12345678
或(022-87654321
这样的“不正确”的格式。要解决这个问题要用到分支条件。所以上述的正则表达式可以改写为/\(?0\d{2}\)[-]?\d{8}|0\d{2}[-]?\d{8}/
符号 | 含义 |
---|---|
| |
匹配 | 的左右两边的条件,任意一个符合就匹配 |
重复多个字符时,可以使用()
来表示。比如:(\d{1,3}\.){3}\d{1,3}
是一个简单的IP地址匹配。
然而像256.300.888.999
这种不可能存在的IP地址。所以我们改写一下,一个正确的IP地址正则表达式应该是/((2[0-4]\d|25[0-5]|[01]?\d?\d)\.){3}(2[0-4]\d|25[0-5]|[01]?\d?\d)/
符号 | 含义 |
---|---|
\W |
匹配任意不是字母,数字,下划线,汉字的字符 |
\S |
匹配任意不是空白符的字符 |
\D |
匹配任意非数字的字符 |
\B |
匹配不是单词开头或结束的位置 |
[^x] |
匹配除了x以外的任意字符 |
[^aeiou] |
匹配除了aeiou这几个字母以外的任意字符 |
使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是捕获的内容)。默认情况下,每个分组会自动拥有一个组号,规则是:从左往右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推
符号 | 含义 |
---|---|
\1 \2 \3 ... \n |
表示匹配第N个出现的捕获组 |
\k<Word> |
自定义捕获组 |
(?:exp) |
表示匹配exp,但不捕获匹配的文本,也不给此分组分配组号 |
(这里面的性质JavaScript暂不支持)也可以指定子表达式的组名。比如:<Word>\w+
要引用这个自定义的子表达式可以用\k<Word>
用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b
,^
,$
那样用于指定一个位置,这个位置应该满足一定的条件(断言),因此它们也被称为零宽断言。
符号 | 含义 |
---|---|
(?=exp) |
也叫零宽度正预测先行断言,匹配符合exp的前面的正则的内容。比如\b\w+(?=ing\b) ,匹配以ing结尾的单词的前面部分(除了ing以外的\w+ 部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。 |
(?<=exp) |
也叫零宽度正回顾后发断言,它的作用与(?=exp) 相反,匹配符合exp之后的正则的内容。比如(?<=\bre)\w+\b 会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,他会匹配ading。(这里面的性质JavaScript暂不支持) |
符号 | 含义 |
---|---|
(?!exp) |
也叫零宽度负预测先行断言,断言此位置的后面不能匹配表达式exp。例如:\d{3}(?!\d) 匹配三位数字,而且这三位数字的后面不能是数字。 |
(?<!exp) |
也叫零宽度负回顾后发断言,与上面的(?!exp) 含义相反,表示断言此位置的前面不能匹配表达式exp。例如:(?<![a-z])\d{7} 匹配前面不是小写字母的七位数字(这里面的性质JavaScript暂不支持) |
参考链接:
980px
,所以PC上的网页基本上能在手机上呈现,只不过看上去很小,一般默认可以通过手动缩放网页。获取当前布局视口用document.documentElement.clientWidth
window.innerWidth
如下的viewport元标签的属性
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">
以下是每个属性的介绍:
属性名 | 取值 | 描述 |
---|---|---|
width | 正整数或device-width | 定义layout viewport的值 |
height | 正整数或device-height |
定义viewport height ,单位为像素,一般不用 |
initial-scale | [0,0 - 10.0] | 定义初始缩放值。比如:设置initial-width=1.5 就是将visual viewport 设置成ideal viewport 宽度的1 /1.5倍 。 |
maximum-scale | [0.0 - 10.0 ] | 用户能够放大的最大比例 |
minimum-scale | [0,0 - 10.0] | 用户能缩小的最小比例,一般不设置,因为太小的字不方便阅读 |
user-scalable | yes/no | 定义是否允许用户手动缩放页面,默认值为yes |
width
的详细介绍:设置为device-width
时表示layout viewport
的宽度等于ideal viewport
的值。同时设置width
与intital-scale
时,最终的视口宽度等于两者较大的那一个。也就是说:
layout viewport
小于visual viewport
时,视口宽度最终是visual viewport
的值(经测试,layout viewport
的值也会自动变成visual viewport
)layout viewport
大于visual viewport
时,视口宽度最终是layout viewport
的值(经测试,visual viewport
的值不会变成这时layout viewport
的值)initial-scale
的详细介绍:缩放比例 = ideal layout
/ visual layout
。ideal viewport
是不会改变的,这个值是为了改变visual viewport
。缩放比例也有默认值,没有设置initial-scale
时,浏览器会取适当的缩放比例使布局视口
正好铺满屏幕即有 可视视口(visual viewport)尺寸=理想视口尺寸(ideal viewport)。也就是说设置width=device-width
与设置initial-scale=1.0
效果相同。
荔枝FM的方案:将layout viewport
定义为设计稿的宽度,这样的好处在于css像素对应设计稿的px(以640px为例),不需要进行单位换算。但是有几点需要注意的地方。
visual viewport
设置成与layout viewport
一样大,即设置initial-scale
的值为 ideal viewport / 640
。之前也有一个属性代替了这个操作,target-densitydpi=device-dpi
,但资料显示target-densitydpi=device-dpi
是一个被抛弃的属性,不推荐使用网易的纯REM方案:
理想视口
作为可视视口
的尺寸,只需要把缩放比定为1。<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, minimum-scale=1, user-scalable=no">
750px 是设计稿的宽度(以iphone6的物理像素数为标准),100是期望的换算比例,即设计稿中 100px 的长度对应css中 1rem,将设计稿中的长度数值除以 100 得到的就是以 rem 为单位的 css 长度的数值,设计稿的宽换算为以 rem 为单位的 css 长度应为 (750/100) rem,同时设计稿的宽对应可视视口的宽,即有 (750/100) rem = 可视视口宽,1 rem = 可视视口宽 * (100/750),(100/750)就是我们要的系数
在页面初始化时设置一下 html 元素的 font-size:
document.documentElement.style.fontSize = window.innerWidth / 7.5 + 'px';
最后一种方案也是最合理的---来自于手淘的最佳实践
dpr(device pixel ratio)
的副作用,何为dpr
:物理像素 / 设备独立的像素(ideal viewport)
。在JS中可以通过window.devicePixelRatio
获取当前设备的dpr
。dpr
:在retina屏幕上,物理像素会被放大为原本的dpr
倍。这时候就会存在以下几个问题
border: 1px
问题,边框自然会被放大为dpr
倍initial-scale=1/dpr
对含有px单位的元素做处理,但是单纯这么做会导致字体元素的大小都会缩小。如何解决这个问题呢?答案就是在第二种方案的根元素设置fontSize
的基础上再乘以一个dpr
,这样对于以rem
衡量的元素又能正常适配了。参考阅读:
slice
与substring
的作用相同,即第一个参数为开始截取字符串的索引(包含),第二个参数为截止截取字符串的索引(不包含)。如:
var str = 'abcdefg'
str.slice(1,5) // bcde
str.substring(1,5) // bcde
substr
的第一个参数是开始截取的字符串的索引(包含),第二个参数为要截取的字符串长度。如:
var str = 'abcdefg'
str.substr(1,5) // bcdef
slice
与substr
的表现为将这负数+该字符串的长度,然后再计算。如:
var str = 'abcdefg'
str.slice(-3) // efg
str.substr(-3) // efg
substring
的表现为将负数转换成0。如:
var str = 'abcdefg'
str.substring(-3) // abcdefg
与第一个参数为负数时的行为类似,但又有点不同。substring
如果第一个参数为正数,第二个参数为负数,第二个参数会首先被转换为0。由于substring
方法会将较小的数作为开始的位置,将较大的数作为结束的位置。因此两个参数会交换位置。如:
var str = 'abcdefg'
str.substring(3, -3) // abc
另一种情况,在slice
与substr
函数中第二个参数的负数转换为正数后比第一个参数还大的话。将返回空字符串。
var str = 'abcdefg'
str.slice(5, -3) // ''
str.substr(5, -3) // ''
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.