CSS常见问题

发布于 2024-06-16  80 次阅读


css和js两种方式实现div右移1000px动画

CSS实现方式

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<style>
    * {
        padding: 0;
        margin: 0;
    }

    #box {
        width: 100px;
        height: 100px;
        background-color: brown;
        position: relative;
        animation: mytest 3s linear 1s;
    }

    @keyframes mytest {
        1% {
            left: 0px;
        }

        20% {
            left: 200px;
        }

        50% {
            left: 500px;
        }

        70% {
            left: 700px;
        }

        100% {
            left: 1000px;
        }
    }
</style>

<body>
<div id="box"></div>
</body>

</html>

JS方式

<! DOCTYPE html>
<html lang="en">

<head>

    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

</head>
<style>
    * {
        padding: 0;
        margin: 0;
    }

    #box {
        width: 100px;
        height: 100px;
        background-color: red;
        position: relative;
    }
</style>

<body>

<div id="box"></div>

</body>

</html>
<script>
    var oBox = document.getElementById("box")
    oBox.onclick = function() {
        moveDiv(1000)
    }

    function moveDiv(data) {
        clearInterval(mytimer)
        var mytimer = setInterval(function() {
            let speed = 10;
            if (oBox.offsetLeft != data) {
                oBox.style.left = oBox.offsetLeft + speed + 'px'
            } else {
                clearInterval(mytimer)
            }
        }, 50)
    }
</script>

visibility、display、opacity的区别

说明:

opacity 用来设置透明度
display 定义建立布局时元素生成的显示框类型
visibility 用来设置元素是否可见。
opacity、visibility、display 这三个属性分别取值 0、hidden、none 都能使元素在页面上看不见,但是他们在方方面面都还是有区别的。

使用 opacity 和 visibility 属性时,元素还是会占据页面空间的,而使用 display 属性时,元素不占据页面空间。

是否占据页面空间:

使用 opacity 和 visibility 属性时,元素还是会占据页面空间的,而使用 display 属性时,元素不占据页面空间。

对子元素的影响

如果子元素什么都不设置的话,都会受父元素的影响,和父元素的显示效果一样。

使用 opacity 和 display 属性时,父元素对子元素的影响很明显,子元素设置的 opacity 和 display 属性是不起作用的,显示的效果和父元素一样,而使用 visibility 属性时,子元素如果设置为 visibility:visible; 并没有受父元素的影响,可以继续显示出来。

自身绑定的事件是否能继续触发

这里说的触发事件,是指用户人为的触发的事件,不包括使用 JavaScript 模拟触发的事件。

使用 visibility 和 display 属性,自身的事件不会触发,而使用 opacity 属性,自身绑定的事件还是会触发的。

是否影响其他元素触发事件

visibility 和 display 属性是不会影响其他元素触发事件的,而 opacity 属性如果遮挡住其他元素,其他的元素就不会触发事件了。

是否产生回流

回流

当页面中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建。这就称为回流(也有人会把回流叫做是重布局或者重排)。每个页面至少需要一次回流,就是在页面第一次加载的时候。

dispaly 属性会产生回流,而 opacity 和 visibility 属性不会产生回流。

是否产生重绘

重绘

当页面中的一些元素需要更新属性,而这些属性只是影响元素的外观,风格,而不会影响布局的时候,比如background-color。则称为重绘。

dispaly 和 visibility 属性会产生重绘,而 opacity 属性不一定会产生重绘。

是否支持transition

opacity 是支持 transition的,一般淡入淡出的效果就是这样实现的。

visibility 也是支持 transition 的。

visibility: 离散步骤,在0到1数字范围之内,0表示“隐藏”,1表示完全“显示”

visibility : hidden; 可以看成 visibility : 0;
visibility : visible; 可以看成 visibility : 1;

只要 visibility 的值大于0就是显示的,所以
visibility:visible 过渡到 visibility:hidden,看上去不是平滑的过渡,而是进行了一个延时。

总结

单行文本溢出处理

.text-ellipsis-single{
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
//响应式截断,当文本溢出的时候才显示省略号

多行文本截断

//多行文本注意设置 line-height
.text-ellipsis-multiple{
    -webkit-line-clamp: 2;// webkit 内核浏览器支持的行数
    display: -webkit-box;
    -webkit-box-orient: vertical;
    overflow: hidden;
    text-overflow: ellipsis;// clip|ellipsis|string 截断|省略号|自定义字符串
}

flex布局

https://developer.mozilla.org/zh-CN/docs/Learn/CSS/CSS_layout/Flexbox

flex:1

flex:是 flex-growflex-shrinkflex-basis的缩写,默认值为0 1 auto。后两个属性可选

flex-grow:定义项目的放大比例,默认为0。即如果存在剩余空间,也不放大

flex-shrink:定义项目的缩小比例,默认为1。即如果空间不足,该项目将缩小

flex-basis:定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小

flex: 1,它等价于:flex: 1 1 0%;

这意味着:
flex-grow: 1;:项目可以放大以填充可用空间。
flex-shrink: 1;:项目可以缩小,与其他项目一起适应容器。
flex-basis: 0%;:在计算flex-grow分配多余空间前,该项目没有固定的基准大小,将首先考虑flex-grow来分配空间。

transition、transform、translate的区别

transform

字面意思是:使…变形

属性的作用是对给定的元素旋转,缩放,平移或扭曲,通过修改元素的坐标空间实现。

使用方式:transform: rotate | scale | skew | translate |matrix;

所以当我们需要对元素做这些操作时,就需要使用 transform 属性。

translate

transform 的值中应该发现了 translatetranslate 的意思就是平移,将元素按照坐标轴上下左右移动

使用方式: transform: translate(200px,50px); 元素较原先的位置,往右移动 200px,往下移动 50px

注意, translate 属性需要在 transform 中才能使用, translate 其实也是属于修改元素的空间位置。

transition

字面翻译是过渡的意思,这个属性可以让元素的变化以动画的形式呈现,比如说过高度从100变到200 height:100px -> 200px ,没有其他属性的情况下,这个就是一瞬间的事,为了让页面交互友好些,希望高度的变化能有个过渡效果,那么 transition 就派上用场了。

官方介绍: transition 提供了一种在更改CSS属性时控制动画速度的方法,其可以让属性变化成为一个持续一段时间的过程。

transition 用来做动画效果非常的方便,但缺点也很明显,动画不支持循环,复杂的动画就难为它了,所以适用于一些简单的过渡效果。

它有四个值:

  • transition-property:指定属性用于生成过渡动画,如宽、高、颜色等等,包括上面介绍的 transform ,只要这个属性的值是可以变化就行,且起始状态都是明确的。
  • transition-duration:动画执行时间
  • transition-timing-function:缓动函数, 内置了这些 ease | linear | ease-in | ease-out | ease-in-out ,也可以上 easings.net/ 挑选自己喜欢的效果
  • transition-delay:延迟执行的时间

总结

transform 是用来实现元素坐标空间的变化, translate 用来移动元素, transition 给元素的变化加上动画效果。

如何画一条 0.5px 的边框

如果我们直接设置0.5px,在不同的浏览器会有不同的表现,使用如下代码:

<!DOCType html>
<html>
<head>
    <meta charset="utf-8">
    <style>
        .hr {
            width: 300px;
            background-color: #000;
        }
        .hr.half-px {
            height: 0.5px;
        }
        .hr.one-px {
           height: 1px;
        }
    </style>
</head>
<body>
    <p>0.5px</p>
    <div class="hr half-px"></div>
    <p>1px</p>
    <div class="hr one-px"></div>
</body>
</html>

其中Chrome把0.5px四舍五入变成了1px,而firefox/safari能够画出半个像素的边,并且Chrome会把小于0.5px的当成0,而Firefox会把不小于0.55px当成1px,Safari是把不小于0.75px当成1px,进一步在手机上观察IOS的Chrome会画出0.5px的边,而安卓(5.0)原生浏览器是不行的。所以直接设置0.5px不同浏览器的差异比较大,并且我们看到不同系统的不同浏览器对小数点的px有不同的处理。所以如果我们把单位设置成小数的px包括宽高等,其实不太可靠,因为不同浏览器表现不一样。

第二种能想到的方法是缩放,能否设置1px,然后scale 0.5呢,我们可以尝试一下,如下代码所示:

<style>
.hr.scale-half {
    height: 1px;
    transform: scaleY(0.5);
}
</style>
    <p>1px + scaleY(0.5)</p>
    <div class="hr scale-half"></div>

效果如下图所示:

我们发现Chrome/Safari都变虚了,只有Firefox比较完美看起来是实的而且还很细,效果和直接设置0.5px一样。所以通过transform: scale会导致Chrome变虚了,而粗细几乎没有变化。但是如果加上transform-origin: 50% 100%:

.hr.scale-half {
    height: 1px;
    transform: scaleY(0.5);
    transform-origin: 50% 100%;
}

大家就都变实了,很完美,Chrome的效果如下

BFC原理及作用

常见的CSS三种布局模型:

CSS中的三种布局模型:流动模型(Flow)、浮动模型(Float)和层模型(Layer)。

BFC 即 Block Formatting Contexts (块级格式化上下文),它属于上述布局模式的流动模型。是W3C CSS2.1规范中的一个概念,决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用。具有BFC特性的元素可以看做是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素,并且BFC具有普通容器所没有的的一些特性。通俗一点来讲,可以把BFC理解为一个封闭的大箱子,箱子内部的元素无论如何翻江倒海,都不会影响到外部。

只要元素满足下面任一条件即可触发BFC特性:

  • body 根元素
  • 浮动元素:float 除 none 以外的值
  • 绝对定位元素:position (absolute、fixed)
  • display 为 inline-block、table-cells、flex
  • overflow 除了 visible 以外的值 (hidden、auto、scroll)

parent元素宽高不定,实现scale固定宽高比始终为4:3

<div class="div">
    <div class="child"></div>
</div>
<style>
    .div{
    width: 100px;
    height:100px;
    border:1px solid #000;
    position: relative;
    overflow: visible
}
.child{
    transform: scale(1,.75);
    width: 100%;
    height: 100%;
    position: absolute;
    border:1px solid #000;
    top: 0;
    left: 0;
}
</style>

CSS垂直居中的方案

https://juejin.cn/post/6844903550909153287

伪元素和伪类的区别

https://juejin.cn/post/7136087057542086693

position的几个属性和含义

https://developer.mozilla.org/zh-CN/docs/Learn/CSS/CSS_layout/Positioning

盒模型

https://vue3js.cn/interview/css/box.html#box-sizing

响应式布局方案

https://juejin.cn/post/6844903814332432397

两栏布局和三栏布局

https://vue3js.cn/interview/css/column_layout.html#%E4%BA%8C%E3%80%81%E4%B8%A4%E6%A0%8F%E5%B8%83%E5%B1%80

如何提高动画的渲染性能

https://blog.csdn.net/qq_42415326/article/details/124759825

人生の意味は平凡ですか、それとも素晴らしいですか?
最后更新于 2024-06-16