CSS 知识点汇总
- 画一条0.5px的线
// 采用meta viewport的方式
// 1px像素线条
<meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=0">
// 0.5像素线条
<meta name="viewport" content="width=device-width,initial-scale=0.5,user-scalable=0">
//采用 border-image的方式
// 首先需要自己制作一个0.5像素的线条作为线条背景图片。
p{
border-width: 0 0 1px 0;
border-image: imageUrl 2 0 round;
}
// 采用transform: scale()的方式
transform: scaleY(0.5);
transform-origin: 50% 100%; // 不设置会模糊
// 伪元素+ scale 也是移动端1px实现方案
// 假设给盒子设置下边框
.box{
width:100px;
height:100px;
position:relative;
}
.box :after{
content:"";
position:absolute;
left:0;
bottom:0;
width:100%;
height:1px;
transform:scaleY(0.5);
}
// 设置四周边框:
{
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
width: 200%;
height: 200%;
transform: scale(0.5) translate(-50%, -50%);
pointer-events: none;
box-sizing: border-box;
transform-origin: 50% 50%;
}
- 如何实现水平居中和垂直居中
-
flex布局
justify-content:对齐方式,主轴对齐方式
align-items:对齐方式,轴线方向
可以参考阮一峰的flex文章,九个色子布局实现。
- margin负值法
.container{
width: 500px;
height: 400px;
border: 2px solid #379;
position: relative;
}
.inner{
width: 480px;
height: 380px;
background-color: #746;
position: absolute;
top: 50%;
left: 50%;
margin-top: -190px; /*height的一半*/
margin-left: -240px; /*width的一半*/
补充:其实这里也可以将marin-top和margin-left负值替换成:transform:translateX(-50%)和transform:translateY(-50%)
- table-cell(未脱离文档流的)
div{
width: 300px;
height: 300px;
border: 3px solid #555;
display: table-cell;
vertical-align: middle;
text-align: center;
}
img{
vertical-align: middle;
}
-
BFC(块级格式化上下文,用于清除浮动,防止margin重叠等)
块级格式化上下文,是一个独立的渲染区域,并且有一定的布局规则。
BFC区域不会与float box重叠。BFC是页面上的一个独立容器,子元素不会影响到外面,计算BFC的高度时,浮动元素也会参与计算。
那些元素会生成BFC:根元素,float不为none的元素,position为fixed和absolute的元素,display为inline-block,table-cell、table-caption,flex,inline-flex的元素,overflow不为visible的元素。
-
写一个css3的transition和animation(两者都是动画)
Animation和transition大部分属性是相同的,他们都是随时间改变元素的属性值,他们的主要区别是transition需要触发一个事件才能改变属性,而animation不需要触发任何事件的情况下才会随时间改变属性值
transform示例
/* transition */ transition: width 1s linear 2s; /*简写实例*/ /*等同如下*/ transition-property: width; transition-duration: 1s; transition-timing-function: linear; transition-delay: 2s;实现下划线动画
<!--html代码--> <div class="container"> <h2 id="title"> test <i class="line" id="line"></i> </h2> <button id="change">Change</button> </div>/*css代码*/ h2{ position: relative; padding: 15px; text-align: center; } button{ width: 100px; height: 40px; border-radius: 15px; border: none; background: #188FF7; color: #fff; outline: none; cursor: pointer; font-weight: bold; } button:hover{ background: #188EA7; } .container{ width: 600px; display: flex; flex-direction: column; align-items: center; margin: 0 auto; } .line{ position: absolute; left: 0; bottom: 0; height: 3px; width: 100%; transition: transform .5s; background: #188EA7; color: #188EA7; transform: scaleX(0); z-index: 1111; } @keyframes changeColor1{ from{ color: #000; } to{ color: #188EA7; } } @keyframes changeColor2{ from{ color: #188EA7; } to{ color: #000; } }//js部分代码 (function () { let btn = document.getElementById('change'); let h2 = document.getElementById('title'); let line = document.getElementById('line'); let count = 0; btn.onclick = function () { if(count%2===0){ line.style.transform = "scaleX(1)"; h2.style.animation = "changeColor1 1s"; h2.style.color = "#188EA7"; count++; }else{ line.style.transform = "scaleX(0)"; h2.style.animation = "changeColor2 1s"; h2.style.color = "#000"; count++; } } })();上面用到了tranform属性:
translate() 根据左(X轴)和顶部(Y轴)位置给定的参数,从当前元素位置移动。 rotate() 在一个给定度数顺时针旋转的元素。负值是允许的,这样是元素逆时针旋转。 scale() 该元素增加或减少的大小,取决于宽度(X轴)和高度(Y轴)的参数: skew() 包含两个参数值,分别表示X轴和Y轴倾斜的角度,如果第二个参数为空,则默认为0,参数为负表示向相反方向倾斜。 matrix() matrix 方法有六个参数,包含旋转,缩放,移动(平移)和倾斜功能。实现硬币的旋转
```css #euro { width: 150px; height: 150px; margin-left: -75px; margin-top: -75px; position: absolute; top: 50%; left: 50%; transform-style: preserve-3d; animation: spin 2.5s linear infinite; } .back { background-image: url(“/uploads/160101/backeuro.png”); width: 150px; height: 150px; } .middle { background-image: url(“/uploads/160101/faceeuro.png”); width: 150px; height: 150px; transform: translateZ(1px); position: absolute; top: 0; } .front { background-image: url(“/uploads/160101/faceeuro.png”); height: 150px; position: absolute; top: 0; transform: translateZ(10px); width: 150px; } @keyframes spin { 0% { transform: rotateY(0deg); } 100% { transform: rotateY(360deg); } }
-
position属性比较
固定定位fixed: 元素的位置相对于浏览器窗口是固定位置,即使窗口是滚动的它也不会移动。Fixed定位使元素的位置与文档流无关,因此不占据空间。 Fixed定位的元素和其他元素重叠。
相对定位relative:
如果对一个元素进行相对定位,它将出现在它所在的位置上。然后,可以通过设置垂直或水平位置,让这个元素“相对于”它的起点进行移动。 在使用相对定位时,无论是否进行移动,元素仍然占据原来的空间。因此,移动元素会导致它覆盖其它框。
绝对定位absolute:
绝对定位的元素的位置相对于最近的已定位父元素,如果元素没有已定位的父元素,那么它的位置相对于<html>。 absolute 定位使元素的位置与文档流无关,因此不占据空间。 absolute 定位的元素和其他元素重叠。
粘性定位sticky:
元素先按照普通文档流定位,然后相对于该元素在流中的flow root(BFC)和 containing block(最近的块级祖先元素)定位。而后,元素定位表现为在跨越特定阈值前为相对定位,之后为固定定位。
默认定位Static:
默认值。没有定位,元素出现在正常的流中(忽略top, bottom, left, right 或者 z-index 声明)。
inherit:
规定应该从父元素继承position 属性的值。
-
浮动清除
方法一:使用带clear属性的空元素(BFC)
在浮动元素后使用一个空元素如<div class="clear"></div>,并在CSS中赋予.clear{clear:both;}属性即可清理浮动。亦可使用
或<hr class="clear" />来进行清理。方法二:使用CSS的overflow属性
给浮动元素的容器添加overflow:hidden;或overflow:auto;可以清除浮动,另外在 IE6 中还需要触发 hasLayout ,例如为父元素设置容器宽高或设置 zoom:1。
在添加overflow属性后,浮动元素又回到了容器层,把容器高度撑起,达到了清理浮动的效果。
方法三:使用邻接元素处理
什么都不做,给浮动元素后面的元素添加clear属性。
方法四:使用CSS的:after伪元素给浮动元素的父元素
结合:after 伪元素(注意这不是伪类,而是伪元素,代表一个元素之后最近的元素)和 IEhack ,可以完美兼容当前主流的各大浏览器,这里的 IEhack 指的是触发 hasLayout。
给浮动元素的容器添加一个clearfix的class,然后给这个class添加一个:after伪元素实现元素末尾添加一个看不见的块元素(Block element)清理浮动。
.clearfix:after { content: ""; display: block; clear: both; visibility: hidden; line-height: 0; height: 0; font-size:0; } -
css3新属性
CSS3边框如border-radius,box-shadow等;CSS3背景如background-size,background-origin等;CSS3 2D,3D转换如transform等;CSS3动画如animation等。
-
css 选择器优先级
id 选择器,class 选择器,标签选择器,伪元素选择器,伪类选择器等
带有!important 标记的样式属性的优先级最高;
样式选择器的类型不同时,优先级顺序为:id 选择器 > class 选择器 > 标签选择器;
样式表的来源不同时,优先级顺序为:内联样式> 内部样式 > 外部样式 > 浏览器用户自定义样式 > 浏览器默认样式
-
如何画一个三角形和正方体
三角形原理:边框的均分原理
div { width:0px; height:0px; border-top:10px solid red; border-right:10px solid transparent; border-bottom:10px solid transparent; border-left:10px solid transparent; }正方形
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>perspective</title> <style> .wrapper{ width: 50%; float: left; } .cube{ font-size: 4em; width: 2em; margin: 1.5em auto; transform-style:preserve-3d; transform:rotateX(-35deg) rotateY(30deg); } .side{ position: absolute; width: 2em; height: 2em; background: rgba(255,99,71,0.6); border: 1px solid rgba(0,0,0,0.5); color: white; text-align: center; line-height: 2em; } .front{ transform:translateZ(1em); } .bottom{ transform:rotateX(-90deg) translateZ(1em); } .top{ transform:rotateX(90deg) translateZ(1em); } .left{ transform:rotateY(-90deg) translateZ(1em); } .right{ transform:rotateY(90deg) translateZ(1em); } .back{ transform:translateZ(-1em); } </style> </head> <body> <div class="wrapper w1"> <div class="cube"> <div class="side front">1</div> <div class="side back">6</div> <div class="side right">4</div> <div class="side left">3</div> <div class="side top">5</div> <div class="side bottom">2</div> </div> </div> <div class="wrapper w2"> <div class="cube"> <div class="side front">1</div> <div class="side back">6</div> <div class="side right">4</div> <div class="side left">3</div> <div class="side top">5</div> <div class="side bottom">2</div> </div> </div> </body> </html>