让元素看不见的方法
display:none | 会让元素完全从渲染树中消失,渲染的时候不占据任何空间 是非继承属性,子孙节点消失由于元素从渲染树消失造成,通过修改子孙节点无法显示 会造成回流 |
visibility:hidden | 不会让元素从渲染树消失,渲染师元素继续占据空间,只是内容不可见 是继承属性,子孙节点消失由于继承了hidden 通过设置visibility: visible;可以让子孙节点显式 |
opacity:0 | 透明化 作用于元素,以及元素内的所有内容的透明度 //与rgba()不同 rgba()只作用于元素的颜色或其背景色。(设置rgba透明的元素的子元素不会继承透明效果!) |
height: 0 | 将元素高度设为 0 ,并消除边框 |
filter: blur(0) | CSS3属性,将一个元素的模糊度设置为0,从而使这个元素“消失”在页面中 |
文字在水平和垂直方向重叠
- 垂直方向:line-height
- 水平方向:letter-spacing
BFC汇总
触发条件 |
|
.BFC布局与普通文档流布局区别 | 普通文档:
|
BFC应用 |
|
对BFC的理解 |
|
清除浮动的方法
父级元素 |
|
结尾处 |
|
CSS3简单动画
- 依靠CSS3中提出的三个属性:transition、transform、animation
- transition:定义了元素在变化过程中是怎么样的,包含transition-property、transition-duration、transition-timing-function、transition-delay。
- transform:定义元素的变化结果,包含rotate、scale、skew、translate。
- animation:动画定义了动作的每一帧(@keyframes)有什么效果,包括animation-name,animation-duration、animation-timing-function、animation-delay、animation-iteration-count、animation-direction
自适应布局
- 左侧浮动或者绝对定位,然后右侧margin撑开
- 使用<div>包含,然后靠负margin形成bfc
- 使用flex
- rgba()和opacity都能实现透明效果,但最大的不同是opacity作用于元素,以及元素内的所有内容的透明度,
- 而rgba()只作用于元素的颜色或其背景色。(设置rgba透明的元素的子元素不会继承透明效果!)
重绘和回流
- 重绘:当渲染树中的元素外观(如:颜色)发生改变,不影响布局时,产生重绘
- 回流:当渲染树中的元素的布局(如:尺寸、位置、隐藏/状态状态)发生改变时,产生重绘回流
- 注意:JS获取Layout属性值(如:offsetLeft、scrollTop、getComputedStyle等)也会引起回流。因为浏览器需要通过回流计算最新值
- 回流必将引起重绘,而重绘不一定会引起回流
- 需要要对元素进行复杂的操作时,可以先隐藏(display:"none"),操作完成后再显示
- 需要创建多个DOM节点时,使用DocumentFragment创建完后一次性的加入document
- 缓存Layout属性值,如:var left = elem.offsetLeft; 这样,多次使用 left 只产生一次回流
- 尽量避免用table布局(table元素一旦触发回流就会导致table里所有的其它元素回流)
- 避免使用css表达式(expression),因为每次调用都会重新计算值(包括加载页面)
- 尽量使用 css 属性简写,如:用 border 代替 border-width, border-style, border-color
- 批量修改元素样式:elem.className 和 elem.style.cssText 代替 elem.style.xxx
闻所未闻的一道题
元素竖向的百分比设定是相对于容器的高度吗
元素竖向的百分比设定是相对于容器的宽度,而不是高度
全屏滚动问题
- 原理类似图片轮播原理,超出隐藏部分,滚动时显示
- 可能用到的CSS属性:overflow:hidden; transform:translate(100%, 100%); display:none;
a标签上伪类执行顺序
link > visited > hover > active
如何理解line-height
- line-height 指一行字的高度,包含了字间距,实际上是下一行基线到上一行基线距离
- 如果一个标签没有定义 height 属性,那么其最终表现的高度是由 line-height 决定的
- 一个容器没有设置高度,那么撑开容器高度的是 line-height 而不是容器内的文字内容
- 把 line-height 值设置为 height 一样大小的值可以实现单行文字的垂直居中
- line-height 和 height 都能撑开一个高度,height 会触发 haslayout,而 line-height 不会
inline-block 间隙问题
- 相邻的 inline-block 元素之间有换行或空格分隔的情况下会产生间距
- 非 inline-block 水平元素设置为 inline-block 也会有水平间距
- 可以在父级加 font-size:0; 在子元素里设置需要的字体大小,消除垂直间隙
- 把标签写到同一行可以消除垂直间隙,但代码可读性差
圣杯布局
圣杯布局要点 html中要把center部分最先渲染 因为center最重要
通过设置整体的padding来确保center不会被重叠
三个div都要float:left
left:通过设置margin-left:-100% 被拉到第一行 通过relative left:-width 来靠最左
right:通过设置margin-right:-width 来被拉到第一行
设置margin-right为负值,从原理上来说是#right元素不动,其右边的元素的向左移动,但由于#right右边无元素,
因此 从效果上来说,margin-right设置为负值后,#right元素的宽度被掩盖,没有宽度,就能够挤到第一行
<style> .header{ width: 100%; text-align: center; background-color: blanchedalmond; } .container{ padding-left:200px ; padding-right:150px ; } .main{ float: left; height: 300px; background-color: blue; width: 100%; } .left{ float:left; background-color: blueviolet; width: 200px; height: 300px; margin-left: -100%; position: relative; left:-200px; } .right{ float:left; background-color:brown; width: 150px; height: 300px; margin-right: -150px; } .footer{ width: 100%; text-align: center; background-color: blanchedalmond; clear: both; } </style> <body> <div class="header">header</div> <div class="container"> <div class="main"></div> <div class="left"></div> <div class="right"></div> </div> <div class="footer">footer</div> </body>
双飞翼布局
对圣杯布局进行改进,不再使用相对定位布局
通过margin设置两侧留白
同样是向左浮动 但通过设置margin负值 就将left和right拉上去了
最重要main部分被套了两层
<style> .main{ width: 100%; height: 200px; background-color: #ccc; float:left } .main-wrap{ margin: 0 190px 0 190px } .left{ float: left; width: 190px; height: 200px; margin-left: -100%; background-color: brown; } .right{ float: left; width: 190px; height: 200px; background-color: chartreuse; margin-right: -190px; } </style> <body> <div class="main"> <div class="main-wrap"></div> </div> <div class="left"></div> <div class="right"></div> </body>
css实现幻灯片动画
水平居中
inline(行内元素) | 给父元素设置 text-align:center |
定宽的块状元素 | 1.通过设置“左右margin”值为“auto” 2.父元素设置relative 待居中元素设置absolute left:50% margin-left:-(width/2) (先向右移,再往左拽) |
不定宽的块状元素 | 1.flex-box 在父元素上设置justify-content:center 2.在父元素上设置 float: left; position: relative; left: 50% 在子元素上设置:position: relative; left: -50%; |
垂直居中
inline(行内元素) | 设置父元素的 height 和line-height高度一致来实现的 |
定高的absolute块状元素 | 父元素设置relative 待居中元素设置absolute top:50% margin-top:-(height/2) |
不定高的absolute块状元素 | 1.flex align-items:center 2.绝对定位 配合css3位移: position: absolute; top:50%; /*父元素高度50%*/ transform:translate(0, -50%);3.父元素设置relative 子元素设置 absolute top right left bottom都为0 最后设置margin:auto |
整体居中
就是又垂直又水平
方法1:
先通过绝对定位 把元素拉到容器的50%处 再通过设置margin负值 把他拉到最中间
.div1 { float: left; background-color:red width: 200px; height: 200px; position: absolute; top: 50%; left: 50%; margin-top: -100px; margin-left: -100px; }方法2:
通过绝对定位 把元素撑开 再设置margin 为auto
.div1 { float: left; width: 200px; height: 200px; background-color:blueviolet; position: absolute; left: 0; top: 0; right: 0; bottom: 0; margin: auto; }
方法3:
.div1 { background-color: brown; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); }
垂直居中一张图片
通过设置父元素为table就可以实现
#container /**<img>的容器设置如下**/ { display:table-cell; text-align:center; vertical-align:middle; }
两栏布局
左边宽度固定 右边自适应
1.左侧浮动 右侧会自适应
.outer { width: 100%; height: 500px; background-color: yellow; } .left { width: 200px; height: 200px; background-color: red; float: left; } .right { height: 200px; background-color: blue; }2.右侧绝对定位 并设置right=0 left=固定宽度
这是由于——绝对定位元素的第一个高级特性就是其具有自动伸缩的功能,当我们将 width设置为 auto 的时候(或者不设置,默认为 auto ),绝对定位元素会根据其 left 和 right 自动伸缩其大小
.outer { width: 100%; height: 500px; background-color: yellow; position: relative; } .left { width: 200px; height: 200px; background-color: red; } .right { position: absolute; right: 0; left:200px; height: 200px; background-color: blue; }3.左侧绝对定位 右侧设置margin-left
.outer { width: 100%; height: 500px; background-color: yellow; position: relative; } .left { width: 200px; height: 200px; position: absolute; background-color: red; } .right { margin-left: 200px; height: 200px; background-color: blue; }4.最简单的flex
.outer { width: 100%; height: 500px; background-color: yellow; display: flex; flex-direction: row; } .left { width: 200px; height: 200px; background-color: red; } .right { height: 200px; background-color: blue; flex: 1; }
同理,若想要实现高度自适应
则可以通过flex 设置flex-direction:column 来实现
或者 通过absolute的自适应拉伸实现
.container { position:relative; } .sub { position: absolute; top: 100px; bottom: 0; }
画三角形
就是把上、左、右三条边隐藏掉(颜色设为 transparent)
#demo { width: 0; height: 0; border-width: 20px; border-style: solid; border-color: transparent transparent red transparent; }
等高布局
- 在列的父元素上使用这个背景图进行Y轴的铺放,从而实现一种等高列的假像
- 模仿表格布局等高列效果:兼容性不好,在ie6-7无法正常运行
- css3 flexbox 布局: .container{display: flex; align-items: stretch;}
伪元素和伪类
伪元素 :: | 在内容元素的前后插入额外的元素或样式,但是这些元素实际上并不在文档中生成 也就是说,它们只在外部显示可见,但不会在文档的源代码中找到它们 |
伪类 : | 将特殊的效果添加到特定选择器上。它是已有元素上添加类别的 |
line-height相关问题
line-height 指一行字的高度,包含了字间距,实际上是下一行基线到上一行基线距离
如果一个容器没有设置高度,那么撑开容器高度的是 line-height 而不是容器内的文字内容
不同的赋值方式结果不同:
不同的赋值方式结果不同:
带单位时 | px 是固定值,而 em 会参考父元素 font-size 值计算自身的行高 |
纯数字时 | 会把比例传递给后代。例如,父级行高为 1.5,子元素字体为 18p x则子元素行高为 1.5 * 18 = 27px |
百分比 | 将计算后的值传递给后代 |