一篇文章包你学会使用pure.css框架,理解其原理,并学会其包含css知识,学会本身写css组件css
优先级就是分配给指定css声明的一个权重,它由匹配的选择器中的每一种选择器类型的数值决定。而当优先级与多个css声明中任何一个声明的优先级相等时,css中最后的那个声明将会被应用到元素上。html
选择器是用于定位文档中的元素以便设定相应的样式代码linux
选择器分类css3
基础选择器git
选择器 | 含义 | 实例 |
---|---|---|
* | 通用选择器,匹配任何元素 | *{font-size:16px} |
E | 标签选择器,匹配全部使用E标签的元素 | a{font-size:16px} |
.error | class选择器,匹配全部class属性中包含error的元素 | .error{font-weight:bold;} |
#correct | id选择器,匹配全部id属性值为correct的元素 | #correct{font-style:italic;} |
组合选择器github
选择器 | 含义 | 实例 |
---|---|---|
E,F | 多元素选择器,同时匹配全部E元素或F元素 | div,p{background-attachment:fixed;} |
E F | 后代元素选择器,匹配全部属于E元素的后代F元素 | div a{background-color:blue;} |
E>F | 子元素选择器,匹配全部E元素的子元素F | |
E+F | 毗邻元素选择器,匹配全部紧随E元素以后的同级元素F |
属性选择器web
选择器 | 含义 | 实例 |
---|---|---|
E[att] | 匹配全部具备att属性的E元素 | p[style]{background-repeatrepeat-y;} |
E[att=val] | 匹配全部att属性等于"val"的E元素 | div[class="c1"] |
E[att~=val] | 匹配全部att属性具备多个空格分隔的值、其中一个值等于"val"的E元素 | div[class~=c2] |
E[att=val] | 匹配全部att属性具备多个连字号分隔(hyphen-separated)的值、其中一个值以"val"开头的E元素 | p[lang =en] |
伪类选择器chrome
选择器 | 含义 | 实例 |
---|---|---|
E:first-child | 匹配父元素E下的第一个子元素 | div:first-child{text-align:center;} |
E:link | 匹配全部未被点击的连接 | |
E:visited | 匹配全部已被点击的连接 | |
E:active | 匹配鼠标悬停其上的E元素 | |
E:hover | 匹配鼠标悬停其上的E元素 | |
E:focus | 匹配得到焦点的E | |
E:lang(c) | 匹配lang属性等于c的E元素 |
伪元素windows
选择器 | 含义 | 实例 |
---|---|---|
E:first-line | 匹配E元素的第一行 | p:first-line{color:red;} |
E:first-letter | 匹配E元素的第一个字母 | .c1:first-letter{color:blue;} |
E:before | 在E元素以前插入生成的内容 | .ctn before{} |
E:after | 在E元素以后插入生成的内容 | .ctn after{} |
(解释了众多css样式被覆盖的问题)浏览器
首先!important的css定义是拥有最高的优先级
优先级计算分为a,b,c,d四个位数,这四个位数的优先级依次递减。
内联样式:a=1;
ID选择器:b=1;
属性选择器和类选择器:c=1;
元素选择器和伪类选择器: d=1;
li {} /* a=0 b=0 c=0 d=1 -> specificity = 0,0,0,1 */ li:first-line {} /* a=0 b=0 c=0 d=2 -> specificity = 0,0,0,2 */ ul li {} /* a=0 b=0 c=0 d=2 -> specificity = 0,0,0,2 */ ul ol+li {} /* a=0 b=0 c=0 d=3 -> specificity = 0,0,0,3 */ h1 + *[rel=up]{} /* a=0 b=0 c=1 d=1 -> specificity = 0,0,1,1 */ ul ol li.red {} /* a=0 b=0 c=1 d=3 -> specificity = 0,0,1,3 */ li.red.level {} /* a=0 b=0 c=2 d=1 -> specificity = 0,0,2,1 */ #x34y {} /* a=0 b=1 c=0 d=0 -> specificity = 0,1,0,0 */ style="" /* a=1 b=0 c=0 d=0 -> specificity = 1,0,0,0 */
(主要应用于menu中,垂直和水平导航栏)
css文档流(document flow)和普通流(normal flow)实际上指的是同一个概念。
文档流 指的是元素按照在HTML中为的位置顺序决定排布的过程,在排布过程当中,将窗体自上而下分为一行行,并在每行中从左至右的顺序排放元素。
非浮动的块级元素(block)独占一行,行内元素(inline)不会独占一行。
<div style=" width:100px; height:100px; border: 1px solid">div1</div> <div style=" width:100px; height:100px; border: 1px solid">div2</div>
<a href="http:">超连接1</a> <a href="http:">超连接2</a>
(主要是用于含有重叠菜单的子菜单定位问题)
绝对定位实际上是相对了某个东西的,而这个东西就是元素的第一个有position且position不能为static的祖先元素。就是这个东西必须是有必定地位的(position:absolute或position:relative),不能是一个穷鬼(position:static)或者没有地位的(position).这个时候,绝对定位,它才能以之为标杆。
给他爸爸加上相对定位,而后他是绝对定位
<div style=" border:1px solid Red; padding:10px; width: 340px; height: 400px""> 红色:太公 <div style="border:1px solid Green; padding:10px; width: 320px; height: 360px;"> 绿色:爷爷 <div style="border:1px solid Yellow; padding:10px; width: 300px; height: 320px;position:relative; "> 黄色:老爸 <div style="width: 100px; height: 100px;border:1px solid"> div1</div> <div style="width: 100px; height: 100px;border:1px solid;position:absolute;left:120px; top:100px;"> div2</div> <div style="width: 100px; height: 100px;border:1px solid"> div3</div> </div> </div> </div>
全部pure模块都是基于normalize.css构建,对比base.css详细normalize.css内容请查看《Normalize.css》
<link rel="stylesheet" href="https://unpkg.com/purecss@0.6.1/build/base-min.css">
Normalize.css是一个小的CSS文件,为HTML元素样式提供跨浏览器的一致性。它是一个现代的、支持HTML5的、传统CSS重置的替代。
html { font-family: sans-serif; /* 1 */ //无衬线体,字的比划开始及结束地方没有额外装饰 -ms-text-size-adjust: 100%; /* 2 */ -webkit-text-size-adjust: 100%; /* 2 */ //iPhone 和 Android 的浏览器纵向 (Portrate mode) 和橫向 (Landscape mode) 模式皆有自动调整字体大小的功能。控制它的就是 CSS 中的 -webkit-text-size-adjust。text-size-adjust 设为 none 或者 100% 关闭字体大小自动调整功能. }
abbr[title] { border-bottom: 1px dotted; } //缩略词显示详情,含有title属性的abbr标签缩略词的底部边线
svg:not(:root){ overflow: hidden; } //svg(可缩放矢量图形),是基于可扩展标记语言(XML),用于描述二维矢量图形 :root,匹配文档的根元素,在HTML中,根元素永远是HTML :not(selector)选择器匹配非指定元素 则以上是svg非根元素的元素
[hidden], template { //template模板标签 display: none; } .hidden, [hidden] { //!important最高优先级 display: none !important; }
html元素添加hidden属性,能够实现display:none !important;
<input type="text" name="_csrf" hidden>
<img>添加class .pure-img,配合viewport能够实现图片伸缩
.pure-img { //最小宽度(min-width)与最大宽度(max-width)用于设置图片最小最大宽度限制比较多。 好比一个图片为主列表,对象里图片大小不定时候,为了避免想让他过小不统一这个时候咱们可使用css最小宽度样式。再如,一个盒子里有文章有图片混排的时候,有时图片宽度不能肯定,这个时候若是html img图片宽度超出了盒子宽度,可能图片就会撑破div盒子形成图片混乱。 max-width: 100%; height: auto; display: block; }
max-width详细状况能够查看《CSS max-width 属性》
<img class="pure-img" src="...">
letter-spacing: -0.31em;
1em == 16px,由于浏览器默认的字体大小是16px,em能够在浏览器改变字体大小时做出相应的放大和缩小,弹性布局
*word-spacing: -0.43em
在样式属性名前加*,这样的样式能够被IE6和IE7所识别,而其它浏览器则会当作错误忽略,因此,这样的样式写法只对IE6/7生效. 而_开头的属性只有IE6才能识别.
关于letter-spacing和word-spacing的区别
word-spacing属性增长或减小单词之间的空白
letter-spacing属性增长或减小字符之间的空白
text-rendering: optimizespeed;
text-rendering属性常被用在windows和linux系统中,用来给渲染引擎提供信息,让文本在速度和可读性方面获得优化,控制在线字体的微妙细节,目前只有firefos和google支持。
optimizespeed取值 Gecko内核的浏览器将强调可读性和几何精度,同时绘制文本渲染速度,禁用字距和连写
font-family: FreeSans, Arimo, "Droid Sans", Helvetica, Arial, sans-serif;
经常使用的字体
display: -webkit-box;/ Chrome 4+, Safari 3.1, iOS Safari 3.2+ /
display: -webkit-flex;/ Chrome 21+, Safari 6.1+, iOS Safari 7+, Opera 15/16 /
display: -ms-flexbox;/ IE 10 /
display: flex; / Chrome 29+, Firefox 22+, IE 11+, Opera 12.1/17/18, Android 4.4+ /
webkit是一个开源的浏览器引擎,与之对应的有Gecko和Trident,加上以后表示私有属性
-moz表明firefox浏览器私有属性 -ms表明IE浏览器私有属性 -webkit表明chrome、safari私有属性
关于display:box和display:flex的区别
flex是2012年之后的标准语法,大部分浏览器已经实现了无前缀版本,box是2009年语法,须要加上前缀
以上实际上是该属性的兼容性代码
flex布局,弹性布局,用来为盒装模型提供最大的灵活性
经过添加.pure-g和未添加进行对比,能够发现,.pure-g的效果主要就是flex属性,而flex属性在此处的重要做用是给.pure-u元素添加float浮动属性
-webkit-flex-flow: row wrap;
-ms-flex-flow: row wrap;
flex-flow: row wrap;
flex-flow:<flex-direction>||<flex-wrap>
row表示行内方向,即弹性项目在弹性容器中的起始放置方向,flex-wrap表示须要拆行以使得弹性项目能被容器包含
-webkit-align-content: flex-start;
-ms-flex-line-pack: start;
align-content: flex-start;
多行项目时,让弹性元素始终排在头部,中间没有间距,详细flex教程请查看《Flex布局教程:语法篇》
@media all and (min-width:xxx) and (max-width:xxx){ /*这段查询的all是针对全部设备(有些设备不必定是屏幕,也许是打字机,盲人阅读器)*/ table .pure-g { display: block; } }
写这一行是由于flex在ie10中的table时不起做用
.pure-g [class *= "pure-u"] {font-family: sans-serif;}
表示的是设置class属性值包含有pure-u 字符串的全部pure-g元素的样式
div[class^="something"] { }表示以之开始 div[class$="something"] { }表示以之结尾
.pure-u { display: inline-block; *display: inline; /* IE < 8: fake inline-block */ zoom: 1; letter-spacing: normal; word-spacing: normal; vertical-align: top; text-rendering: auto; }
zoom: normal | <number> | <percentage>
normal:使用对象的实际尺寸
<number>:用浮点数来定义缩放比例
<percentage>:用百分比来定义缩放比例
vertical-align垂直对齐属性
.pure-u-x-y{ display: inline-block; *display: inline; zoom: 1; letter-spacing: normal; word-spacing: normal; vertical-align: top; text-rendering: auto; }
这个样式和.pure-u是相同的
pure栅格默认支持5列和24列
x/y表示的是列数所占的比重
.pure-u-1-24 { width: 4.1667%; *width: 4.1357%; }
能够发现IE67和其余浏览器之间的宽度存在细微差异,微调后可修复
.pure-form input[type="text"]
不一样的表单类型
padding: 0.5em 0.6em; //设置表单内部填充 display: inline-block; //显示为行内元素 border: 1px solid #ccc; //边界线 box-shadow: inset 0 1px 3px #ddd; //盒子阴影,inset设置在内边框 border-radius: 4px; //圆框边角 vertical-align: middle; //让行内元素居中显示,主要是表单 box-sizing: border-box; //设置盒子尺寸
input:not([type]) //这个属性须要分离出来,由于ie8在一堆css2.1中包含一个css3属性的时候不会执行
:not()否认选择器,可让你定位不应匹配该选择器的元素,IE6-8浏览器不支持:not()选择器
.pure-form input[type="color"]{
padding: 0.2em 0.5em;
} //chrome显示色彩选择器须要额外的空间
input[type="text"]:focus {
outline:0;
border-color:#129FEA;
}
为聚焦的时候添加样式
outline和boder区别
outline是不占空间的,既不会增长额外的width或者height
border可应用于几乎全部有形的html元素,而outline是针对连接、表单控件和imageMap等元素,outline会随元素focus出现,随blur而消失
详细的状况能够查看《深刻浅析border和outline区别》
input[type="text"][disabled] input[readonly]
这两种写法都会使显示出来的文本框不能输入文字
但disabled会使文本框变灰,并且经过request.getParameter("name")得不到文本框中的内容(若是有的话)
而readonly只是使文本框不能输入,外观没有变化,并且经过request.getParameter("name")能够获得内容,能够复制
input:focus:invalid
同类型的方法
:required必须,要求input不能为空
:valid有效,即当填写内容符合要求时触发
:invalid无效,即当填写内容不符合要求时触发
能够看到符合要求时,显示的边框颜色为蓝,右边的没有添加:focus选择器的表单在无效的时候一直都是红色
疑问:
input:focus:invalid和input:focus:invalid:focus差异并无试验出来
.pure-form fieldset
.pure-form legend
fieldset和legend标签的组合使用
实现的手段是添加border:0和border-bottom
能够生成堆叠式表单,即为同一列
实现的手段是添加display:block将它变成块级元素,独占整行和margin: 0.25em 0;
能够生成对齐式表单,label显示在input左边末端对齐
nline-block显示成行内元素,而后设置width使之能够撑满,再设置text-align:right使之向右对齐,此时与表单过于靠近,添加margin属性,使和表单之间间距变大。考虑到字数过长产生换行,使用vertical-align让行内元素居中显示
能够为表单标签分组,使用方法是为fieldset添加该class
区别不大,主要是阴影部分,以及结束部分相连r-radius:0将圆角样式去除,而后使用:first-child和:last-child选择器,从新设置这两个元素的圆角等样式,达到此效果
.pure-form .pure-group input:first-child:last-child
经过伪类选择器设置第一个和最后一个同类标签的样式
.pure-form .pure-input-2-3
设置表单大小
//这个样式应该主要是运用在移动端 display: inline-block; //行内元素 zoom: 1; //缩放比例 line-height: normal; //默认行高 white-space: nowrap; //如何处理元素内的空白,normal空白会被浏览器忽略,nowrap文本不会换行 vertical-align: middle; //实现行内元素的水平居中 text-align: center; //使文本水平居中 cursor: pointer; -webkit-user-drag: none; //user-drag:auto | element | none设置和检索一个元素可否被拖拽 -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; //user-select:none | text | all | element设置和检索是否容许选中文本 box-sizing: border-box; //设置的内边距和边框不会增长宽度
//网页端主要样式 .pure-button { font-family: inherit; font-size: 100%; padding: 0.5em 1em; color: #444; /* rgba not supported (IE 8) */ color: rgba(0, 0, 0, 0.80); /* rgba supported */ border: 1px solid #999; /*IE 6/7/8*/ border: none rgba(0, 0, 0, 0); /*IE9 + everything else*/ background-color: #E6E6E6; text-decoration: none; border-radius: 2px; }
//设置鼠标在上和焦点在上时的样式 .pure-button-hover, .pure-button:hover, .pure-button:focus { /* csslint ignore:start */ filter: alpha(opacity=90); //透明度使用 /* csslint ignore:end */ background-image: -webkit-linear-gradient(transparent, rgba(0,0,0, 0.05) 40%, rgba(0,0,0, 0.10)); background-image: linear-gradient(transparent, rgba(0,0,0, 0.05) 40%, rgba(0,0,0, 0.10)); } //用线性渐变建立图像 rgba(0,0,0, 0.05) 40%和rgba(0,0,0, 0.10));分别为起始颜色和终止颜色,第一个参数通常是渐变方向,top 是从上到下、left 是从左到右,若是定义成 left top,那就是从左上角到右下角
线性渐变
linear-gradient([ [<angle>|to<side-or-cornor>],]?<color-stop>[,<color-stop>]+)
<color-stop> 用于指定渐变的起止颜色
详细状况能够查看《css参考手册》.htm)
疑问:
background-image: linear-gradient(transparent, rgba(0,0,0, 0.05) 40%, rgba(0,0,0, 0.10));
transparent这个参数的做用和效果
.pure-table { /* Remove spacing between table cells (from Normalize.css) */ border-collapse: collapse; //为表格设置合并边框模型 //collapse边框会合并成一个单一边框,忽略border-spacing和empty-cells属性,而separate会使边框分开,inherit规定应该从父元素继承border-collapse属性 border-spacing: 0; //设置相邻单元格边框间的距离,不过仅用于边框分离模式 empty-cells: show; //设置是否显示表格中的空单元格,仅适用于边框分离模式 border: 1px solid #cbcbcb; }
.pure-table caption表格标题
.pure-table td,.pure-table th,.pure-table thead
th:表头单元格-包含表头信息
td: 标准单元格-包含数据
thead:结合tbody和tfoot元素结合使用
.pure-table-odd td{
background-color: #f2f2f2;
}
隔行添加能够实现斑马纹的效果或者直接加上pure-table-striped
.pure-table-striped tr:nth-child(2n-1) td{
background-color: #f2f2f2;
}
:nth-child(n)选择器 规定属于其父元素的第n格子元素,不论元素类型
:nth-of-type() 选择器的意思是“规定属于其父元素的第二个 p 元素”,这个须要从同类元素开始机选
.pure-table-bordered tbody > tr:last-child > td
有边框的表格,>选择器,能够缩小范围,只选择某个元素的子元素
//设置盒子大小不由于boder变化 .pure-menu { box-sizing: border-box; } //清除列表原有样式 .pure-menu-list{ list-style: none; margin: 0; padding: 0; } //清除a标签原有样式,填充a标签,并变为块级元素 .pure-menu-link{ display: block; text-decoration: none; white-space: nowrap; color: #777; padding: .5em 1em; } //在父级元素使用inline-block将之变为行级元素并同一高度 .custom-restricted-width { /* To limit the menu width to the content of the menu: */ display: inline-block; /* Or set the width explicitly: */ /* width: 10em; */ } //添加:hover,:link等样式 .pure-menu-link:hover, .pure-menu-link:focus { background-color: #eee; }
疑问之处:
inline-block怎样自动肯定并统一行级元素的宽度
 .pure-menu-heading{ padding: .5em 1em; display: block; text-decoration: none; white-space: nowrap; text-transform: uppercase; color: #565d64; } //给a标签的父级标签li标签添加display:inline-block,使三个a标签同行 .pure-menu-horizontal .pure-menu-item, .pure-menu-horizontal .pure-menu-heading, .pure-menu-horizontal .pure-menu-separator { display: inline-block; *display: inline; zoom: 1; vertical-align: middle; } //为li的父级ul标签添加display:inline-block,使全部标签同行 .pure-menu-horizontal .pure-menu-list { display: inline-block; } //清除列表原有样式,统一间距 .pure-menu-list{ list-style: none; margin: 0; padding: 0; }
关键样式
清除列表原有样式
使用padding: .5em 1em填充a标签
清除a标签原有样式
为a标签的父级标签li标签添加display:inline-block,使三个a标签同行
为标题的a标签和li的父级ul标签添加display:inline-block,使全部标签同行
为ul标签添加margin:0和padding:0清除ul原有样式
//样式整合 .pure-menu-link{ display: block; text-decoration: none; white-space: nowrap; //可自定义部分 color: #777; padding: .5em 1em; } .pure-menu-list{ list-style: none; margin: 0; padding: 0; } //实现横向菜单 .pure-menu-horizontal .pure-menu-list{ display: inline-block; } //实现下拉菜单符号 .pure-menu-horizontal .pure-menu-has-child > .pure-menu-lin:after{ content: "\25BE"; } //子菜单的样式 .pure-menu-children{ display: none; position: absolute; left: 100%; top:0; margin: 0; padding: 0; z-index: 3; background-color: #fff; } //鼠标移动显示下拉菜单 .pure-menu-allow-hover:hover > .pure-menu-child{ display: block; position: absolute; } //子菜单移动至下方 .pure-menu-horizontal .pure-menu-children { left: 0; top: auto; width: inherit; }
content属性与:before和:after伪元素配合使用,来插入生成内容
特殊字符 | 对应号码 |
---|---|
► | 9658 25BA |
▲ | 9650 25B2 |
▼ | 9660 25BC |
◄ | 9668 25C4 |
menu-has-children > .pure-menu-link:after { padding-left: 0.5em; content: "\25B8"; font-size: small; } //显示隐藏的子元素 .pure-menu-allow-hover:hover > .pure-menu-children{ display: block; position: absolute; }
//限制了边框才显示滚动条 .custom-restricted { height: 160px; width: 150px; border: 1px solid gray; border-radius: 4px; } //y轴可滚动,x轴溢出隐藏 .pure-menu-scrollable { overflow-y: scroll; overflow-x: hidden; } //将li标签设为块级元素 .pure-menu-scrollable .pure-menu-list { display: block; } //水平菜单时,显示为行级元素 .pure-menu-horizontal.pure-menu-scrollable .pure-menu-list { display: inline-block; } //水平菜单针对的只是移动端,触摸横向滚动 .pure-menu-horizontal.pure-menu-scrollable { white-space: nowrap; overflow-y: hidden; overflow-x: auto; //指示元素不显示滚动条或者筛选指标,即便内容溢出 -ms-overflow-style: none; //可让页面在native端滚动时模拟原生的弹性滚动 -webkit-overflow-scrolling: touch; /* a little extra padding for this style to allow for scrollbars */ padding: .5em 0; } //存在疑问 .pure-menu-horizontal .pure-menu-scrollable::-webkit-scrollbar { display: none; }