CSS 备忘录-基础内容

目录

1、CSS的基本结构

2、样式表的来源以及优先级

3、选择器的优先级 

4、源码顺序

5、px、em、rem单位

6、视口相对单位

7、使用 calc() 来定义属性值

8、一些无单位的属性

9、自定义属性

10、使用 JavaScript 来动态修改自定义属性

11、overflow 属性

12、子元素定位于父元素中央常用实现方法

 12-1)绝对定位方式

12-2)flex 布局

12-3)grid布局

13、猫头鹰选择器

14、让文本居中显示

1)使用 line-height 和 text-align

2)使用flex

15、FlexBox弹性容器布局

16、gird 网格布局

17、如果有文本溢出提前用省略号代替

1、单行文本的省略号处理:

 2、多行文本的省略号处理:

3、如果是多行文本但是没有控制好高度和行高:

18、 使用伪元素来绘制CSS三角形

19、input 元素自带的两个可能想覆盖的样式


1、CSS的基本结构

        以下是CSS的一个声明,由一个属性和一个值组成:

color:black;

        包含在大括号内的一组声明被称作一个声明块。声明块前有一个选择器。选择器和声明块一起构成一个规则集。

        下面是一个规则集:

.my-img{
    width: 100vw;
    height: auto;
}

2、样式表的来源以及优先级

        浏览器默认的样式是用户代理样式表;作者样式表是我们开发者自己写的样式表,如果有相同的声明,则作者样式表将覆盖用户代理样式表中的声明。

        标记了!important的声明会被当做更高优先级的来源,很难被覆盖掉,应该尽量少使用。

color:black !important;

        行内样式将直接覆盖任何样式表或来自<style>标签的样式。

3、选择器的优先级 

        id选择器 > 类选择器 > 标签选择器。

        若 id 选择器数量最多,则该规则集胜出;

        若 id 选择器数量一致,则类选择器多的规则集胜出;

        若 id 选择器和类选择器的数量一致,则标签选择器多的规则集胜出;

4、源码顺序

        如果两个声明的来源和优先级相同,则出现在样式表较晚或者位于页面较晚引入的样式表中,那么该声明将胜出。

5、px、em、rem单位

        px:像素,相对长度单位,为相对于显示屏分表率而言的;

        em:相对长度单位,相当于当前对象内文本的字体尺寸,可以会继承父级元素的字体大小;

        rem:相对Html根元素的字体大小;

可以通过改变 html 根元素的字体大小来改变使用了rem的元素的大小(:root 就是 html 元素):

:root{
    font-size: 10px;
}

         浏览器的默认字体尺寸是 16px。

6、视口相对单位

        视口即浏览器窗口网页可见部分的边框区域(不包括状态栏、工具栏、地址栏)。

        vh:视口高度的1/100;

        vw:视口宽度的1/100;

        vmax:视口高、宽中最大一方的1/100;

        vmin:视口宽、高中最小一方的1/100;

7、使用 calc() 来定义属性值

        可以进行不同单位之间的四则运算:

font-size: calc(10px + 1.2em);

        注意:+、- 符号前后必须要有空格;

8、一些无单位的属性

        1)line-height

        2)z-index

        3)font-weight

        4)opacity

        5)flex-grow  && flex-shrink

9、自定义属性

        自定义属性规则:变量名之前必须有两个连字符(--),变量名必须在一个声明块中声明,当要使用该变量时,调用函数var(自定义的变量)。

        如果一个自定义属性是在一个属于某个标签的规则集中定义的,那么他的后代都能够使用该自定义属性。(在 :root 选择器中声明,那么该变量可以在整个网页中使用)。

:root{
    --my-font-size: 20px;
}

div{
    font-size: var(--my-font-size);
}

10、使用 JavaScript 来动态修改自定义属性

let rootEle = document.documentElement;        // 获取根元素
let styles = getComputedStyle(rootEle);        // getComputedStyle() 获取一个元素的style对象
let myFontSize = styles.getPropertyValue('--my-font-size');
console.log(String(myFontSize).trim());        // 将输出 20px

var size = parseInt(myFontSize);
rootElement.style.setProperty('--my-font-size', size + 2 + 'px');    // 将--my-font-size 设置为22px

11、overflow 属性

        控制溢出内容的行为,支持四个值:auto、scroll、hidden、visible;

        1)auto:当内容溢出才展示滚动条;

        2)scroll:在一些操作系统上可能展示水平和垂直滚动条,即使不溢出,此时滚动条置灰;

        3)overflowX、overflowY设置单一方向上的溢出,支持以上四个值。

12、子元素定位于父元素中央常用实现方法

    <div class="parent">
        <div class="child"></div>
    </div>

 12-1)绝对定位方式

.parent{
    position: relative;
}
.child{
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%,-50%);
}

12-2)flex 布局

.parent{
    display: flex;
    justify-content: center;
    align-items: center;
}

12-3)grid布局

.parent{
    display: grid;
    justify-content: center;
    align-content: center;
}

13、猫头鹰选择器

        基本形式:.className * + *{...}

        表示选择指定元素下的所有子元素中的非首元素。

    <div class="outer">
        <div class="inner">
            <ul>
                <li>a</li>
                <li>b</li>
                <li>b</li>
            </ul>
        </div>
        <div class="inner">
            <ul>
                <li>a</li>
                <li>b</li>
                <li>b</li>
            </ul>
        </div>
        <div class="inner">
            <ul>
                <li>a</li>
                <li>b</li>
                <li>b</li>
            </ul>
        </div>
    </div>

        li{
            margin: 6px 0;
        }
        .inner * + *{
            background-color: brown;
        }

        .inner 下的元素是 ul ,在这里将选中所有 li 下的第二个到第三个元素,将背景设为红色。

 附:选择指定元素下的所有子元素中的首元素

.inner * :first-child{
    background-color: pink;
}

14、让文本居中显示

<div class="text">文字内容</div>

1)使用 line-height 和 text-align

        .text{
            width: 100px;
            height: 50px;
            background-color: antiquewhite;

            text-align: center;
            line-height: 50px;
        }

2)使用flex

        .text{
            width: 100px;
            height: 50px;
            background-color: antiquewhite;

            display: flex;
            justify-content: center;
            align-items: center;
        }

15、FlexBox弹性容器布局

1、设置display: flex; 或 display: inline-flex; 将元素设置为弹性容器,其直接子元素为弹性子元素。

        弹性子元素默认从左到右按顺序排列。

        弹性容器像块元素一样能填满宽度,但是弹性子元素不一定能填满弹性容器的宽度。

        弹性子元素的高度相等(flex-direction:row; 时,即默认方向排列),该高度由他们的内容决定。

2、子元素默认按照主轴线排序,主轴方向自左到右,副轴方向垂直与主轴,方向从上到下。

3、弹性盒子内直接子元素的auto外边距会自动填满所有可用空间,即离外侧范围达到最大。

4、flex

        4-1、flex属性:控制弹性子元素在主轴方向的大小(默认情况下flex-direction:row; 在弹性子元素中设置flex控制元素的宽度。flex-direction:column;时,在弹性子元素中设置flex控制的是元素的高度)。

        4-2、flex是一个简写属性,包括flex-grow、flex-shrink、flex-basis。

                4-2-1、flex-grow是增长因子,多出来的留白将按照每个弹性子容器的增长因子进行分配。如果一个弹性子容器的增长因子为0,那么他的宽度(或高度)不会超过其flex-basis的值。如果一个弹性容器的增长因子不为0,那么他会增长到所有剩余空间被分配完。flex-grow的值越大,其权重越高。一个增长因子为2的弹性子元素的大小是一个增长因子为1的弹性子元素的大小的两倍。

                4-2-2、flex-shrink代表每个弹性子元素在弹性元素溢出时收缩的权重。当弹性元素内容溢出,某个弹性子元素的flex-shrink为0,则该元素不收缩;当flex-shrink不为0时,将进行收缩,权值越大,收缩的比重越多。

                4-2-3、flex-basis定义元素大小的基准值,即一个初始的“主尺寸”。初始值为auto,此时浏览器会检查该元素是否有设置width属性,如果有,则使用width作为flex-basis的值;如果没有,则根据内容来确定。如果flex-basis的值不是auto,那么元素的width属性将被忽略。

         4-3、flex简写属性的默认值为 1 1 0%;分别对应flex-grow,flex-shrink,flex-basis。在设置flex时,如果某个子属性的值被省略,那么简写属性会给出默认值。如果没有使用flex简写属性,那么没有设置的子属性值不会有默认值。

       4-4、flex-direction 能够切换主副轴的方向,取值有四个:row、column、row-reverse、column-reverse。

        4-5、当flex-direction的方向为column或column-reverse,主轴将发生旋转。对于内部弹性子元素,flex-grow、flex-shrink、flex-basis作用域元素的高度而不是宽度。

            弹性容器的高度由弹性子元素决定,他们会正好填满容器。在主轴是垂直方向的弹性盒子里,子元素的flex-grow和flex-shrink不会起作用,除非有外力的影响强行改变盒子的高度,即可以是弹性盒子自定义的高度。

5、弹性容器的属性:

(1)flex-direction:设置主轴的方向

(2)flex-wrap:nowrap (初始值) | wrap | wrap-reverse

            指定弹性子元素是否会在弹性容器中折行/列显示(放不下就折行/列)

(3)flex-flow:<flex-direction> <flex-wrap>的简写

(4)justify-content:flex-start (初始值) | flex-end | center | space-around | space-between

            控制元素在主轴上的位置

(5)align-items:flex-start | flex-end | center | stretch | baseline (根据第一行文字的基线对齐)

            控制元素在副轴上的位置

(6)align-content:flex-start | flex-end |center | stretch | space-around | space-between

            如果开启了flex-wrap,align-content会控制弹性子元素在副轴上的间距。如果没有换行,则会忽略align-content属性。

6、弹性子元素的属性:

(1)flex-grow

(2)flex-shrink

(3)flex-basis

(4)flex:flex 属性就是 flex-basis  flex-grow  flex-shrink 的合并简写;

(5)align-self:auto | flex-start | flex-end | center | stretch | baseline

            控制子元素在副轴上的对齐方式,将覆盖掉容器上的align-items属性的值。如果子元素副轴方向上的外边距为0,则会忽略该属性。

16、gird 网格布局

1、设置属性display:grid;将容器设为网格容器,容器内的直接元素为网格元素。

        容器表现为块级元素。

        也可以使用inline-grid;元素将表现为行内元素,宽度只能够包含内容大小。

2、grid-template-rows:定义网格每行的大小;

      grid-template-columns:定义网格每列的大小;

      使用一个新的单位 fr ,为分数单位,grid-template-columns:1fr 1fr 1fr;即构造等宽的三列。

      不一定非要使用分数单位。grid-template-columns:1fr 300px;设置两列,第二列宽300px,第一列占满全部剩余的位置。2fr的宽度是1fr的宽度的两倍。

      grid-gap:定义网格之间的间距。grid-gap:0.5em 1em;定义垂直方向距离0.5em,水平方向距离1em。

3、网格中的四个重要的概念:网格线、网格轨道、网格单元、网格区域。

4、在定义多个重复的网格轨道时可以使用简写函数repeat():

        如grid-template-columns:repeat(4,auto);即定义了四个宽度为auto的列。

        另外,repeat(3,1fr 2fr);定义六个轨道,等价于这样书写1fr 2fr 1fr 2fr 1fr 2fr。

      还可以这样书写:grid-template-rows:1fr repeat(2,2fr 4fr) 1fr;则等价于1fr 2fr 4fr 2fr 4fr 1fr。

5、网格线的默认编号:

    列从左往右,1 2 3 4 5...;

    行从上往下,1 2 3 4 5...;

        可以在 grid-colum 或 grid-row 属性中用网格线的编号指定网格元素的位置:如想要一个网格元素在垂直方向上跨越1号网格到3号网格,则可以给网格元素设置grid-column:1 / 3 ; 中间的斜线仅用来区分两个值,前后的空格没有要求。

        grid-column和grid-row都是简写属性,如grid-row是grid-row-start和grid-row-end的简写。

        同时,可以用 span 关键字来指定一个网格轨道长度。如grid-row:span 2;则告诉浏览器元素需要在垂直方向上横跨两个网格轨道(即占两行)。

6、命名网格线:

        可以给网格线命名,在布局的时候用网格线名称代替其默认的编号。

        如:grid-template-columns:[start] 1fr [center] 2fr [end];该声明定义了两条网格轨道,分别为1fr 和 2fr ,三条网格线,名称分别为 start、center 、end。然后在定义网格元素在网格中的位置时,可以使用名称来声明,如grid-column:start / end;

        还可以给一条网格线提供多个名称,如:grid-template-rows:[top-start] 1fr [top-end,bottom-start] 1fr [bottom-end];则在这条声明里,水平2号网格线具有两个名称。

        这里需要注意,将网格线命名为 top-start 和 top-end,就定义了一个区域,这个区域覆盖两个网格线之间的空间,-start 和 -end后缀作为关键字,定义两者之间的区域,如果给网格元素设置grid-row:top;则他会跨越从top-start到top-end的区域。

        注意,当使用如repeat(3 , [top-start] 1fr 1fr);来生成网格时,等价写法如下:[top-start] 1fr 1fr [top-start] 1fr 1fr [top-start] 1fr 1fr ;

7、命名网格区域:

        容器中:grid-template-areas 属性  设置网格区域;

        元素中:grid-area 属性  设置放置的区域

    <div class="container">
        <div class="header"></div>
        <div class="content"></div>
    </div>
        .container {
            display: grid;
            width: 500px;
            height: 500px;
            grid-template-columns: 1fr 3fr;
            grid-template-rows: 100px 1fr 80px;
            grid-template-areas:
                "header header"
                "sidebar content"
                "footer footer";
        }

        .header {
            grid-area: header;
            background-color: #5fe929;
        }
        .content {
            grid-area: content;
            background-color: #c22121;
        }

        grid-template-areas中有多个字符串,每一个字符串都代表网格区域的一行,字符串内用空格分开列。

        注意:每个区域都要设置为矩形,不能设置为其他特殊的图形;

        可以使用 . 作为占位名称,这样能空出一个网格单元

8、显式和隐式网格

        隐式网格轨道默认为auto,他们会扩张到能容纳网格元素的内容。可以给网格容器设置grid-auto-columns 和grid-auto-rows,为隐式网格轨道定义一个大小。如grid-auto-rows:1fr;

        使用minmax()函数分别指定最大尺寸和最小尺寸,浏览器会确保轨道的大小介于这两者之间。

        使用方式如:grid-template-rows:repeat ( auto-fill, minmax(200px , 1fr ) ) ;则将最小行高设置为200px;

        repeat 函数中的 auto-fill 关键字为一个特殊值,设置了该值以后,只要网格放得下,浏览器就会尽可能多的生成轨道,并且不会跟指定的minmax()大小产生冲突。

        auto-fill 和 minmax() 加在一起就能让网格在可用空间内尽可能的多产生轨道。如果元素不够填充所有的网格轨道,auto-fill就会导致一些空的网格轨道。如果不希望出现空的网格轨道,可以使用 auto-fit 关键字来替代 auto-fill。他会让非空的网格轨道扩展,并填满可用空间。

        默认情况下,当一个元素无法再某一行容纳,布局算法会自动将他移动到下一行,在下一行的位置寻找足够大的空间来容纳他。使用 grid-auto-flow 可以控制布局的算法行为。其初始值为row,先前描述的就是这个值的行为。如果值为 column,它将会将元素优先放在网格列中,只有当一列填满了,才会移动到下一行。

        还可以额外添加一个关键字 dense,如grid-auto-flow:column dense;它让算法紧密地填满网格里的空白,尽管这会改变某些元素的顺序。使用这个值,小的元素就会回填大的元素造成的空白区域。

        默认情况下,每个网格元素都会扩展并填满整个网格区域,但是网格元素的子元素不会填满网格元素。使用img标签展示图片时,img有一个特殊的属性能控制图片的缩放拉伸:object-fit。取值可以为 cover、contain、fill 等。默认值为fill,整个图片将缩放,以填满img元素。使用cover将扩展图片,让他填满盒子(图片的一部分将被裁减);使用contain将缩放图片,让他完整地填充盒子(导致盒子中可能出现空白)。

17、如果有文本溢出提前用省略号代替

        主要使用的属性为:text-overflow

        有五个属性:clip(将溢出的内容裁剪掉);ellipsis(用省略号代替);string(用给定的字符串替代省略的文本);initial(默认值);inherit(继承)

        注意,如果需要使用省略号来处理溢出内容,需要在块级元素中使用,并且要搭配 white-space:nowrap;(单行时) 和 text-overflow:hidden; 来使用。

        如果要设置文本的溢出用省略号代替,一般要设置文本元素的高度、宽度以及文本的行高。如要设置文本内容显示两行,且该元素的宽度为 x,则一般设置文本的行高为一半的元素高度,防止换行展示。

1、单行文本的省略号处理:

<div class="container">
        如果要设置文本的溢出用省略号代替,一般要设置文本元素的高度、宽度以及文本的行高。
        如要设置文本内容显示两行,且该元素的宽度为 x,则一般设置文本的行高为一半的元素高度,防止换行展示。
</div>
        .container {
            background-color: antiquewhite;
            width: 200px;
            height: 50px;
            text-overflow: ellipsis;
            white-space: nowrap;
            overflow: hidden;
        }

 2、多行文本的省略号处理:

        多行文本要换行,所以不需要 white-space :nowrap;

        使用 display:-webkit-box;弹性盒子布局。

        .container {
            background-color: antiquewhite;
            width: 200px;
            height: 50px;
            text-overflow: ellipsis;
            padding: 0 16px;
            box-sizing: border-box;

            /* white-space: nowrap;    如果是一行以上的就要开启换行 */
            line-height: 25px;          /* 设置行高 */
            overflow: hidden;
            display:-webkit-box;
            -webkit-box-orient: vertical;	/* 设置对齐方式 */
            -webkit-line-clamp: 2;		    /* 第二行文本后面加省略号 */
        }

3、如果是多行文本但是没有控制好高度和行高:

        .container {
            background-color: antiquewhite;
            width: 200px;
            height: 50px;
            text-overflow: ellipsis;
            padding: 0 16px;
            box-sizing: border-box;

            /* white-space: nowrap;    如果是一行以上的就要开启换行 */
            /* line-height: 25px; 不控制行高 */
            overflow: hidden;
            display: -webkit-box;
            -webkit-box-orient: vertical;	/* 设置对齐方式 */
            -webkit-line-clamp: 2;		    /* 第二行文本后面加省略号 */
        }

18、 使用伪元素来绘制CSS三角形

        当元素没有内容,但边框的大小不为零,则会形成下图的样式,四个三角形构成一个正方形,每一个三角形对应一个边。可以只让一条边有可视的颜色,其余边设置透明的颜色(transparent),那么可以作出一个三角形。

        可以直接使用元素来做,也可以使用元素的伪类来完成(::after 、::before)

div{
    content:'';	/* 如需正常显示,则需要content */
    border: 30px  solid;
    border-color: transparent  black  transparent transparent;	 /* 将边框右边的三角形填充为黑色,其余的都是透明的边 */
    position:absolute;
    /* 使用定位将元素定位到需要的位置上 */
}

19、input 元素自带的两个可能想覆盖的样式

        outline、border-style

猜你喜欢

转载自blog.csdn.net/hao_13/article/details/131148216