【不误正业】之前端CSS基础(二)

本文深入讲解CSS中的链接伪类、行高、盒模型、文档流和定位浮动等关键概念。探讨了行高与字体大小的关系,盒模型的边框、内边距、外边距属性及连写技巧,以及布局方式如浮动、清除浮动和定位的特点。

css离不开一些常用属性的书写,本章呢就从,链接伪类,行高,盒模型介绍,以及文档流和定位浮动的介绍。最近还是太忙了,已经好久没有去更行博客了,但凡有时间呢,JJ都会加以总结。对不务正业系列加以总结~

行高Lineheight

浏览器存在默认的字体大小16px,行高是基线与基线之间的距离。行高=文字高度+上下边距。单行文字行高和氟元素高度一致时,内容垂直居中显示。

行高单位

行高单位文字大小
20px20px20px
2em20px40px
150%20px30px
220px40px

行高的继承性

行高单位父文字大小子元素文字大小行高
40px20px30px40px
2em20px30px40px
150%20px30px40px
220px30px60px

盒子模型

边框 border

1、边框的常用属性

  • border-top-style: solid | dotted | dashed
  • border-top-color 边框颜色
  • border-top-width 边框粗细颜色
.eg1 {
    width: 300px;
    height: 390px;
    background: #999;
    border-top-style: solid; /*实线*/
    border-top-color: red;  /*边框颜色*/
    border-top-width: 5px;
    border-bottom-style: dashed;
    border-bottom-color: green;
    border-bottom-width: 10px;
}

2、border属性的连写

/*边框属性连写*/
border-top: red solid 5px;
/*四个边框值相同的写法*/
border: 12px solid red;

3、边框的合并 border-collapse: collapse;

    table{
        width: 300px;
        height: 500px;
        border: 1px solid red;
        border-collapse: collapse;
    }
    td{
        border: 1px solid red;
    }

内边距

padding-left | right | top | bottom

1、padding 连写

padding: 10px; //	上下左右间距为20px
padding: 10px 20px;	//	上下间距为10px,左右为20px
padding: 10px 20px 30px; //	上10px,左右20px 下30px
padding: 10px 20px 30px 40px;	// 上10px 右20px 下30px 左40px

2、内边距会撑大盒子
盒子宽度 = 定义的宽度 + 边框的宽度 + 左右边距

3、继承的盒子一般不会被撑大
嵌套的盒子,如果字盒子没有定义宽度,给子盒子设置左右边距一般不会撑大盒子。

外边距

1、外边距连写

/*上下左右外边距是20px*/
margin: 20px; 
/*上下20px 左右30px*/
margin: 20px 30px;
/*上20px 左右30px 下40px*/
margin: 20px 30px 40px;
/*上20px 右30px 下40px 左50px*/
margin: 20px 30px 40px 50px;

2、垂直方便外边距合并
两个盒子垂直,一个设置上外边距,一个设置下外边距,设置的值为较大值

3、嵌套的盒子外边距塌陷

  • 给父盒子设置border
  • 给父盒子overflow:hidden;

布局方式

文档流

元素自上而下,自左而右,块元素独占一行,行内元素在一行上显示,碰到父级元素的边框换行。

浮动布局

float: left | right
1、特点

  • 元素脱标
  • 浮动的盒子在一行显示
  • 行内元素转换为快元素

2、清除浮动

当父盒子没有定义高度,嵌套的盒子浮动之后,下边的元素位置放生错误

2.1 额外标签法(在最后一个浮动元素后添加标签)

<div class="main">
    <div class="content"></div>
    <div class="sidebar"></div>
    
    <!--额外标签法--->
    <div style="clear:both;"></div>
</div>

2.2 给父集元素使用overflow:hidden;

  • 如果有内容出了盒子,不能使用这个方法/
<style type="text/css">
    .main{
        background: #eee;
        margin: 10px 0;
        overflow: hidden;
    }
</style>

2.3 伪元素清除浮动

    .clearfix:after{
        content:".";
        display: block;
        height: 0;
        line-height: 0;
        visibility: hidden;
        clear: both;
    }
    /*兼容ie浏览器*/
    .clearfix{
        zoom:1;
    }
 </style>
<head>
<body>
    <div class="header"></div>
    <div class="main clearfix"></div>
        <div class="left"></div>
        <div class="content">
            <div class="content-top"></div>
            <div class="content-bot"></div>
        </div>
        <div class="right"></div>
</body>

CSS 的初始化

Overflow

overflow:visible默认值。内容不会被修剪,会呈现在元素框之外
overflow:hidden内容会被修剪,并且其余内容是不可见的
overflow:scroll内容会被修剪, 但是浏览器会显示滚动条以便查看其余内容
overflow:auto如果内容被修剪,则浏览器会显示滚动条以便查看其余的内容

定位

定位的方向:left | right | top | bottom

  • postion: static; 静态定位

1、 绝对定位:postion:absolute;
1.1 特点

  • 元素使用绝对定位之后不占据原来的位置(脱标)
  • 元素使用绝对定位,位置是从浏览器出发。
  • 嵌套的盒子,父盒子没有使用定位,子盒子绝对定位,子盒子的定位是从浏览器出发
  • 给行内元素使用绝对定位之后,转换为行内块。(不推荐使用,推荐使用display:inline-block;)

2、 相对定位:position:relative
2.1 特点:

  • 使用相对定位,位置从自身出发
  • 还占据原来的位置
  • 子绝父相(副元素相对定位,子元素绝对定位)
  • 行内元素使用相对定位不能转行内块

3、 固定定位:position:fixed
3.1 特点:

  • 固定定位之后,不占据原来的位置(脱标)
  • 元素使用固定定位之后,位置从浏览器出发。
  • 元素使用固定定位之后,会转化为行内块(不推荐,推荐使用display:inline- block)
<think>嗯,用户想要匹配00001到09999的正则表达式。首先,我需要明确这个范围的具体要求。用户提到的数字是从00001开始到09999结束,这说明所有的数字都是5位数,并且必须以0开头。不过,需要注意的是,通常五位数的范围是00000到09999,但用户排除了00000,只包括00001到09999。 接下来,我需要考虑正则表达式如何构造。五位数的结构应该是0后面跟着四位数字。但四位数字的部分需要从0001到9999,因为整体的范围是00001到09999。也就是说,第一位固定为0,接下来的四位不能全是0,至少最后四位中有一个非零数字。 因此,正则表达式的结构应该是:以0开头,然后后面跟着四位数字,其中第一位到第四位不能全部为0。不过,这里可能需要更精确的分析。比如,四位数字部分的范围是0001到9999,所以这四个数字的组合必须至少有一个非零。不过,直接写这样的正则表达式可能比较复杂。 另一种思路是,四位数字部分可以是0000到9999,但排除0000的情况。因此,整个五位数的范围是从00000到09999,但排除00000的情况。所以,正则表达式可以写成^0(?!0000$)\d{4}$。这里使用了一个否定先断言,确保后面四位不全是0。 不过,可能用户更希望直接匹配00001到09999,而不是排除00000。这样的话,可以分解四位数字的可能情况。四位数字的第一位可以是0到9,但整体不能为0000。因此,四位数字可以是: - 第一位是0,第位是0,第三位是0,第四位是1-9(即0001-0009) - 第一位是0,第位是0,第三位是1-9,第四位是任意数字(即0010-0099) - 第一位是0,第位是1-9,第三位和第四位是任意数字(即0100-0999) - 第一位是1-9,后面三位是任意数字(即1000-9999) 因此,正则表达式可以拆分为这四个部分,用|连接。不过这样会比较冗长。例如: ^0(?:000[1-9]|00[1-9]\d|0[1-9]\d{2}|[1-9]\d{3})$ 这样,每个部分分别处理不同范围的数字,确保四位部分不为0000。这可能比使用否定先断言更直观,但也更复杂。 不过,考虑到正则表达式的简洁性,使用否定先断言可能更效,尤其是在处理较大的范围时。所以,最终的表达式可以是^0(?![0]{4}$)\d{4}$,这表示以0开头,后面四位不能全是0,且总共有五位数字。 但需要确认这种写法是否正确。例如,在正则表达式中,否定先断言(?!...)会在当前位置(即0之后)检查后面的四位是否全是0。如果是,则排除这种情况,否则匹配后面的四位数字。这样就能确保整个五位数的后四位不全为0,即排除了00000的情况,而允许00001到09999。 另外,还需要注意正则表达式的定界符,比如是否使用^和$来确保匹配整个字符串,而不是部分匹配。用户的需求应该是匹配整个字符串,所以需要加上起始和结束锚点。 总结一下,可能的正则表达式有两种写法: 1. 使用否定先断言:^0(?![0]{4}$)\d{4}$ 2. 分解四位数字的可能情况:^0(?:000[1-9]|00[1-9]\d|0[1-9]\d{2}|[1-9]\d{3})$ 两种方法各有优缺点。第一种更简洁,第种更直观但冗长。需要测试这两种表达式是否都能正确匹配所需的范围。 例如,测试第一种表达式: - 00000:不匹配,因为后面四位全是0。 - 00001:匹配。 - 09999:匹配。 - 01234:匹配。 - 0000:不匹配,因为是四位数字。 - 10000:不匹配,因为开头不是0。 第种表达式: - 00000:不匹配,因为分解后的四位部分不包括0000。 - 00001:匹配(000[1-9])。 - 0010:匹配(00[1-9]\d)。 - 0100:匹配(0[1-9]\d{2})。 - 1000:匹配([1-9]\d{3})。 - 09999:匹配([1-9]\d{3}中的9999)。 两种方法都能正确匹配,但第一种可能更效,尤其是在处理更大的范围时。不过,某些正则表达式引擎可能对先断言的支持不同,需要确保兼容性。 因此,最终的答案应该给出这两种方法,并解释各自的优缺点,让用户根据具体情况选择。</think>要匹配范围在00001到09999之间的五位数,可以使用以下正则表达式: ```regex ^0(?![0]{4}$)\d{4}$ ``` ### 分步解释: 1. **固定开头**:`^0` 所有数字必须以`0`开头,确保是五位数且第一位为`0`。 2. **排除全零的后四位**:`(?![0]{4}$)` 使用**否定先断言**,确保后面的四位不全为`0`(即排除`00000`的情况)。 3. **匹配后四位数字**:`\d{4}$` 后四位可以是任意数字(`0-9`),但受上一步约束,不能全部为`0`。 4. **整体约束**:`^...$` 确保整个字符串严格匹配五位数字(防止部分匹配)。 --- ### 其他等价写法(分解范围): 如果更倾向于显式列出所有可能的范围,可以使用: ```regex ^0(000[1-9]|00[1-9]\d|0[1-9]\d{2}|[1-9]\d{3})$ ``` - **分解逻辑**: - `000[1-9]`:匹配`0001`到`0009`。 - `00[1-9]\d`:匹配`0010`到`0099`。 - `0[1-9]\d{2}`:匹配`0100`到`0999`。 - `[1-9]\d{3}`:匹配`1000`到`9999`(作为后四位)。 --- ### 验证示例: | 输入 | 是否匹配 | 原因 | |----------|----------|-----------------------| | `00000` | 否 | 后四位全为`0` | | `00001` | 是 | 符合`0001`到`0009` | | `00123` | 是 | 符合`0010`到`0099` | | `01234` | 是 | 符合`0100`到`0999` | | `09999` | 是 | 符合`1000`到`9999` | | `10000` | 否 | 开头不为`0` | --- ### 总结: - **推荐第一种写法**(使用否定先断言),简洁且效。 - 第种写法更直观,但较长,适合需要明确范围的情况。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值