# 如何实现 1px 像素线
方法一:使用 伪元素 + 缩放 的方式
原理:把原先元素的 border 去掉,然后利用 :before 或者 :after 重做 border ,并 transform 的 scale 缩小一半,原先的元素相对定位,新做的 border 绝对定位。
.box20 {
width: 300px;
height: 200px;
border: none; /*这里*/
position: relative;
}
/*边框*/
.box20:after {
content: "";
position: absolute;
box-sizing: border-box; /* 为了与原元素等大*/
left: 0;
top: 0;
border: 1px solid green;
width: 200%;
height: 200%;
transform: scale(0.5);
transform-origin: 0 0;
}
/*细线*/
.box20:before {
content: "";
position: absolute;
left: 0;
top: 10px;
width: 200%;
height: 1px;
background-color: red;
transform: scale(0.5);
transform-origin: 0 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
方法二:使用 动态 viewport + rem 布局 的方式
首先根据 dpr (物理像素点/手机的实际视口大小(1px))来动态修改 meta 标签中 viewport 中的 initial-scale 的值,以此来动态改变 viewport 的大小;然后页面上统一使用 rem 来布局,viewport 宽度变化会动态影响 html 中的 font-size 值,以此来实现适配。
<head>
<meta
name="viewport"
content="width=device-width,user-scalable=no,initial-scale=1,minimum-scale=1,maximum-scale=1,viewport-fit=cover"
/>
<script type="text/javascript">
// 动态设置 viewport 的 initial-scale
var viewport = document.querySelector("meta[name=viewport]");
var dpr = window.devicePixelRatio || 1;
var scale = 1 / dpr;
viewport.setAttribute(
"content",
"width=device-width," +
"initial-scale=" +
scale +
", maximum-scale=" +
scale +
", minimum-scale=" +
scale +
", user-scalable=no"
);
// 计算 rem font-size
var clientWidth =
document.documentElement.clientWidth || document.body.clientWidth;
clientWidth > 750 && (clientWidth = 750);
var ft = (clientWidth / 7.5).toFixed(2); // 以750设计稿为例
document.documentElement.style.fontSize = ft + "px";
</script>
</head>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 盒子模型
在 CSS 中任何元素都可以看成是一个盒子,而一个盒子是由 4 部分组成的: 内容(content)、内边距(padding)、边框(border)和外边距(margin)。
盒模型有 2 种:标准盒模型和 IE 盒模型,本别是由 W3C 和 IExplore 制定的标准。
比如
.box {
width: 200px;
height: 200px;
padding: 10px;
border: 1px solid #eee;
margin: 10px;
}
1
2
3
4
5
6
7
2
3
4
5
6
7
- 标准盒模型认为:盒子的实际尺寸 = 内容(设置的宽/高) + 内边距 + 边框;//增加内边距、边框和外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸。 盒子的实际尺寸 = 200+102+12 =222
- IE 盒模型认为:盒子的实际尺寸 = 设置的宽/高 = 内容 + 内边距 + 边框;//IE 盒子,增加内边距、边框不会影响整体的宽度,(不包括外边距) 盒子的实际尺寸 = 200 = 178+102+12(也就是内部宽度变成了 178) 【实际上我们使用 IE 的盒子模型比较好,这样改变内边距不会影响整体盒子】
在 CSS3 中新增了一个属性 box-sizing,允许开发者来指定盒子使用什么标准,它有 2 个值:
content-box:标准盒模型;
border-box:IE 盒模型;【V】
# 垂直居中的方法
<div class="outer">
<div class="inner"></div>
</div>
1
2
3
2
3
方法一:flex
.outer {
display: flex;
justify-content: center;
align-items: center;
}
1
2
3
4
5
2
3
4
5
方法二: position + transform, inner 宽高未知
.outer {
position: relative;
}
.inner {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
方法三:position + 负 margin, inner 宽高已知
.outer {
position: relative;
}
.inner {
width: 100px;
height: 100px;
position: absolute;
left: 50%;
top: 50%;
margin-left: -50px;
margin-top: -50px;
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
方法四:设置各个方向的距离都是 0,再将 margin 设为 auto,也可以实现,前提是 inner 宽高已知
.outer {
position: relative;
}
.inner {
width: 100px;
height: 100px;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
margin: auto;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 如何实现三栏布局
左右固定,中间自适应
# 2、逻辑像素,物理像素的概念
- 写一个三列等距布局,越多越好
- 移动端适配,响应式布局的
- css 的伪类和伪元素有哪些?有什么区别?
- 在一个未知宽度的父元素内如何创建一个等边正方形
- input type 都有哪些类型,还记得其他 attrs 呢
- 假如让你设计一个适配 PC、手机和平板的项目,你有哪些布局方案?(首先是 vh、vw,然后用淘宝出品的 lib-flexible 库进行 rem 适配,还有一种 flex + px 的适配方式)
- CSS 当中以 @ 开头的属性有哪些?(@media, @keyframes,@import)
- rem, 计算出 375 的屏幕,1rem,单位出现小数怎么处理
- 触发 BFC 的方式
- rem 和 vw 的使用场景
- 子元素水平垂直居中
- css flex 的各个属性值;
- css 动画 animation 各个时间值含义;
- css 如何实现让一个元素旋转并横向移动,如果只用一个 css 属性;
- less 与 sass 区别,技术选型时如何取舍;
- 说一下 css 盒模型,border-box 和 content-box 区别;
- 说一说 flex 布局,有了解 Grid 么;
- 如何在移动端实现 1 px 的线;
- 为什么说用 css 实现动画比 js 动画性能好;
- 什么是 合成层
# 相关链接
css基础知识 →