目录
H5 的新特性有哪些?C3 的新特性有哪些?
如何使一个盒子水平垂直居中?
如何实现双飞翼(圣杯)布局?
CSS 的盒模型?
CSS 中选择器的优先级以及 CSS 权重如何计算?
列举 5 个以上的 H5 input 元素 type 属性值?
CSS 中哪些属性可继承,哪些不可以?
CSS 单位中 px、em 和 rem 的区别?
rem 适配方法如何计算 HTML 跟字号及适配方案?
Position 的值有哪些,分别有哪些作用?
为什么会出现浮动?浮动元素会引起什么问题?如何清除浮动?
简述弹性盒子 flex 布局及 rem 布局?
如何解决 margin“塌陷”?
::before 和::after 中双冒号和单冒号有什么区别、作用?
CSS3 新增伪类,以及伪元素?
Bootstrap 栅格系统的工作原理?
BFC 是什么?
iframe 有哪些优缺点?
CSS3 新特性
我是子元素
.parent {
width: 500px;
height: 500px;
border: 1px solid #000;
position: relative;
}
.child {
width: 100px;
height: 100px;
border: 1px solid #999;
position: absolute;
margin: auto;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
利用display:table;使div成为一个块级表格元素,给其子元素设置display:table-cell;使子元素成为表格单元格,然后设置vertical-align:middle;可使多行文字垂直居中。
.parent {
width: 500px;
height: 500px;
border: 1px solid #000;
display: table-cell;
vertical-align: middle;
text-align: center;
}
.child {
width: 100px;
height: 100px;
border: 1px solid #999;
display: inline-block;
}
.parent {
width: 500px;
height: 500px;
border: 1px solid #000;
display: flex;
justify-content: center;
align-items: center;
}
.child {
width: 100px;
height: 100px;
border: 1px solid #999;
}
.parent {
width: 500px;
height: 500px;
border: 1px solid #000;
}
.child {
width: 100px;
height: 100px;
border: 1px solid #999;
margin-top: 200px;
margin-left: 200px;
}
方法六:利用 transform
translate()函数是css3的新特性.在不知道自身宽高的情况下,可以利用它来进行水平垂直居中.。
当使用:top: 50%;left: 50%;, 是以左上角为原点,故不处于中心位置 translate(-50%,-50%) 作用是,往上(x轴),左(y轴)移动自身长宽的 50%,以使其居于中心位置。
.parent {
width: 500px;
height: 500px;
border: 1px solid #000;
position: relative;
}
.child {
width: 100px;
height: 100px;
border: 1px solid #999;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
IE 标准的盒子模型(怪异盒模型) box-sizing: border-box;
我们还可以通过属性 box-sizing 来设置盒子模型的解析模式可以为 box-sizing 赋两个值:
!Important>行内样式>ID 选择器>类选择器>标签>通配符>继承>浏览器默认属性
权重
CSS 权重是由四个数值决定,看一张图比较好解释:
图里是英文的,翻译过来分别介绍一下,4 个等级的定义如下:
其他:
CSS 权重计算方式
栗子
div#app.child[name="appName"] /a=1,b=2,c=1 —>权重 = 1 + 100 + 10 +10 = 121/
能继承的属性
1. 字体系列属性:font、font-family、font-weight、font-size、font-style;
2. 文本系列属性:
内联元素:color、line-height、word-spacing、letter-spacing, text-transform;
块级元素:text-indent、text-align;
3. 元素可见性:visibility
4. 表格布局属性:caption-side、border-collapse、border-spacing、empty-cells,table-layout;
5. 列表布局属性:list-style
不能继承的属性
1. display:规定元素应该生成的框的类型;
2. 文本属性:vertical-align、text-decoration;
3. 盒子模型的属性:width、height、margin 、border、padding;
4. 背景属性:background、background-color、background-image;
5. 定位属性:float、clear、position、top、right、bottom、left、min-width、min-height、max-width、max-height、overflow、clip;
区别:
IE 无法调整那些使用 px 作为单位的字体大小,而 em 和 rem 可以缩放,rem,相对的只是 HTML 根元素。这个单位可谓集相对大小和绝对大小的优点于一身,通 过它既可以做到只修改根元素就成比例地调整所有字体大小,又可以避免字体大小逐 层复合的连锁反应。目前,除了 IE8 及更早版本外,所有浏览器均已支持 rem
通用方案
优:有一定适用性,换算也较为简单
劣:有兼容性的坑,对不同手机适配不是非常精准;需要设置多个媒体查询来适应不同手机,单某款手机尺寸不在设置范围之内,会导致无法
网易方案
1、拿到设计稿除以 100,得到宽度 rem 值
2、通过给 html 的 style 设置 font-size,把 1 里面得到的宽度 rem 值代入 x document.documentElement.style.fontSize = document.documentElement.clientWidth / x + ‘px‘;
3、设计稿 px/100 即可换算为 rem
优:通过动态根 font-size 来做适配,基本无兼容性问题,适配较为精准,换算简便
劣:无 viewport 缩放,且针对 iPhone 的 Retina 屏没有做适配,导致对一些手机的适 配不是很到位
手淘方案
优:通过动态根 font-size、viewpor、dpr 来做适配,无兼容性问题,适配精准。
劣:需要根据设计稿进行基准值换算,在不使用 sublime text 编辑器插件开发时,单位计算复杂
最常用的为 display:none 和 visibility:hidden
dispaly:none 设置该属性后,该元素下的元素都会隐藏,占据的空间消失
visibility:hidden 设置该元素后,元素虽然不可见了,但是依然占据空间的位置
static:默认值 不脱离文档流,top,right,bottom,left 等属性不生效
绝对定位:absolute 绝对定位的关键是找对参照物,要成为绝对定位元素的参照物必须满足以下两个条件:
注意:设置了 position:absolute;属性后,元素会脱离正常文档流,不在占据空间;左右 margin为 auto 将会失效;我们通过 left、top、bottom、right 来决定元素位置
相对定位:relative 参照物:元素偏移前位置
注意:设置了相对定位,左右 margin 为 auto 仍然有效、并且不会脱离文档流。
固定定位:fixed 参照物:浏览器窗口;
注意:固定定位会脱离文档流; 当绝对定位和固定定位参照物都是浏览器窗口时的区别: 当出现滚动条时,固定定位的元 素不会跟随滚动条滚动,绝对定位会跟随滚动条滚动
浮动定位将元素排除在普通流之外,即元素讲脱离文档流,不占据空间。浮动元素碰到包含它的边框或者浮动元素的边框停留
1、父元素的高度无法被撑开,影响与父元素同级的元素;
2、与浮动元素同级的非浮动元素(内联元素)会跟随其后;
3、若非第一个元素浮动,则该元素之前的元素也需要浮动,否则会影响页面显示的结构解决方法
清除浮动的方式
1、使用 CSS 中的 clear:both;(放一个空的 div,并设置上述 css),属性来清除元素的浮动
可解决 2、3 问题
2、对于问题 1,添加如下样式,给父元素添加 clearfix 样 式:
.clearfix:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.cl earfix {
display: inline-block;
}
/* for IE/Mac */
3、给父级元素设置双伪元素;
.clearfix:after {
content: "";
/*设置内容为空*/
height: 0;
/*高度为 0*/
line-height: 0;
/*行高为 0*/
display: block;
/*将文本转为块级元素*/
visibility: hidden;
/*将元素隐藏*/
clear: both;
/*清除浮动*/
}
.clearfix {
zoom: 1;
/*为了兼容 IE*/
}
aaa
rem 是 CSS3 新增的一个相对单位,相对于根节点(html)字体大小的值,r 就是 root html{font-size:10px} 则 2rem=20px
通过它就可以做到只修改根元素的大小,就能成比例地调整所有的字体大小,只依赖 html 字体的大小
适配方案步骤:
1、首先动态计算 html 的 font-size
2、将所有的 px 换算成 rem(计算过程请看下面代码和注释)
注意:rem 的换算是根 据设计图稿的像素计算的,下面的计算只是动态计算 html 的 font-size 大小, 请看下面的注意事项
1
2
3
4
1、必需动态的去设置 html 的大小,才能适配
2、根据页面的宽度除以一个系数,把算出的这个值赋给 html 的 font-size 属性,rem 换 算值是根据 psd 设计图的宽度/系数的 rem 系数 以 640px 设计稿和 750px 的视觉稿,
网易这样处理的:
var width = document.documentElement.clientWidth; // 屏幕的布局视口宽度
var rem = width / 7.5; // 750px 设计稿将布局视口分为 7.5 份
var rem = width / 6.4; // 640px 设计稿将布局视口分为 6.4 份
设计稿上 75px 对应 0.75rem, 距离占设计稿的 10%;
在 ipone6 上:
width = document.documentElement.clientWidth = 375px;
1rem = 375px / 7.5 = 50px;
0.75rem = 37.5px;
(37.5/375=10%;占屏幕 10%)
在 ipone5 上:
width = document.documentElement.clientWidth = 320px;
rem = 320px / 7.5 = 42.667px;
0.75rem = 32px; (32/320=10%;占屏幕 10%)
对于上述的第二点,根据设计稿动态转换 rem,这里说一下,前面的计算是动态的设置 html
的 font-size 的大小,这是根据设备的独立像素计算的。而设计稿往往是根据物理像素,即设备素设计的,往往很大,是 750px 及以上,所以在转换 rem 的时候,转换是根据 psd 设计稿的像素进行转换,即 1rem = 设计稿像素宽度/系数,例如,如果是 1080px 的设计 稿,那么,就用 1rem = 1080/18 = 60px(这里用 18 做系数,是因为能整除),然后布局的时候就根据设计稿的元素尺寸转换,例如设计稿一个元素的高为 60px,那么就可以转 化为 1rem 了
特点:
Tips:上述步骤 2 中换算可以通过 Hbuilder 将 px 自动转 rem 以及通过 less 自动计算成 rem,sublime 也可以通过插件进行自动转换
打开 Hbuilder,顶部栏的工具》选项》Hbuilder》代码助手》px 自动转 rem 设置
3.less 自动转换:Hbuilder 也可以将 less 文件自动转成 css 文件。less 文件的书 写如下所示
比如想设置宽度为 187px,高度为 100px 的元素,可以通过下面方式计算适配@rem:25rem; /*这是 1rem = X px 的 X 的值,但是用了 rem 做单位而已*/div{width: 187/@rem;height: 100/@rem;}
1、默认所有子元素都会在一行中显示,即使给子元素一个很大的宽度
2、父级加了这条属性,子级的 float、vertical-align 就会失效
3、如果兼容低版本的机型要加前缀-webkit-,包括后面讲的所有属性,容器属性(父元素样式) 这里说一下一些重点知识
项目属性(子元素样式)
flex-grow 当父级的宽度大于所有子元素宽度之和时,根据父级的剩余空间,设置子元素 的扩展比例(设置后,元素给的固定宽度会被覆盖)它是一个系数默认为 0,即如果存在剩 余空间也不扩展
剩余空间:剩余空间=父级的宽度-所有子元素的宽度和
注意:如果没有设置初始宽度,也没有内容,则默认为 0,否则为内容的宽度。例如设置了 文字,会撑开有初始宽度
元素的 flex-grow 属性值+子元素初始宽度
3、flex-shrink:收缩比例
flex-shrink 当所有子元素宽度之和大于父级宽度的时候,根据超出的空间,设置子元素的 收缩比例设置后,元素给的固定宽度会被覆盖)它是一个系数默认为 1,如果给个 0 的话, 就不会收缩 超出空间:超出空间=所有子元素的宽度和-父级的宽度
子元素宽度计算公式
- 1、算出超出空间,所有子元素的宽度和-父级的宽度
- 2、子元素的初始宽度*子元素的 flex-shrink 值
- 3、算出第二步所有结果的和
- 4、每个子元素的第二步/第三步*第一步
- 5、子元素的初始宽度-第四步
flex-basis:元素的大小
flex:以上三个属性的简写
align-self:单独的垂直对齐方式(交叉轴方向上)
第一种情况 margin值合并:两个同级元素,垂直排列,上面的盒子给 margin-bottom 下面的盒子给 margin-top,那么他们两个的间距会重叠,以大的那个计算。
解决这种情况的方法为:两个外边距不同时出现
第二种情况 margin值穿透:两个父子元素,内部的盒子给 margin-top,其父级也会受到影响,同时产生上边距,父子元素会进行粘连,解绝这种情况的方法为:父级添加一个 css 属性,
overflow:hidden,禁止超出
外边距重叠就是 margin-collapse
解决方案:
father::before { content:''; display:table; }
区别
在 CSS 中伪类一直用 : 表示,如 :hover, :active 等 伪元素在 CSS1 中已存在,当时语法是用 : 表示,如 :before 和 :after
后来在 CSS3 中修订,伪元素用 :: 表示,如 ::before 和 ::after,以此区分伪元素和伪类由于低版本 IE 对双冒号不兼容,开发者为了兼容性各浏览器,继续使使用 :after 这种老语 法表示伪元素
作用:
CSS3 新增伪类
元素的每个
元素
元素的每个
元素
元素
元素
元素的每个
元素
元素的每个
元素
元素
元素
元素的每个元素
原理
使用 Bootstrap 响应式布局
先需要在 head 中引入 meta 标签,添加 viewpirt 属性,content 中宽度等于设备宽度, tial-scale:页面首次被显示可见区域的缩放级别,取值 1 则页面按实际尺寸显示,无任何 放;maximum-scale:允许用户缩放到的最小比例;user-scalable:用户是否可以手动缩放。代码如下:
BFC 是什么?
定义
BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域, 只有 Block-level box 参与,它规定了内部的 Block-level Box 如何布局,并且与这个区域外部毫不相干
布局规则
1、内部的 Box 会在垂直方向,一个接一个地放置
2、Box 垂直方向的距离由 margin 决定。属于同一个 BFC 的两个相邻 Box 的 margin 会发生重叠
3、每个元素的 margin box 的左边, 与包含块 border box 的左边相接触(对于从左往 右的格式化,否则相反)。即使存在浮动也是如此
4、BFC 的区域不会与 float box 重叠
5、BFC 就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素反之也如此
6、计算 BFC 的高度时,浮动元素也参与计算
哪些元素会生成 BFC:
- 1、根元素
- 2、float 属性不为 none
- 3、position 为 absolute 或 fixed
- 4、display 为 inline-block, table-cell, table-caption, flex, inline-flex
- 5、overflow 不为 visible
iframe 有哪些优缺点?
iframe 的优点:
- 1、iframe 能够原封不动的把嵌入的网页展现出来
- 2、如果有多个网页引用 iframe,那么只需要修改 iframe 的内容,就可以实现调用每一个页面的更改,方便快捷
- 3、网页如果为了统一风格,头部和版本都是一样的,就可以写成一个页面,用 iframe 嵌套,可以增加代码的可重用
- 4、如果遇到加载缓慢的第三方内容,如图标或广告,这些问题可以由 iframe 来解决。
- 5、iframe 会堵塞主页面的 Onload 事件
- 6、iframe 和主页面共享连接池而浏览器对相同域的连接有限制,所以会影响页面的并行加载
iframe 的缺点:
- 1、iframe 会阻塞主页面的 Onload 事件;
- 2、iframe 和主页面共享链接池而浏览器对相同城的链接有限制所以会影响页面的并行加载;
- 3、使用 iframe 之前需要考虑这两个缺点,如果需要使用 iframe,最好是通过 JavaScript;
- 4、动态给 iframe 添加 src 属性值,这样可以可以绕开以上两个问题
- 5、不利于 seo
- 6、代码复杂,无法一下被搜索引擎索引到
- 7、iframe 框架页面会增加服务器的 http 请求,对于大型网站不可取。
- 8、很多的移动设备无法完全显示框架,设备兼容性差