前端面试之CSS

100 阅读3分钟

该面试题只是为了记录我自己的面试笔记,大多数摘自行内有关大佬总结,本人只是搬运工,有关链接已放置相关笔记的下面

margin 重叠

问题描述:

两个块级元素的上外边距和下外边距可能会合并(折叠)为一个外边距,其大小会取其中外边距值大的那个,这种行为就是外边距折叠。需要注意的是,浮动的元素和绝对定位这种脱离文档流的元素的外边距不会折叠。重叠只会出现在垂直方向

计算原则:

折叠合并后外边距的计算原则如下:

  • 如果两者都是正数,那么就去最大者
  • 如果是一正一负,就会正值减去负值的绝对值
  • 两个都是负值时,用0减去两个中绝对值大的那个

解决办法:

对于折叠的情况,主要有两种:兄弟之间重叠父子之间重叠

(1)兄弟之间重叠

  • 底部元素变为行内盒子:display: inline-block
  • 底部元素设置浮动:float
  • 底部元素的position的值为absolute/fixed

(2)父子之间重叠

  • 父元素加入:overflow: hidden
  • 父元素添加透明边框:border:1px solid transparent
  • 子元素变为行内盒子:display: inline-block
  • 子元素加入浮动属性或定位

毛玻璃特效

backrop-filter:blur(10px);

旋转动画

animation: name duration timing-function delay iteration-count direction;

css 动画暂停

animation-play-state:paused; 
animation-fill-mode: forwards;// 让css动画停留在最后一帧

Canvas 画一个矩形,五角星

<script>
    // 使用id来寻找canvas元素
    var myCanvas = document.getElementById('myCanvas');
    if (myCanvas.getContext) {
        // 创建context对象
        // getContext("2d") 对象是内建的 HTML5 对象,拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法
        var ctx = myCanvas.getContext("2d");
        var horn = 5; // 画5个角
        var angle = 360/horn; // 五个角的度数
        // 两个圆的半径
        var R = 200;
        var r = 80;
        // 坐标
        var x = 200;
        var y = 200;
        var rot = 10;
        
        function drawStar(ctx, R, r, rotate){
            // beginPath:开始绘制一段新的路径
            ctx.beginPath();
            for (var i = 0; i < horn; i++) {
                // 角度转弧度:角度/180*Math.PI
                var roateAngle = i * angle - rotate; // 旋转动起来
                // 外圆顶点坐标
                ctx.lineTo(Math.cos((18 + roateAngle) / 180 * Math.PI) * R + x, -Math.sin((18 + roateAngle) / 180 * Math.PI) * R + y);
                // 內圆顶点坐标
                ctx.lineTo(Math.cos((54 + roateAngle) / 180 * Math.PI) * r + x, -Math.sin((54 + roateAngle) / 180 * Math.PI) * r + y);
            }
            // closePath:关闭路径,将路径的终点与起点相连
            ctx.closePath();
            ctx.lineWidth = "3";
            ctx.fillStyle = '#E4EF00';
            ctx.strokeStyle = "red";
            ctx.fill();
            ctx.stroke();
        }
        drawStar(ctx, R, r, 20);
        
        // setInterval(function (){
        //     ctx.clearRect(0, 0, myCanvas.width, myCanvas.height);
        //     drawStar(ctx, R, r, rot);
        //     rot += 2;
        // }, 30);

        // 更加流畅的动画:window.requestAnimationFrame
        function step(){
            ctx.clearRect(0, 0, myCanvas.width, myCanvas.height);
            drawStar(ctx, R, r, rot);
            rot += 1;
            window.requestAnimationFrame(step);
        }
        window.requestAnimationFrame(step);
    }
</script>

transition 和 animation 区别

属性含义
transition(过度)用于设置元素的样式过度,和animation有着类似的效果,但细节上有很大的不同 property:填写需要变化的css属性 duration:完成过渡效果需要的时间单位(s或者ms) timing-function:完成效果的速度曲线 delay: 动画效果的延迟触发时间
transform(变形)用于元素进行旋转(rotate)、缩放(scale)、移动(translate)或倾斜(skew),和设置样式的动画并没有什么关系,就相当于color一样用来设置元素的“外表”
translate(移动)只是transform的一个属性值,即移动
animation(动画)用于设置动画属性,他是一个简写的属性,包含6个属性 animation-duration 指定动画完成一个周期所需要时间,单位秒(s)或毫秒(ms),默认是 0 animation-timing-function 指定动画计时函数,即动画的速度曲线,默认是 "ease" linear、ease、ease-in、ease-out、ease-in-out animation-delay 指定动画延迟时间,即动画何时开始,默认是 0 animation-iteration-count 指定动画播放的次数,默认是 1 animation-direction 指定动画播放的方向 默认是 normal normal、reverse、alternate、alternate-reverse animation-fill-mode 指定动画填充模式。默认是 none forwards、backwards、both animation-play-state 指定动画播放状态,正在运行或暂停。默认是 running running、pauser animation-name 指定 @keyframes 动画的名称

Css 处理兼容性问题

  1. 浏览器CSS样式初始化
  2. 浏览器私有属性(webkit,moz,o,ms)
  3. css hack(选择符级前缀,if条件,属性级前缀)(史上最全的CSS hack方式一览_清枫草塘的博客-CSDN博客
  4. 插件autoprefixer (packjson,browserslist)

juejin.cn/post/684490…

juejin.cn/post/684490…

css浏览器兼容问题

夸克文档

&class 和 class& 区别

  • &class 外层父嵌套
  • class& 反转嵌套
// 写法
.demo-title {
    .demo & {
        font-size:20px;
    }
}
//编译后
.demo .demo-title {
    font-size:20px;
}