1.css选择器
一般而言,选择器越特殊,它的优先级越高。也就是选择器指向的越准确,它的优先级就越高。
!important >行内样式> ID > 类 > 标签 | 伪类 | 属性选择 > 伪元素 > 继承 > 通配符。
- id选择器(#myid)
- 类选择器(.myclassname)
- 标签选择器(div, h1, p)
- 直接相邻选择器(h1 + p)、普通相邻选择器(h1~p)
- 子选择器(ul > li)、后代选择器(li a)
- 通配符选择器(*)
- 属性选择器(a[rel=”external”])
- 伪类选择器(a:hover, li:nth-child)
css选择器之组合选择器
选择器 | 含义 | 作用 |
---|---|---|
E,F | 多元素选择器 | 同时匹配元素E或元素F |
E F | 后代选择器 | 匹配E元素所有的后代(不只是子元素、子元素向下递归 )元素F |
E>F | 子元素选择器 | 匹配E元素的所有直接 子元素 |
E+F | 直接相邻 选择器 | 匹配E元素之后的相邻的同级元素F |
E~F | 普通相邻选择器(弟弟选择器) | 匹配E元素之后的同级元素F(无论直接相邻与否 ) |
css选择器之伪类选择器
伪类的操作对象是文档树中已有的元素,而伪元素则创建了一个文档数外的元素。因此,伪类与伪元素的区别在于:有没有创建一个文档树之外的元素。
选择器 | 示例 | 示例说明 |
---|---|---|
:focus | input:focus | 选择元素输入后具有焦点 |
:checked | input:checked | 选择所有选中的表单元素 |
:read-only | input:read-only | 选择只读属性的元素属性 |
:read-write | input:read-write | 选择没有只读属性的元素属性 |
:disabled | input:checked | 选择所有禁用的表单元素 |
:enabled | input:enabled | 选择所有启用的表单元素 |
:in-range | input:in-range | 选择元素指定范围内的值 |
:out-of-range | input:out-of-range | 选择指定范围以外的值的元素属性 |
:valid | input:valid | 选择所有有效值的属性 |
:invalid | input:invalid | 选择所有无效的元素 |
:required | input:required | 选择有"required"属性指定的元素属性 |
:optional | input:optional | 选择没有"required"的元素属性 |
:empty | p:empty | 选择所有没有子元素的p元素 |
:first-of-type | p:first-of-type | 选择每个父元素是p元素的第一个p子元素 |
:last-of-type | p:first-of-type | 选择每个p元素是其父元素的最后一个p元素 |
:first-child | p:first-child | 匹配第一个p元素 |
:last-child | p:last-child | 匹配最后一个p元素 |
:not | :not(p) | 选择所有p以外的元素 |
:only-child | p:only-child | 选择所有仅有一个子元素的p元素 |
:nth-child | p:nth-child(2) | 选择所有p元素的第二个子元素 |
:nth-last-child | p:nth-last-child(2) | 选择所有p元素倒数的第二个子元素 |
:only-of-type | p:only-of-type | 选择所有仅有一个子元素为p的元素 |
:nth-of-type | p:nth-of-type(2) | 选择所有p元素第二个为p的子元素 |
:nth-last-of-type | p:nth-last-of-type(2) | 选择所有p元素倒数的第二个为p的子元素 |
:link | a:link | 选择所有未访问链接 |
:visited | a:visited | 选择所有访问过的链接 |
:hover | a:hover | 把鼠标放在链接上的状态 |
:active | a:active | 选择正在活动链接 |
:target | #news:target | 选择当前活动#news元素(点击URL包含锚的名字) |
:root | root | 选择文档的根元素 |
:lang | q:lang(no){quotes: “~” “~”} | 为不同的语言匹配特殊的规则 |
css选择器之伪元素选择器
选择器 | 作用 | 说明 |
---|---|---|
::before/:before | 在被选元素前插入内容。 | 需要使用 content 属性来指定要插入的内容。被插入的内容实际上不在文档树中。 |
::after/:after | 在选被元素后插入内容 | 其用法和特性与:before相似。 |
::first-letter/:first-letter | 匹配元素中文本的首字母。 | 被修饰的首字母不在文档树中。 |
::first-line/:first-line | 匹配元素中第一行的文本。 | 这个伪元素只能用在块元素中,不能用在内联元素中。 |
::selection | ::selection匹配用户被用户选中或者处于高亮状态的部分 | 在火狐浏览器使用时需要添加-moz前缀。该伪元素只支持双冒号的形式。 |
::placeholder | ::placeholder匹配占位符的文本,只有元素设置了placeholder属性时,该伪元素才能生效。 | 该伪元素不是CSS的标准,它的实现可能在将来会有所改变,所以要决定使用时必须谨慎。在一些浏览器中(IE10和Firefox18及其以下版本)会使用单冒号的形式。 |
::backdrop(处于试验阶段) | ::backdrop用于改变全屏模式下的背景颜色,全屏模式的默认颜色为黑色 | 该伪元素只支持双冒号的形式 |
css选择器之属性选择器
选择器 | 示例 | 示例说明 |
---|---|---|
[attribute] | a[target] | 用于选择具有指定属性的元素 |
[attribute=“value”] | a[target="_blank"] | 用于选择具有指定属性和值的元素 |
[attribute~=“value”] | [title~=“flower”] | 于选择包含指定单词的属性值的元素 |
[attribute|=“value”] | [class|=“top”] | 用于选取带有以指定值(此处top- )开头的属性值的元素 |
[attribute^=“value”] | [class^=“top”] | 用于选择属性值以指定值(此处top )开始 的元素 |
[attribute$=“value”] | [class$=“test”] | 用于选择属性值以指定值结束的元素 |
[attribute*=“value”] | [class*=“te”] | 用于选择属性值包含指定值的元素 |
- 清除浮动
父元素没有设置高度,子元素浮动会导致父元素坍塌,清除浮动可以解决。
-
父级 div 定义 height
原理:父级 div 手动定义 height,就解决了父级 div 无法自动获取到高度的问题。
优点:简单、代码少、容易掌握
缺点:只适合高度固定的布局 -
在浮动元素后添加一个空标签
<div class="clear"></div>
,并且在CSS中设置.clear{clear:both;},即可清理浮动。
原理:添加一个空标签,利用CSS提高的clear:both清除浮动,让父元素可以自动获取到高度
优点:简单,代码少,兼容所有浏览器
缺点:增加页面的标签,造成结构的混乱
建议:不推荐使用,此方法已经过时 -
父级元素定义:
overflow:auto; zoom:1
-
:after伪元素===>给浮动元素的容器添加一个clearfix的class,然后给这个class添加一个:after伪元素实现元素之后添加一个看不见的块元素(Block element)清理浮动。
原理:通过CSS伪元素在容器的内部元素之后添加一个看不见的空格“\20”或点“.” ,并且设置clear属性清除浮动。IE8 以上和非 IE 浏览器才支持:after,原理和方法 2 有点类似,zoom(IE 转有属性)可解决ie6,ie7 浮动问题 ,推荐使用,建议定义公共类,以减少 CSS 代码
优点:浏览器支持较好
缺点:clearfix这个class需要添加zoom: 1(触发haslayout,当一个元素的hasLayout属性值为true时,它负责对自己和可能的子孙元素进行尺寸计算和定位),才能支持IE6和IE7浏览器
建议:推荐使用,设置公共类,减少CSS代码
-
盒子模型
标准盒子模型:宽度=内容的宽度(content)+ border + padding + margin
低版本IE盒子模型:宽度=内容宽度(content+border+padding)+ margin -
css中可以继承的样式
可继承的属性:font-size, font-family, color
不可继承的样式:border, padding, margin, width, height -
优先级
优先级(就近原则):!important > [ id > class = 伪类 > tag ]
!important比内联样式优先级还高,继承得到的样式优先 -
display有哪些值?说明他们的作用?
inline(默认)–内联
none–隐藏
block–块显示
table–表格显示
list-item–项目列表
inline-block -
当margin-top、padding-top的值是百分比时,分别是如何计算的?
对元素的margin设置百分数,是相对于父元素
的width
计算的,不管是margin-top/margin-bottom/margin-left还是margin-right。(padding同理) -
css3,html5,es6的新特性
css3新特性
html5的新特性
es6的新特性
let/const、class、扩展运算符、rest参数、模板字符串、Set、变量的解构赋值、Symbol(一种新的原始数据类型,表示独一无二的ID,它通过Symbol函数生成) -
display:none与visibility:hidden的区别?
display:none 不显示对应的元素,在文档布局中不再分配空间(重排+重绘)
visibility:hidden 隐藏对应元素,在文档布局中仍保留原来的空间(重绘) -
重排和重绘
重绘是一个元素外观的改变所触发的浏览器行为,例如改变 visibility、outline、背景色等属性。浏览器会根据元素的新属性重新绘制,使元素呈现新的外观。重绘不会带来重新布局,并不一定伴随重排。
重排是更明显的一种改变,可以理解为渲染树需要重新计算。下面是常见的触发重排的操作:
1)DOM 元素的几何属性变化
2)DOM 树的结构变化
3)获取某些属性
4)此外,改变元素的一些样式,调整浏览器窗口大小等等也都将触发重排。
注:重排对性能有很大的影响。 -
CSS优化、提高性能的方法有哪些?
避免过度约束
避免后代选择符
避免链式选择符
使用紧凑的语法
避免不必要的命名空间
避免不必要的重复
最好使用表示语义的名字。一个好的类名应该是描述他是什么而不是像什么
避免!important,可以选择其他选择器
尽可能的精简规则,你可以合并不同类里的重复规则
- 什么是响应式设计?响应式设计的基本原理是什么?如何兼容低版本的IE?
响应式网站设计(Responsive Web design)是一个网站能够兼容多个终端,而不是为每一个终端做一个特定的版本。
实现方法:
-
媒体查询media,基本原理是通过媒体查询检测不同的设备屏幕尺寸做处理。pc端和移动端使用同一个项目,使用媒体查询实现响应式。缺点是要写很多样式,十分复杂。
-
rem,pc端使用固定布局,移动端使用rem等比缩放布局。可用media做微调。
-
flex。
-
vh/vw,视口的百分比。百分比布局。
-
响应式网页设计之viewport
Viewport 是用户网页的可视区域。
Viewport 随设备而异,在移动手机上比在电脑屏幕上要小。
在平板电脑和移动手机之前,网页只为电脑屏幕设计,网页的静态设计和固定大小是很常见的。
然后,当我们开始使用平板电脑和手机上网的时候,固定大小的网页太大了,不适合观看。为了解决这个问题,这些设备上的浏览器缩小了整个网页
以适应屏幕。
这并不完美!但可快速修复。<meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1,user-scalable=no"/>
<meta> 窗口元素为浏览器提供了如何控制页面尺寸和缩放的说明。
width=device-width 部分将页面的宽度设置为跟随设备的屏幕宽度(其将根据设备变化而变化)。
initial-scale=1.0 部分设置浏览器首次加载页面时的初始缩放级别。 -
网格视图
前端使用过bootstrap框架的朋友们应该很清除介个东西,所谓网格视图,是把网页分割为n列,通常是 12 列,宽度为100%,平分下来每列为8.33%,在浏览器窗口大小调整时会自动伸缩。 -
媒体查询
网格视图可以很好的做到同缩同放,但是,当屏幕变得很小的时候,网页缩得很小,一个小屏幕一行挤入那么多内容,对用户显得很不友好。
我们想有重点地显示
,怎么做呢?
使用媒体查询可以做到: 假设一个网页分为左右两面,如图(左侧导航右侧内容)
手机屏幕下,全部显示会显得很拥挤,如果左侧导航不显示就好了,像这样
是不是好多了~简单实现如下:
// 屏幕大小小于768px时候
.left {
display: none;
}
@media only screen and (min-width: 768px) {
.left {
display: block;
}
}
-
网格和媒体查询结合
/* For mobile phones: */ [class*="col-"] { width: 100%; } @media only screen and (min-width: 768px) { /* For desktop: */ .col-1 {width: 8.33%;} .col-2 {width: 16.66%;} .col-3 {width: 25%;} .col-4 {width: 33.33%;} .col-5 {width: 41.66%;} .col-6 {width: 50%;} .col-7 {width: 58.33%;} .col-8 {width: 66.66%;} .col-9 {width: 75%;} .col-10 {width: 83.33%;} .col-11 {width: 91.66%;} .col-12 {width: 100%;} }
// 结合CSS媒体查询,可以创建适应不同设备的方向(横屏landscape、竖屏portrait等)的布局 // 如果是竖屏背景将是浅蓝色: @media only screen and (orientation: landscape) { body { background-color: lightblue; } }
-
使用flex布局搭配百分比很容易实现自适应的多行多列
http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html -
移动端web页面适配方案(经典)(将viewport的scale设为设备像素比dpr的倒数+rem)
viewport=>缩放到合适的大小
rem=>根据不同大小的屏幕修改内容大小(大屏东西大,小屏东西小)
https://www.jianshu.com/p/e5ca5b78e03e
https://segmentfault.com/a/1190000008767416
根据设备像素比设置viewport的缩放大小(实现高清),再配合rem适配(大屏大字,小屏小字)。 -
rem实现移动端自适应
http://www.alloyteam.com/2016/03/mobile-web-adaptation-tool-rem/
http://caibaojian.com/flexible-js.html -
1px边框问题
-
只要元素满足下面任一条件即可触发 BFC 特性:
html根元素
浮动元素:float 除 none 以外的值
绝对定位元素:position (absolute、fixed)
display 为 inline-block、table-cells、flex
overflow 除了 visible 以外的值 (hidden、auto、scroll) -
postion几个属性的作用?
position 的常见四个属性值: relative,absolute,fixed,static。一般都要配合"left"、“top”、"right"以及 “bottom” 属性使用。
1)Static静态定位:默认位置
,设置为 static 的元素,它始终会处于页面流给予的位置(static 元素会忽略任何 top、bottom、left 或 right 声明)。一般不常用。
2)Relative相对定位:位置被设置为 relative 的元素,可将其移至相对于其正常位置的地方,意思就是如果设置了 relative 值,那么,它偏移的 top,right,bottom,left 的值都以它原来的位置为基准偏移,而不管其他元素会怎么样。注意 relative 移动后的元素在原来的位置仍占据空间
。
3)Absolute绝对定位:位置设置为 absolute 的元素,可定位于相对于包含它的元素的指定坐标。意思就是如果它的父容器设置了 position 属性,并且 position 的属性值为 absolute 或者relative,那么就会依据父容器进行偏移。如果其父容器没有设置 position 属性,那么偏移是以 body 为依据
。注意设置 absolute 属性的元素在标准流中不占位置
。
4)Fixed固定定位:位置被设置为 fixed 的元素,可定位于相对于浏览器窗口的指定坐标。不论窗口滚动与否,元素都会留在那个位置。它始终是以 body 为依据的。注意设置 fixed 属性的元素在标准流中不占位置
。 -
z-index属性
z-index,又称为对象的层叠顺序,它用一个整数来定义堆叠的层次,整数值越大,则被层叠在越上面,当然这是指同级元素间的堆叠,如果两个对象的此属 性具有同样的值,那么将依据它们在HTML文档中流的顺序层叠,写在后面的将会覆盖前面的。需要注意的是,父子关系是无法用z-index来设定上下关系 的,一定是子级在上父级在下。
Note:使用static 定位或无position定位的元素z-index属性是无效的。
- 居中布局的实现
以下为简单总结:
- 行内元素水平居中
text-align: center;
- 块状元素水平居中
margin: 0 auto;
- 多个块状元素水平居中
display: inline-block; 和text-align: center;配合使用
flex布局
- 已知高度宽度元素水平垂直居中
绝对定位与负margin方法
display: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto;
- 未知宽度高度元素水平垂直居中
将子元素改为inline或inline-block,然后设置父元素display: table-cell; text-align: center; vertical-align: middle;
translate -50%方法
flex布局
- px,em,rem 的区别?
1)px 像素(Pixel)。绝对单位。像素 px 是相对于显示器屏幕分辨率而言的,是一个虚拟长度单位,是计算机系统的数字化图像长度单位,如果 px 要换算成物理长度,需要指定精度 DPI。
2)em 是相对长度单位,相对于当前对象内文本的字体尺寸。如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。它会继承父级元素的字体大小,因此并不是一个固定的值。
3)rem 是 CSS3 新增的一个相对单位(root em,根 em),使用 rem 为元素设定字体大小时,仍然是相对大小,但相对的只是 HTML 根元素。
4)区别:IE 无法调整那些使用 px 作为单位的字体大小,而 em 和 rem 可以缩放,rem 相对的只是 HTML 根元素。这个单位可谓集相对大小和绝对大小的优点于一身,通过它既可以做到只修改根元素就成比例地调整所有字体大小,又可以避免字体大小逐层复合的连锁反应。目前,除了 IE8 及更早版本外,所有浏览器均已支持 rem。