当前位置: 首页 > 科技观察

掌握这些CSS知识点,Coding飞扬!

时间:2023-03-17 01:48:15 科技观察

很多入门的前端同学,或者准备面试的同学,都会死记硬背一些前端知识点。很多弯路属于“应试”学习。我们应该从基础到复杂,从现象到原理来思考和学习,才能熟练掌握技能。整理了CSS(CascadingStyleSheets)中的一些知识点。或许你看过一些《四千字总结》和《必看面试》,但还是希望更多的同学能够静下心来学习,而不是仅仅满足于停留在“API工程师”的层面,现象是主要从CSS约定的规则来解释。1.width(宽度)&height(高度)在浏览器中,指定宽度和高度就可以绘制出一个矩形区域,同时也决定(量化)当前HTML标签在屏幕上占用的有效矩形区域渲染。1.1width和height的取值height属性规则同width。另外,max-height和min-height的优先级高于height。同样,max-width和min-width的优先级高于width。1.2height:100%无效我们有时会在CSS中写height:100%,但是没有作用,如下:

*{padding:0;margin:0;border:0;}body{background-color:green;/*height:100%;*/border:5pxsolidgreenyellow;}.block{width:100%;height:100%;background-color:red;}块类div的高度并不是按照我们的预期,全屏的高度被填充到100%,屏幕的高度没有被覆盖。代码&效果:https://codepen.io/DYBOY/embed/RwoJKRPblock类的parent(包含block)是body,没有设置body。当height值为auto时,body实际计算的高度为内容的高度,为0(可以取消上面代码的borderstyle的注释,可以看到body的高度),那么height子元素块类的等于0body{background-color:azure;height:auto;}.block{width:100%;height:0*100%;//0background-color:red;}所以高度block类所在的div框的高度此时是无效的,高度为0,即浏览器上没有渲染高度。浏览器的渲染规则可以理解和记忆为:深度优先遍历计算子元素的相对单位。计算值基于parent/ancestor元素对应的属性值,auto基于内容。计算面积分布。浏览器渲染HTML文档流,背景色默认为白色。如果在文档中为html和body标签设置了背景色,那么这两个标签的背景色实际上是设置为浏览器视口的背景色。2.padding(内边距)&border(边框)&magin(外边距)盒模型可以看作是四个“同心矩形”的组合。下图中这三个属性的表现其实并没有特别的解释。看上图就知道意思了。元素分为行级元素和块级元素。行级元素的margin和padding上下值无效。2.1百分比单位的计算之前一直有个误区,认为padding和margin的百分比单位的计算基数是当前元素矩形区域的宽高,但是根据包含块的规则,它们的计算base应该是包含块的宽度值。上一期组长洪岩提问:“如何实现一张高度为自适应宽度3倍的图片?”实现方式一:使用Chrome浏览器新支持的aspect-ratio属性。问题是C端浏览器不兼容。ok.box{aspect-ratio:1/3;//width/height纵横比}纵横比效果实现方法二:巧妙利用containingblock规则(padding和width属性的百分比值的计算基数是width包含块)+背景图像实现利用包含块规则实现代码和演示:https://codepen.io/DYBOY/pen/JjbZgeE2.2border-radius百分比和像素border-radius属性用于描述半径border圆角的,根据数据如果是百分比单位是以**盒模型**的矩形宽高(包括border和padding)为计算基数,border-radius的值描述边界角所在的椭圆的半长轴和半短轴长度。border-*-radius属性的两个长度或百分比值定义了四分之一椭圆的半径,它定义了外边框角的形状(见下图)。第一个值是水平半径,第二个是垂直半径。如果省略第二个值,则从第一个值复制。如果任一长度为零,则角是方形的,而不是圆形的。水平半径的百分比是指边框的宽度,垂直半径的百分比是指边框的高度。考虑这个例子:1
2
3
4*{padding:0;margin:0;}body{background-color:#fff;}.box{position:relative;width:200px;height:200px;margin:10pxauto;background-color:#00abef;border-radius:100px;display:flex;justify-content:center;align-items:center;font-size:32px;color:#fff;}.style1{padding:20px;}.style2{padding:20px;border-radius:50%;}.style3{padding:20px;border-width:10px;box-sizing:border-box;}效果代码&demo:https://codepen.io/DYBOY/pen/BaQPaaj第二形状是椭圆形。原因是百分比的计算是以元素矩形区域的宽高为计算基础,矩形框高的计算值需要加上padding和border的宽度,所以它变成一个椭圆形。那么,是否可以通过将盒子模型设置为IE盒子模型来避免这个问题呢?答案是肯定的,就是上面代码中的第四圈。详细资料参考:https://www.w3.org/TR/2010/WD-css3-background-20100612/#the-border-radius使用border的椭圆,可以创建平滑的不规则形状,比如模仿水滴:移动的水滴**知识点:**如果没有设置border-color,默认的边框颜色是它所在元素的文字颜色。2.3BFC和marginfoldingBFC是盒模型中渲染显示在屏幕上的一个矩形区域,它决定了浮动和盒模型渲染交互的区域。折叠边距区域是一个BFC(block-levelformattingcontext)问题,两个div属于同一个BFC。父子元素的margin-top塌陷,兄弟元素的margin重叠取一个更大的值。如果要避免,需要将相邻的两个元素设置margin做成一个BFC。创建BFC的常用CSS属性值?浮动元素,float:left/right/autopositioning,position:absolute/fixeddisplay,display:inline-block/tablerelated/flow-root/flex/griddirectchildelementsofflex/gridForBFCtablerelatedsuchastable,table-cell,table-caption等flow-root最好,无副作用溢出,display表示溢出:hidden/autooverflowcss计算值不可见,即表示溢出框的交互区域modelHTML根元素的处理方法是一个BFC。BFC更详细的解读请参考:《可能是最好的BFC解析了...》-https://juejin.cn/post/69608660143848816712.3.1Example&Solution2.3.1.1parent-childheightcollapseparent-levelmargin,childLevelmargin-topinvalidheightcollapse代码&Demo:https://codepen.io/DYBOY/pen/poNxjOP解决方法:原因是父子组件的margin-top取最大值,父子的containingblocks上面例子中的component都是body,属于同一个BFC(html标签)中的子元素,所以需要将parent/child元素改成BFC(根据上面CSS值设置创建BFC),那么子元素的外边距将以父元素的左上角作为参考点外边距偏移量。2.3.1.2兄弟元素margin取较大值上下相邻元素的外边距为20px。解决方法:我想让每两个盒子的上下边距都是20px*2,需要这样处理:推荐解决方法:由于改变了DOM结构,不是最好的解决方法,更好的方法是利用折叠规则增加margin-bottom/margin-top的值,直接计算两个元素之间的margin,并设置相应的值。3.ContainingBlock(包含块)包含块的内容可以参考文章《字节前端都知道的CSS包含块规则》4.box-sizing(盒模型)盒模型由四部分组成:marginarea,borderarea,paddingarea),内容区(contentarea),其分布和组合如下图所示。盒模型盒模型有两种类型,IE盒模型(border-box)和标准盒模型(content-box),其常用语法如下//默认为标准盒模型box-sizing:border-box|content-box不同box模型影响的是HTML标签在浏览器上实际渲染的屏幕像素区域。该属性指定border和padding属性值是否占据宽度和高度指定的内容区域。比如width属性的取值计算规则如下:box是指定内容区域的宽高,border-box的宽高规定了content+border+padding的宽高CSS盒模型5.position)&line-height(行高)当line-height有单位,计算行高的结果就是line-height高度,line-height指定行高的最小高度。当line-height为相对单位时,line-height是继承的。如果子元素没有设置line-height,则子元素的行高为父元素计算出的行高值。当line-height值为纯数字时,当前行高将根据当前文本的font-size*line-height计算。7、CSS选择器7.1通用选择器.a.b:(无空格)仅当a和b出现在同一个标??签类名中时才选择。a.b:(带空格)selectalldescendantsofab.a>.b:(>)Selecta'schildrenb.a,.b:(,)ahasthesamestyleasb.a+.b:(+)selecta'simmediatesiblingb.a的样式~.b:(~)有一个共同的父元素,选择a之后的所有b,ab不必紧挨着7.2属性选择器:[attr]:表示具有名为attr的属性的元素。[attr=value]:表示一个元素的属性名为attr,属性值为value。[attr~=value]:表示一个元素有一个名为attr的属性,该属性是一个用空格分隔的值列表,其中至少有一个是value。[attr|=value]:表示元素的属性名为attr,属性值为“value”或以“value-”为前缀(“-”为连字符,Unicode编码为U+002D)。一个典型的应用场景是匹配语言缩写代码(比如zh-CN,zh-TW可以使用zh作为取值)。[attr^=value]:表示一个元素的属性名为attr,其值以value开头。[attr$=value]:表示一个元素有一个名为attr的属性,属性值以value结尾。[attr*=value]:表示一个元素具有名为attr的属性,该属性值至少包含一个value值。7.3伪类选择器:root:文档根元素八、文本处理font-stretch:normal;字体字距:正常;文本渲染:优化易读性;文字是最基本也是最重要的功能之一,深入了解文字的渲染布局非常有必要。关于文本处理相关的CSS,知识点多且深,所以会在后续的文章中详细讲解,因为文本处理是一个需要深入理解的领域,也是一个基础领域。大多数情况下我们不需要关心它。但是如果涉及到精细显示和兼容性问题,就不得不涉及文字渲染原理相关的内容。九、flexlayout.box{display:flex;/*也可以设置内联元素的inline-flex*/flex-direction:row;/*主轴水平!:行:列(从左到右);row-reverse:column(从右到左)主轴是垂直的!cloumn:线(从上到下);column-reverse:line(bottomtotop)*/flex-wrap:nowrap;/*当一行放不下时:nowrap不换行,wrap换行,wrap-reverse换行下面第一行*//*flex-flow:收割机;是上面两个的简写形式*/justify-content:flex-start;/*定义item在主轴上的对齐方式flex-startleft,flex-endright,center居中,space-betweenalignsitemswithequalintervals,space-arounditem左右两边间距相同*/align-items:flex-start;/*定义item在纵轴上的对齐方式flex-start,flex-end接下来,居中为居中,baselineitem中的第一行文本对齐,不设置stretch默认值的高度,会填充容器的高度*/}.item{order:0;/*定义顺序items,值越小越靠前,默认0*/flex-grow:0;/*定义剩余空间的放大比例,默认0,不放大,如果多个item都是1,剩余的空间会被平分,不同的值会按照比例分配空间*/flex-shrink:1;/*定义项目的收缩比例,默认为1,如果空间不足则收缩相等,如果为0则不收缩*/flex-basis:auto;/*定义项目分配到主轴空间时的长度被前面的主轴占用,浏览器会根据这个属性计算是否还有剩余空间*//*flex:auto;是flex-grow、flex-shrink和flex-basis的缩写默认值:01auto*/align-self:flex-start;/*设置单个item与其他item不同的对齐方式,可以覆盖align-items由父容器设置,默认auto继承父元素的align-items值auto|flex-start|flex-end|center|baseline|stretch*/}以上是笔者使用经验的一些浓缩总结柔性。另外,推荐大家阅读?。从原理层面看,很有用。10.自定义CSS属性示例:html{--theme-color:red;--theme-font-size:16px;}.example{color:var(--theme-color);font-size:var(--theme-font-size);}由于是新的属性规则,在低版本设备上可能会遇到不兼容的情况,可以使用@supports()@supports(color:var(--theme-color)){//如果支持上述处理方式,下面的css才会生效。class-box{color:var(--theme-color);}}//对selector的支持不好@supportsnot(color:var(--theme-color)){//如果上面的处理方式不行支持,下面的css会生效。class-box{color:red;}}兼容性:https://caniuse.com/?search=%40supports@支持文档:https://developer.mozilla.org/zh-CN/docs/Web/CSS/@supports总结了上面提到的十大css知识点,也是工作开发过程中经常遇到的细节问题,熟记这些知识点/css规则,将帮助你高效编写前端样式!参考和推荐阅读《Everything About Auto in CSS》-https://ishadeed.com/article/auto-css/《HTML vs Body: How to Set Width and Height for Full Page Size》-https://www.freecodecamp.org/news/html-page-width-height/《position - MDN》-https://developer.mozilla.org/en-US/docs/Web/CSS/position