美文网首页
CSS-高级技巧

CSS-高级技巧

作者: Imkata | 来源:发表于2022-03-07 00:34 被阅读0次

    1. 元素的显示与隐藏

    ① display 显示

    display 设置元素是否及如何显示。

    display: none 隐藏对象
    display:block 除了转换为块级元素之外,同时还有显示元素的意思。
    

    特点:隐藏之后,不再保留位置。

    实际应用场景:配合后面js做特效,比如下拉菜单,原先没有,鼠标经过,显示下拉菜单, 应用极为广泛。

    ② visibility 可见性

    设置元素是否可见。

    visibility:visible ;  元素可见
    visibility:hidden;    元素隐藏
    

    特点:隐藏之后,继续保留原有位置。(停职留薪)

    ③ overflow 溢出

    设置元素的内容超过其指定高度及宽度时如何管理内容。

    属性值 描述
    visible 不剪切内容也不添加滚动条
    hidden 不显示超过对象尺寸的内容,超出的部分隐藏掉
    scroll 不管超出内容否,总是显示滚动条
    auto 超出自动显示滚动条,不超出不显示滚动条

    实际应用场景:

    1. 清除浮动
    2. 隐藏超出内容,隐藏掉, 不允许内容超过父盒子。

    2. BFC(块级格式化上下文)

    BFC(Block formatting context),直译为"块级格式化上下文"。BFC就是一个封闭的区域(独立的渲染区域),如果一个区域创建了BFC,它就会创建一个封闭的区域,盒子创建了BFC后,盒子里面的孩子爱怎么浮动,爱怎么定位,不会影响这个区域以外的盒子,这就叫做BFC。

    ① 哪些元素可以产生BFC

    我们前面讲过,元素的显示模式display,分为块级元素(block)、行内元素(inline)、行内块元素(inline-block)、隐藏(none),其实,它还有很多其他显示模式。

    不是所有的元素模式都能产生BFC,w3c 规范: display 属性为 block(块级元素),list-item(其实就是li,只不过我们没有显式的写出来,当然li也是块级元素),table 的元素,会产生BFC,所以:块级元素具有产生BFC的条件

    大家有没有发现这个三个都是用来布局最为合理的元素,因为他们就是用来可视化布局,其他的属性值,比如 line 等等,它们创建的是 IFC ,我们暂且不研究。

    这个BFC 有着具体的布局特性,比如,有宽度、高度、内边距padding、外边距margin、边框border。就好比,你有了练习武术的体格了,有潜力,有资质。

    ② 元素产生BFC的条件

    块级元素具有产生BFC的条件,就是说有资质了,但是怎样触发才会产生BFC,从而创造这个封闭的环境呢?

    给这些元素添加如下属性的一个就可以触发BFC。

    1. float属性不为 none(默认就是none)
    2. position为绝对定位(absolute)或固定定位(fixed)
    3. display为flex、inline-block、table-cell、table-caption、inline-flex
    4. overflow不为visible(默认就是visible)

    ③ BFC元素所具有的特性

    1. 在BFC中,盒子从顶端开始垂直地一个接一个地排列,盒子垂直方向的距离由margin决定,属于同一个BFC的两个相邻盒子的margin会发生重叠。

    怎么解决外边距合并问题呢?

    我们创建不属于同一个BFC,就不会发生margin重叠了(代码就是把绿色盒子再包装一层,然后给包装的盒子创建BFC,就是添加属性overflow: hidden)。

    1. 计算BFC的高度时,自然也会检测浮动或者定位的盒子高度。

    我们根据这个特性清除元素内部浮动。

    只要把父元素设为BFC就可以清理子元素的浮动了,最常见的用法就是在父元素上设置overflow: hidden样式。可能你会说,把父盒子设置为float不也可以让父元素变成BFC吗?但是把父元素添加float就脱离文档流了,可能就不会达到我们想要的效果了,所以我们一般使用overflow: hidden。当父元素为BFC,计算BFC的高度时,自然也会检测浮动或者定位的盒子高度,这样高度的问题就解决了。

    1. BFC的区域不会与浮动盒子产生交集,而是紧贴浮动边缘。

    以前我们说多,浮动刚开始出现就是为了做文字环绕图片效果的,所以如果有两个盒子,左边的盒子浮动,右边的盒子有文字,就会有文字环绕图片的效果,代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="utf-8">
      <style>
        * {
          margin: 0;
          padding: 0;
        }
        .left {
          float: left;
          width: 200px;
          height: 200px;
          background-color: blue;
        }
        .right {
          background-color: yellow;
          /* overflow: hidden; */
        }
      </style>
    </head>
    <body>
      <div class="left"></div>
      <div class="right">
        我是文字,我是文字,我是我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,我是文字,
      </div>
    </body>
    </html>
    

    文字环绕图片:

    如果我们想要装文字的盒子和左边盒子没有重叠,就需要给装文字的盒子添加BFC,也就是给装文字的盒子设置overflow: hidden;,添加BFC之后,装文字的盒子就跑到绿色盒子右边了,如下图:

    3. CSS用户界面样式

    所谓的界面样式,就是更改一些用户操作样式,以便提高更好的用户体验。

    ① 鼠标样式 cursor

    设置在元素上移动的鼠标指针采用何种系统预定义的光标形状。

    属性值 描述
    default 默认箭头
    pointer 小手
    move 正方形移动框
    text 光标输入框
    not-allowed 白色圆圈的禁止

    鼠标放我身上查看效果哦:

    <ul>
      <li style="cursor:default">默认箭头</li>
      <li style="cursor:pointer">小手</li>
      <li style="cursor:move">正方形移动框</li>
      <li style="cursor:text">光标输入框</li>
      <li style="cursor:not-allowed">白色圆圈的禁止</li>
    </ul>
    

    ② 轮廓线 outline

    是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用。

    outline : outline-color || outline-style || outline-width 
    

    但是我们都不关心可以设置多少,我们平时都是去掉的,最直接的写法是:outline: 0; 或者 outline: none;

    <input type="text" style="outline: none;"/>
    

    ③ 防止拖拽文本域 resize

    g

    为了防止用户随意拖拽文本域,造成页面布局,混乱实际开发中,我们文本域右下角是不可以拖拽,我们可以使用resize: none;禁止拖拽。

    <textarea style="resize: none;"> </textarea>
    

    4. vertical-align 垂直对齐

    • 文字水平居中,是 text-align: center;
    • 有宽度的块级元素水平居中,是 margin: 0 auto;
    • 定位的盒子水平居中,是left: 50%; margin-left: -100px;
    • 设置表格在网页中的水平居中,是 align: center

    上面都是设置水平居中,vertical-align 属性设置元素的垂直对齐方式,它只针对于行内元素或者行内块元素,特别是行内块元素,通常用来控制<img/><input/>与文字的对齐

    vertical-align: baseline | top | text-top | middle | bottom | text-bottom
    
    baseline:默认。元素放置在父元素的基线上
    top:把元素的顶端与行中最高元素的顶端对齐
    text-top:把元素的顶端与父元素字体的顶端对齐
    middle:把此元素放置在父元素的中部
    bottom:把元素的顶端与行中最低的元素的顶端对齐
    text-bottom:把元素的底端与父元素字体的底端对齐
    

    默认,图片会放到父元素文字的基线上,如下:

    ① 图片和文字对齐

    所以我们知道,我们可以通过 vertical-align 控制<img/>和父元素文字的垂直关系了。

    ② 去除图片底侧空白缝隙

    当父盒子由图片撑开,图片下面会多出缝隙。

    原因:

    我们应该知道<img/><input/>是一个行内块元素,而行内块元素的默认对齐方式是基线对齐,而这时候的<img/>就相当于下面文字的a、c、h、l、x,他的最底部对齐的是基线,所以会出现空白问题。

    解决的方法就是:

    1. <img/> 设置 vertical-align: middle | top bottom等等,让图片不要和基线对齐。
    1. <img/>添加 display:block; 转换为块级元素就不会存在问题了。

    5. 盒子居中

    以前我们学过让文字水平、垂直居中的方式如下:

    text-align: center; /*让文字水平居中*/
    line-height: 60px; /*行高等于盒子的高度,让文字垂直居中*/
    

    其实这两个属性不止可以让文字居中。

    text-align:以值为center为例,当前块级容器里的所有行内元素(包括img)在当前容器中水平居中,对块级元素无效。

    line-height:可以用在段落中,改变多行文字之间的行距;把某容器的line-height设置与height相同的值,可以使容器中的一行内容垂直居中,仅限一行内容,对行内元素(包括img)有效,对块级元素无效。

    总结:可以把行内元素当成文字来对待

    ① 水平居中的5种方法

    1. 使用 margin: 0 auto

    2. 使用定位(position),先让子盒子的左边缘和父盒子的垂直中心线重叠,然后再使用 margin-left 让子盒子往回移动自身的一半距离

    3. 使用定位(position),先让子盒子的左边缘和父盒子的垂直中心线重叠,然后再使用 transform: translateX(-50%)让子盒子往回移动自身的一半距离

    4. 使用flex弹性布局

    .box {
        display: flex;
        justify-content: center; /* 子元素水平排列方式,居中对齐 */
    }
    
    1. 把子盒子转换成行内块元素,然后给父盒子设置 text-align: center 属性使子盒子水平居中
    .t1 { /* 父盒子 */
        width: 300px;
        height: 300px;
        border: 1px solid red;
        text-align: center; /* 给父盒子设置 text-align: center 属性使子盒子水平居中 */
    }
    .t2 { /* 子盒子 */
        width: 200px;
        height: 200px;
        border: 1px solid blue;
        display: inline-block; /* 把子盒子转换成行内块元素 */
    }
    

    ② 垂直居中的3种方法

    1. 使用定位(position),先让子盒子的上边缘和父盒子的水平中心线重叠,然后再使用 margin-top让子盒子往回移动自身的一半距离

    2. 使用定位(position),先让子盒子的上边缘和父盒子的水平中心线重叠,然后再使用 transform: translateY(-50%);让子盒子往回移动自身的一半距离

    .t1 { /* 父盒子 */
        width: 300px;
        height: 300px;
        border: 1px solid red;
        position: relative;
    }
    .t2 { /* 子盒子 */
        width: 200px;
        height: 200px;
        border: 1px solid blue;
        position: absolute;
      /*垂直居中对齐最简单的方式*/
      top: 50%; /*先让子盒子的上边缘和父盒子的水平中心线重叠*/
        transform: translateY(-50%);  /*再让子盒子往回移动自身的一半距离*/
    }
    
    1. 使用flex弹性布局
    .box {
        display: flex;
        align-items: center; /* 子元素垂直排列方式,居中对齐 */
    }
    

    6. 溢出的文字省略号显示

    ① word-break 如何换行

    前面我们学了,letter-spacing 属性用于定义字母间距,一个汉字也可以看作一个字母,word-spacing 属性用于定义英文单词之间的间距。

    word-break 属性规定自动换行的处理方法,主要处理英文单词。

    word-break:normal      使用浏览器默认的换行规则。
    word-break:break-all   允许拆开单词显示。
    word-break:keep-all    不允许拆开单词显示,只能在半角空格或连字符处换行。
    

    ② white-space: nowrap 强制一行显示文本

    white-space 属性设置如何处理元素内的空白,通常我们使用于强制一行显示内容,可以处理中文。

    white-space:normal 默认。空白会被浏览器忽略。
    white-space:nowrap 文本不会换行,文本会在在同一行上继续,直到遇到 <br> 标签为止。强制一行显示后,文字大小不会改变
    

    ③ text-overflow 文字溢出

    text-overflow 属性规定当文本溢出包含元素时发生的事情。

    text-overflow : clip ;超出部分直接裁剪掉
    text-overflow:ellipsis ;超出部分使用...代替
    

    注意:文字溢出需要配合white-space:nowrap;(强制一行显示),overflow:hidden;(超出部分隐藏)

    ④ 文本溢出隐藏

    1. 单行文本溢出隐藏

    一般情况下上面那些属性是结合起来使用的,比如有需求:要求文字一行显示,超出的隐藏掉,未显示完的使用省略号表示,代码如下:

    p {
        white-space: nowrap; /*强制文本一行显示*/
        overflow: hidden; /*超出部分隐藏*/
        text-overflow: ellipsis; /*文本溢出使用省略号表示*/
    }
    
    1. 多行文本溢出隐藏 - webkit

    如果是多行文本溢出隐藏,显示省略号,代码如下:

    p {
        display: -webkit-box; /*将对象作为弹性的伸缩盒子显示*/
        -webkit-box-orient: vertical; /*设置伸缩盒子对象内子对象的排列方式:垂直方式排列*/
        -webkit-line-clamp:2; /*限定块元素显示的行数*/
        overflow: hidden; /*超出文本隐藏*/
        text-overflow: ellipsis; /*显示省略号*/
    }
    

    注意:上面的方式只针对于 - webkit 浏览器

    1. 多行文本溢出隐藏 - 通用方式

    采用添加伪元素的方式。

    p {
        height: 30px;
        line-height: 2em;
        overflow: hidden;
        border: 1px solid red;
        position: relative;
    }
    p::after {
        content: "...";
        position: absolute;
        right: 0;
        bottom: 0;
        padding: 0px 8px 0px 8px;
        background-color: #fff;
    }
    

    7. CSS精灵图技术(sprite)

    ① 为什么需要精灵图技术?

    图所示为网页的请求原理图,当用户访问一个网站时,需要向服务器发送请求,网页上的每张图像都要经过一次请求才能展现给用户。

    然而,一个网页中往往会应用很多小的背景图像作为修饰,当网页中的图像过多时,服务器就会频繁地接受和发送请求,这将大大降低页面的加载速度,为了有效地减少服务器接受和发送请求的次数,提高页面的加载速度,出现了CSS精灵技术(也称CSS Sprites、CSS雪碧)。

    ② 精灵图技术讲解

    CSS 精灵其实是将网页中的一些背景图像整合到一张大图中(精灵图),然而,各个网页元素通常只需要精灵图中不同位置的某个小图,要想精确定位到精灵图中的某个小图。

    这样,当用户访问该页面时,只需向服务发送一次请求,网页中的背景图像即可全部展示出来。

    我们需要使用CSS的如下属性来设置:

    background-image 背景图片
    background-repeat 背景图片重复方式
    background-position 背景图片开始位置
    

    首先我们知道,css精灵技术主要针对于背景图片,插入的图片 img 是不需要这个技术的。

    我们需要精确测量每个小背景图片的大小和位置,给盒子指定小背景图片时,背景定位基本都是负值。

    如果是小公司,背景图片很少的情况,没有必要使用精灵技术,因为维护成本太高。如果是大公司,背景图片比较多,建议使用精灵技术。

    ③ 精灵图使用案例

    精灵图如下:

    效果图如下:

    代码如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="utf-8">
      <style>
        span {
          background: url(images/abcd.jpg) no-repeat;
          float: left;
        }
        span:first-child { /*结构伪类选择器,匹配父元素中的第一个元素span*/
          width: 108px;
          height: 109px;
          background-position: 0 -9px;
        }
        span:nth-child(2) {
          width: 110px;
          height: 113px;
          background-position: -256px -275px;
        }
        span:nth-child(3) {
          width: 97px;
          height: 108px;
          background-position: -363px -7px;
        }
        span:nth-child(4) {
          width: 110px;
          height: 110px;
          background-position: -366px -556px;
        }
      </style>
    </head>
    <body>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
    </body>
    </html>
    

    8. 字体图标

    ① 什么是字体图标

    图片是有诸多优点的,但是缺点很明显,比如图片不但增加了总文件的大小,还增加了很多额外的"http请求",这都会大大降低网页的性能的,更重要的是图片不能很好的进行“缩放”,因为图片放大和缩小会失真。我们后面会学习移动端响应式,很多情况下希望我们的图标是可以缩放的,此时就需要用到字体图标(iconfont),字体图标的本质是文字,推荐两个字体图标库,如下:

    icomoon字库:http://icomoon.io

    IcoMoon成立于2011年,推出的第一个自定义图标字体生成器,它允许用户选择他们所需要的图标,使它们成一字型。 内容种类繁多,非常全面,唯一的遗憾是国外服务器,打开网速较慢。

    阿里 icon font 字库:http://www.iconfont.cn/

    这个是阿里的一个icon font字体图标库,包含了淘宝图标库和阿里巴巴图标库。可以使用AI制作图标上传生成。 一个字,免费,免费!!!

    ② 字体图标优点

    1. 可以做出跟图片一样可以做的事情,改变透明度、旋转度,等..
    2. 字体图标的本质是文字,可以很随意的改变颜色、产生阴影、透明效果等等...
    3. 本身体积更小,但携带的信息并没有削减。
    4. 几乎支持所有的浏览器。
    5. 因为可以进行缩放而不失真,所以是移动端设备必备良药...

    ③ 字体图标使用流程

    我们以icomoon字库为例,icomoon字库的字体图标使用流程如下:

    fontt.png

    1. 设计字体图标

    假如图标是我们公司单独设计,那就需要第一步了,这个属于UI设计人员的工作,他们在 illustrator 或 Sketch 这类矢量图形软件里创建 icon图标,比如下图,之后保存为 svg 格式,然后给我们前端人员就好了。

    除了自己制作svg图标,我们还可以直接从iconfont下载svg图标,如下图:

    2. 上传svg图标

    当我们拿到 svg 图标的时候,需要转换成我们页面能使用的字体文件,而且生成的是兼容各个浏览器的字体包。

    点击如下图标,进入上传界面:

    如果不是icomoon自带的svg图标,点击icomoon的ImportIcons按钮上传svg图标,上传之后选中图标,如下:

    如果是icomoon自带的图标,就不用上传了,直接选中图标就可以了,如下:

    3. 下载兼容字体包

    选中完图标之后,点击 Generate Font,生成字体包,如下:

    最后再点击Download下载字体包。

    4. 字体引入到HTML

    下载后的文件解压之后,如下:

    其中fonts文件夹就是我们使用的字体文件夹了,demo-files和demo.html是demo相关的文件,selection.json文件记录了我们选择了哪些字体,如果我们想要更新字体,那么就需要上传这个文件,然后重新下载兼容字体包。

    第1步:把fonts文件夹复制到我们的项目中(这是通俗的做法,而且注意其他文件也不要删,留着有用)

    第2步:在样式里面声明字体,告诉别人我们有自己定义的字体

    @font-face {
      font-family: 'icomoon';
      src:  url('fonts/icomoon.eot?7kkyc2');
      src:  url('fonts/icomoon.eot?7kkyc2#iefix') format('embedded-opentype'),
        url('fonts/icomoon.ttf?7kkyc2') format('truetype'),
        url('fonts/icomoon.woff?7kkyc2') format('woff'),
        url('fonts/icomoon.svg?7kkyc2#icomoon') format('svg');
      font-weight: normal;
      font-style: normal;
    }
    

    第3步:给盒子使用字体

    span {
        font-family: "icomoon";  /* 一定要保证和上面的font-family: 'icomoon' 相同 */
    }
    

    第4步:盒子里面添加结构

    span::before {
        content: "\e900";
    }
    
    /* 或者在Demo里面直接复制图标 */
    <span></span>  
    

    第5步:追加新图标到原来库里面

    如果工作中,原来的字体图标不够用了,我们需要添加新的字体图标,但是原来的不能删除,继续使用,此时我们需要把压缩包里面的 selection.json 重新上传,然后,选中自己想要的新图标,重新下载压缩包,替换原来文件即可。

    9. 滑动门

    现实中的滑动门就是类似全家店里的门,自动左右滑动来开门关门的。

    ① 复习新浪导航案例

    在案例:新浪导航中,因为标题的字数不一样多,所以我们不方便给宽度,而是给padding,由文字撑开盒子。

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="utf-8">
      <style>
        nav {
          height: 41px;
          background-color: #FCFCFC;
          border-top: 3px solid #FF8500;  /* 上边框 */
          border-bottom: 1px solid #EDEEF0;  /* 下边框 */
        }
        nav a {
          font-size: 14px;
          color: #4C4C4C;
          text-decoration: none; /*  取消下划线 */
          padding: 0 15px;  /* 内边距,上下0  左右15 */
          /* 因为链接是行内元素没有大小,所以需要转换行内块,才可以设置高度 */
          display: inline-block;
          height: 41px;
          line-height: 41px; /* 行高等于高度可以文字垂直居中 */
        }
        nav a:hover {  /* 链接伪类选择器  鼠标经过a链接的时候 */
          background-color: #eee;
        }
      </style>
    </head>
    <body>
      <nav>
        <a href="#">设为首页</a>
        <a href="#">手机新浪网</a>
        <a href="#">移动客户端</a>
        <a href="#">博客</a>
        <a href="#">微博</a>
        <a href="#">关注我</a>
      </nav>
    </body>
    </html>
    

    新浪导航中没有背景图片,所以简单一点,如果有背景图片,那就需要拉伸背景图片。

    ② 滑动门出现的背景

    制作网页时,为了美观,常常需要为网页元素设置特殊形状的背景,比如微信导航栏,有凸起和凹下去的感觉,UI往往只会给我们一张固定宽高的背景图,需要我们拉伸图片来适应不同的文字。

    为了使各种特殊形状的背景能够自适应元素中文本内容的多少,出现了CSS滑动门技术。它从新的角度构建页面,使各种特殊形状的背景能够自由拉伸滑动,以适应元素内部的文本内容,可用性更强,最常见于各种导航栏的滑动门。

    ③ 核心技术

    核心技术就是利用CSS精灵(主要是背景位置)和 盒子padding撑开宽度,以便能适应不同字数的导航栏。

    一般的经典布局都是这样的:

    <li>
      <a href="#">
        <span>导航栏内容</span>
      </a>
    </li>
    

    总结:

    1. a 不设置宽度,内容撑开盒子,设置背景左侧,再设置 padding-left 用于显示背景图的左边。
    2. span 不设置宽度,文字撑开盒子,设置背景右侧,再设置 padding-right 用于显示背景图的右边。
    3. 之所以a包含span就是因为整个导航都是可以点击的。

    ④ 微信导航栏案例

    下面使用滑动门技术实现微信导航栏案例,效果图如下:

    代码如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Document</title>
      <style type="text/css">
        * {
          margin: 0;
          padding: 0;
        }
        ul {
          list-style: none;
        }
        body {
          background: url(images/wx.jpg) repeat-x;
        }
        .nav {
          height: 75px;
        }
        .nav li {
          float: left;
          margin: 0 10px;
          padding-top: 21px;
        }
        .nav li a {
          display: block;
          color: #fff;
          font-size: 14px;
          line-height: 33px;
          /*不设置宽度,内容撑开盒子*/
          background: url(images/to.png) no-repeat; /*设置背景图*/
          padding-left: 15px; /* 设置左padding */
          text-decoration: none;
        }
        .nav li a span {
          display: block;
          line-height: 33px;
          /* 不设置宽度,内容撑开盒子 */
          background: url(images/to.png) no-repeat right center; /*设置背景图*/
          padding-right: 15px; /* 设置右padding */
        }
        .nav li a:hover {
          background-image: url(images/ao.png); /* 鼠标经过a要变换背景 */
        }
        .nav li a:hover span {  /* 鼠标经过a里面的span也要变换背景 */
          background-image: url(images/ao.png);
        }
      </style>
    </head>
    <body>
      <div class="nav">
        <ul>
          <li>
            <a href="#">
              <span>首页</span>
            </a>
          </li>
          <li>
              <a href="#">
                <span>帮助与反馈</span>
              </a>
          </li>
          <li>
            <a href="#">
              <span>公众平台</span>
            </a>
          </li>
          <li>
            <a href="#">
              <span>帮助与反馈</span>
            </a>
          </li>
          <li>
            <a href="#">
              <span>帮助与反馈</span>
            </a>
          </li>
        </ul>
      </div>
    </body>
    </html>
    

    10. 定位的盒子层级最高

    如何实现下面的四周边框宽度一致的效果?

    代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
            div {
                float: left;
                width: 200px;
                height: 300px;
                border: 1px solid #ccc;
                margin-left: -1px; /*左走负一*/
                margin-top: -1px;  /*上走负一*/
            }
        </style>
    </head>
    <body>
        <div></div>
        <div></div>
        <div></div>
    </body>
    </html>
    

    上面代码可以实现四周边框宽度一致,如果我们想实现鼠标经过盒子四周显示橘色边框的效果,那怎么办呢?

    因为浮动的盒子后面的会在前面的上面,所以后面盒子的线会压住前面的盒子的线,所以现在鼠标经过盒子的效果是这样的:

    我们只需让当前鼠标经过的那个div升到最高处就好了。因为定位的盒子层级是最高层的,我们只要保证当前的这个盒子是定位的,就会压住标准流和浮动盒子,所以我们只能用相对定位,因为它不脱标。

    注意:z-index只有定位的盒子才能使用,如果我们不使用定位,直接使用z-index: 999;肯定是没效果的,但是当我们使用相对定位后,盒子已经升到最高处了,就没必要使用z-index了。

    代码如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>margin负值之美-突出显示某个盒子</title>
        <style>
            div {
                float: left;
                width: 200px;
                height: 300px;
                border: 1px solid #ccc;
                margin-left: -1px;
                margin-top: -1px;
            }
            /*鼠标经过div*/
            div:hover {
                border: 1px solid #f40;
                position: relative;
            }
        </style>
    </head>
      <div></div>
      <div></div>
      <div></div>
    </html>
    

    这样鼠标经过div就会显示橘色边框了,如下:

    但是一般情况下,div就已经添加相对定位了(子绝父相),这时候我们就可以用z-index把层级调到最高了,如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>margin负值之美-突出显示某个盒子</title>
        <style>
            div {
                position: relative; /*相对定位*/
                float: left;
                width: 200px;
                height: 300px;
                border: 1px solid #ccc;
                margin-left: -1px;
                margin-top: -1px;
            }
            div:hover {
                border: 1px solid #f40;
                /*都是定位的盒子,我们通过z-index来实现层级关系*/
                z-index: 1;
            }
        </style>
    </head>
    <body>
      <div></div>
      <div></div>
      <div></div>
    </body>
    </html>
    

    小结:

    1. 定位的盒子层级是最高层的,我们只要保证当前的这个盒子是定位的就会压住标准流和浮动盒子。
    2. z-index 只能应用于相对定位、绝对定位和固定定位的元素,其他标准流、浮动无效。

    11. 宽高为0设置边框可以形成三角形

    当设置宽高为0,边框为10px。

    div {
        width: 0;
        height: 0;
        border-top: 10px solid red;
        border-right: 10px solid green;
        border-bottom: 10px solid blue;
        border-left: 10px solid pink;
      }
    

    效果如下:

    基于此,我们可以用css边框模拟三角形效果。

    1. 宽高为0。
    2. 我们4个边框都要写,只保留需要的边框颜色,其余的都改为 transparent 透明就好了。
    3. 为了照顾兼容性,低版本的浏览器,加上 font-size: 0; line-height: 0;

    ① 模拟淘宝三角形

    代码如下:

    p {
      width: 0;
      height: 0;
      border-style: solid;
      border-width: 10px;
      border-color: transparent transparent transparent red; /*只设置左三角的颜色*/
      font-size: 0;
      line-height: 0;
    }
    

    ② 京东三角形效果

    代码如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
          /* 长方形盒子 */
          div {
                /* 父相对定位 */
                position: relative;
                width: 200px;
                height: 100px;
                background-color: pink;
                margin: 100px auto;
            }
          /* 三角形盒子 */
          p {
              /* 子绝对定位 */
              position: absolute;
              /* 往上移动 */
              top: -40px;
              /* 水平居中 */
              left: 50%;
              margin-left: -20px; 
              /* 下面是设置三角形 */
              width: 0;
              height: 0;
              border-style: solid;
              border-width: 20px;
              /* 只设置下三角的颜色 */
              border-color: transparent transparent pink transparent;
              font-size: 0;
              line-height: 0;
            }
        </style>
    </head>
    <body>
        <div>
            <p></p>
        </div>
    </body>
    </html>
    

    相关文章

      网友评论

          本文标题:CSS-高级技巧

          本文链接:https://www.haomeiwen.com/subject/frfwrrtx.html