# CSS 面试题
代码仓库于/code/经典 CSS/
# 1、实现一个盒子水平垂直居中(6 种)
- 第一种方式 绝对定位+margin 拉回 , 缺点: 里面盒子宽高要知道
.container {
position: relative;
}
.info {
width: 300px;
height: 300px;
position: absolute;
top: 50%;
left: 50%;
margin-left: -150px;
margin-top: -150px;
}
- 第二种方式 绝对定位+ transform:translate 拉回 优点:里面盒子可未知宽高
.container {
position: relative;
}
.info {
position: absolute;
top: 50%;
left: 50%;
transform: translateX(-50%) translateY(-50%);
}
- 第三种方式 父元素设置弹性盒子 flex 布局 设置 justcontent 和 item-aline 缺点:低版本浏览器兼容问题,优点:里面盒子可未知宽高
.container {
display: flex;
justify-content: center;
align-items: center;
}
.info {
}
- 第四种方式父元素设置 display:table-cell,子元素设置 margin:0 auto;布局--缺点:父元素和子元素都需要知道宽度,不常用
.container {
display: table-cell;
width: 1000px;
vertical-align: middle;
}
.info {
width: 300px;
margin: 0 auto;
}
- 第五种方式-css 新特性:父元素 display:box; box-align 和 box-pack 各个浏览器支持不同,需要加内核前缀 已经越来越多支持-webkit-box
.container {
display: -webkit-box;
/* 垂直居中 */
-webkit-box-align: center;
/* 水平居中 */
-webkit-box-pack: center;
}
.info {
}
- 第六种方式 绝对定位 + margin:auto 盒子的宽高需要知道
/* 原理是块级元素默认会水平充满屏幕,通过绝对定位,四个方向充满后,设置宽高后,此时一侧如果为定值,一侧为剩余空间,如果两侧为auto,那么就会平分剩余空间。 */
.container {
/* display: relative; */
}
.info {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
width: 200px;
height: 20px;
}
# 2、实现一个左图右文的布局(左固定,右伸缩)(8 种)
- 第一种方式,左右两侧都左浮动+calc 计算宽度的方法(width:cale(100% - 200px))
.box {
}
.left {
float: left;
width: 200px;
}
.right {
float: left;
width: calc(100% - 200px);
}
- 第二种方式,左侧浮动,右侧设置 bfc 清楚浮动(overflow:auto)
.box {
}
.left {
float: left;
width: 200px;
}
.right {
overflow: auto;
}
- 第三种方式, 使用左侧浮动+右侧 margin-left 空出
.box {
}
.left {
float: left;
width: 200px;
}
.right {
margin-left: 200px;
}
- 第四种方式,左边定位+右边 margin-left 空出
.box {
}
.left {
position: fixed;
width: 200px;
}
.right {
margin-left: 200px;
}
- 第五种方式,左边绝对定位+右边绝对定位
.box {
position: relative;
}
.left {
position: absolute;
width: 200px;
}
.right {
position: absolute;
top: 0;
left: 200px;
}
- 第六种方式,flex 布局, 左侧设置 flex:0 1 200px; 右侧设置 flex:1 或 flex:1 1 0%;
.box {
display: flex;
}
.left {
flex: 0, 1, 200px;
}
.right {
flex: 1, 1, 0%;
}
- 第七种方式, 使用 display:-webkit-box
.box {
display: -webkit-box;
}
.left {
}
.right {
}
- 第八种方式, 使用 display:table, 左右两侧设置 display: table-cell;
.box {
display: table;
}
.left {
display: table-cell;
width: 200px;
}
.right {
display: table-cell;
}
# 3、实现一个扇形(三角型)
<div class="fan fanAnimote"></div>
.box {
display: table;
}
.left {
display: table-cell;
width: 200px;
}
.right {
display: table-cell;
}
/* 再加个动画 */
.fanAnimote {
/* 旋转 */
transform: rotate(30deg);
position: relative;
animation: mymove infinite 5s alternate;
}
@keyframes mymove {
from {
top: 100px;
left: 100px;
}
to {
top: 500px;
left: 200px;
}
}
# 4、手写一个正方体,简单实现一下 360 度旋转?
.box {
transform-style:preserve-3d;
width:200px; height:200px;
transform: rotate3d(1, 1, 0, -30deg);
margin: 50 100px;
animation: round 5s infinite;
position:relative;
}
@keyframes round{
0%{
transform:rotateX(-30deg) rotateY(-30deg)
}
50%{
transform:rotateX(150deg) rotateY(150deg)
}
100%{
transform:rotateX(330deg) rotateY(330deg)
}
}
.box div {
width: 200px;
height: 200px;
position: absolute;
}
/* 前 */
.box div:first-child {
transform: translateZ(100px);
background-color: rgba(255, 0, 0, 0.2);
}
/* 后 */
.box div:nth-child(2) {
transform: translateZ(-100px);
background-color: rgba(255, 123, 0, 0.2);
}
/* 左 */
.box div:nth-child(3) {
transform: translateX(-100px) rotateY(90deg);
background-color: rgba(255, 0, 122, 0.2);
}
/* 右 */
.box div:nth-child(4) {
transform: translateX(100px) rotateY(-90deg);
background-color: rgba(0, 0, 111, 0.2);
}
/* 上 */
.box div:nth-child(5) {
transform: translateY(-100px) rotateX(-90deg);
background-color: rgba(0, 120, 0, 0.2);
}
/* 下 */
.box div:nth-child(6) {
transform: translateY(100px) rotateX(90deg);
background-color: rgba(25, 10, 30, 0.2);
}
<div class="box">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</div>
案例:
# 5、点击 input,边框变色,点击 input 之外的地方去掉样式。
- 方法一:JS 实现
/code/经典 css/
<input type="text" />
input {
background: none;
outline: none;
border: #999 solid 1px;
width: 250px;
height: 30px;
margin: 100px;
}
/* 选中时 */
.chooseInput {
background: none;
outline: none;
animation: inp 1s ease forwards;
}
@keyframes inp {
0% {
border-color: antiquewhite;
}
100% {
border-color: orange;
}
}
var inps = document.getElementsByTagName("input")[0];
inps.onclick = function() {
this.classList.add("chooseInput");
};
document.addEventListener(
"click",
function() {
inps.classList.remove("chooseInput");
},
true
);
- 方法二:CSS3 实现
html:
<input type="text" class="chooseInput" />
css:
.chooseInput {
background: none;
outline: none;
border: #999 solid 1px;
width: 250px;
height: 30px;
/* margin: 100px; */
}
/* 选中时 */
.chooseInput:focus {
background: none;
outline: none;
color: #f00;
animation: inp 1s ease forwards;
}
@keyframes inp {
0% {
border-color: antiquewhite;
}
100% {
border-color: orange;
}
}
案例: