【CSS基础】个人遇见的常见例题系列,一起来回顾(二)

前言

题目后缀表示本人遇到的频率(高/低)


选择器都有哪些(高)

看我文章


选择器优先级(高)

  • !important
  • 内联样式
  • ID选择器
  • 类选择器/属性选择器/伪类选择器
  • 元素选择器/伪元素选择器
  • 关系选择器/通配符选择器

带!important 标记的样式属性优先级最高; 样式表的来源相同时:!important > 行内样式> ID选择器 > 类选择器 > 标签 > 通配符 > 继承 > 浏览器默认属性

但是!实际上优先级的内部机制是这样的:

首先作者样式表的!important大于浏览器默认样式表的!important

然后再看选择器权重:

  • 分为四位数
  • 第一位数,如果是内联就加1
  • 第二位数,如果是id选择器,有几个就加几个1
  • 第三位数,如果是属性、类、伪类选择器,有几个就加几个1
  • 第四位数,如果是元素、伪元素选择器,有几个就加几个1

累计起来后相互比较,例如:

<style>
    .box,
    div {
        color: red;
    }

    .box {
        color: yellow;
    }
</style>

第一个样式内容的权重是 0 0 1 1,第二个是0 0 1 0,两者比较的时候,从左向右比大小,到第4位数时前者胜,所以以前者为主生效。

不信可以ctrl鼠标移入选择器看,不过编辑器会不显示第一位:

在这里插入图片描述

空白文本节点/空白占位(高)

当盒子用了inline-block布局后,标签与标签之间会有空的地方:

在这里插入图片描述

横向排布会有空白文本节点占位5px的问题,解决方案如下:

  1. 使用浮动;
  2. 父级设置font-size: 0;
  3. 使用position定位;
  4. 相关子级margin为-5px;
  5. 父级设置letter-spacing: -5px;
  6. 标签不要换行;

纵向上没有这个问题。

这也引出一个问题,尽量不要用inline-block布局,因为他开启的是IFC(行级格式化上下文)布局,会带来什么问题呢?

  • 上面说的空白问题,而且生产环境的代码是压缩的,这种现象又会消失
  • 基准线琢磨不透,你会发现有时候,你的盒子里的文字在盒子底部,正常应该是在盒子顶部的,这就是IFC复杂的基准线机制导致的。

margin-top溢出问题(低)

当自己设置了margin-top,会有出现溢出父级外的情况。解决方案:

  1. 需要父级有顶边框才能生效,可以来个透明的边框 border:1px solid transparent; 推荐使用;
  2. 可以用绝对定位解决;
  3. 父级启用BFC;
  4. 父级用padding;

会影响排布的继承属性(低)

继承属性可以粗略的记成和文字相关的属性都可以继承,其他的不太能继承。

我懒就不记录了,直接看其他博主的文章


三个隐藏的布局区别(低)

分三种

layout树不生成该节点:

  • display: none;
  • 给标签加上hidden属性,例如<div hidden></div>

视觉上的隐藏:

  • opacity: 0; 不会改变页面布局,如果该元素已经绑定一些事件,如click事件,那么点击该区域,也能触发点击事件的;
  • visibility: hidden;不会改变页面布局,但是不会触发该元素已经绑定的事件;

语义上的隐藏:

  • 例如<div aria-hidden="true"></div>,表示不给例如残障模式的读屏软件读取,但还是可见的

双飞翼布局和圣杯布局(低)

双飞翼布局题目例子:写一个左中右布局占满屏幕,其中左右两块固定宽200,中间自适应,要求先加载中间块,写出结构和样式;

这里就贴出两栏和三栏的双飞翼布局写法,要学会举一反三。

两栏:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <!-- 一般使用在后台管理系统的布局
		     2栏的布局:左边固定大小,右边自适应
			 原理:flex布局 块级元素自动占满空间-->
        <style>
            * {
                margin: 0;
                padding: 0;
            }
            .wrap {
                height: 100vh;
                display: flex;
            }
            .left {
                flex: 0 0 200px;
                background-color: #0000ff;
            }
            .right {
                flex: 1;
                background-color: #2ac845;
            }
        </style>
    </head>
    <body>
        <div class="wrap">
            <div class="left"></div>
            <div class="right"></div>
        </div>
    </body>
</html>

三栏:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <!-- 一般使用在后台管理系统的布局
			 3栏的布局:左右边固定大小,中间自适应,且中间的dom先加载
			 原理:浮动 块级元素自动占满空间-->
        <style type="text/css">
            * {
                margin: 0;
                padding: 0;
            }
            .main > div {
                /* 这里是重点 */
                float: left;
            }
            .wrap {
                width: 100%;
            }
            .mid {
                background-color: red;
                margin-left: 200px;
                margin-right: 200px;
                height: 100vh;
            }
            .left {
                background-color: blue;
                width: 200px;
                margin-left: -100%;
                height: 100vh;
            }
            .right {
                background-color: yellow;
                width: 200px;
                margin-left: -200px;
                height: 100vh;
            }
        </style>
    </head>
    <body>
        <div class="main">
            <div class="wrap">
                <div class="mid">mid</div>
            </div>
            <div class="left">left</div>
            <div class="right">right</div>
        </div>
    </body>
</html>

圣杯布局就是在双飞翼的基础上加了头部和尾部:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<!-- 圣杯布局:分为头部,中间,底部。其中中间又分为左中右,且中是自适应
		     原理:flex布局 块级元素自动占满空间-->
		<style>
			*{
				margin: 0;
				padding: 0;
			}
			.container{
				display: flex;
				flex-direction: column;
				height: 100vh;
			}
			header{
				background-color: #007AFF;
				height: 100px;
			}
			section{
				flex: 1;
				display: flex;
			}
			.left, .right{
				background-color: #008000;
				flex: 0 0 100px;
			}
			.center{
				flex: 1;
				background-color: red;
			}
			footer{
				background-color: #007AFF;
				height: 100px;
			}
		</style>
	</head>
	<body>
		<div class="container">
			<header>头部</header>
			<section>
				<div class="left">left</div>
				<div class="center">center</div>
				<div class="right">right</div>
			</section>
			<footer>底部</footer>
		</div>
	</body>
</html>

个人觉得这两种布局没有考的意义,真正工作中不可能还用上面的方式去布局。


浮动带来的特性(高)

  1. 给一个元素浮动,如果后面是行内元素,则浮动元素仍会占据空间,后面的元素还是乖乖的跟在后面。
  2. 如果后面是块级元素,则浮动元素直接脱离普通流,但块级元素内的文字不会被浮动元素覆盖。
<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>
        <style>
            div {
                display: inline-block;
                width: 100px;
                height: 100px;
                background-color: bisque;
            }
            .left {
                float: left;
            }
            .block {
                display: block;
            }
        </style>
    </head>
    <body>
        <div class="left">1</div>
        <div class="block">2</div>
    </body>
</html>

在这里插入图片描述
块级元素被浮动元素挡住,但是文字不会。

  1. 会使行内元素的宽高可设置;
  2. 会使块级元素的宽不是默认100%,由内容撑大;

如何清除浮动塌陷(高)

  • 给父级设置高度,缺点不灵活,难维护;
  • 让父元素也浮动起来,缺点影响之后元素的布局;
  • 在子元素末尾加一个块级元素,并添加clear: both,进行闭合浮动;缺点是多了一个无语义的块级元素;所以又衍生出下个方法;
    在这里插入图片描述
  • 最常用的方式,父元素加入伪元素;一样的机制,一样的效果;
.main:after{
	content: "";
	clear: both;
	display: table;
}
  • 给父元素加入over: hidden(BFC);缺点容易造成不会自动换行导致超出的尺寸被隐藏掉,无法显示要溢出的元素;
  • 还有一个最好的带有浏览器兼容的方法;
/* 清除浮动 */
.clearfix {
	*zoom: 1;
}

.clearfix:after {
	content: ".";
	display: block;
	height: 0;
	visibility: hidden;
	clear: both;
}

一般回答最常用的方式即可!


z-index的相关细节(高)

这块和层叠上下文知识点有关。

使用z-index时,要设置position属性。

如何判断两个盒子的层级关系?

首先每个盒子先往父祖找,看那个父级有设置position和z-index的,有的话这个父级就是盒子的层叠上下文。然后就可以判断了:

  • 先看他们是不是同父的,是的话看自己谁的z-index数值大,谁大谁在上面。如果盒子都没开启z-index,那么后面的盒子层级高于前面的盒子。
  • 如果不是同父的,就那他们的父级的层级比较,父级层级大的无论子级z-index设置多小都比对方层级高。
  • 如果找不到有设置position和z-index的父级,就那html根节点作为父级。

特殊1:如果子父都设置了position和z-index,子级设置成负数,也会在父级之上。

特殊2:如果找不到层叠上下文,且盒子设置了负数,父级是块盒,那么他会在父级下面。

CSS3之后又出了很多规则,例如:

  • 如果一个节点设置了flex,且他的子级设置了z-index,那么这个子级不设置position也会被当做一个孙级的层叠上下文。
  • …很多记不住

单位容易忽略的细节:%、em、rem、vh、vw、vmin、vmax区别(高)

单位分为绝对单位和相对单位,之间的区别这里就不赘述了。

一、%分为几种情况:

  • 子级width的百分比为包含块width的百分比,子级height的百分比为包含块height的百分比
  • 子级margin和padding的上下左右百分比都为包含块width的来计算

二、emrem

  • 1em相当于父级的font-size大小
  • rem,r表示root,1rem相对于根元素(html标签)的font-size大小

你以为你理解了,其实并不,耐心看下面的例子,看看自己心算对不对:

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
		html {
		  font-size: 10px;
		}

        div {
            font-size: 40px;
            width: 10em;
            /* 400px */
            height: 10em;
            outline: solid 1px black;
            margin: 10px;
        }

        p {
            font-size: 0.5em;
            /* 20px */
            width: 10em;
            /* 200px */
            height: 10em;
            outline: solid 1px red;
        }

        span {
            font-size: 5px;
            width: 10em;
            height: 10em;
            outline: solid 1px blue;
            display: block;
        }
    </style>
</head>

<body>
    <div>
        我是父元素div
        <p>
            我是子元素p
            <span>我是孙元素span</span>
        </p>
    </div>
</body>

</html>

然后再改成rem试试。

三、vwvh

  • 1vw,浏览器视口宽度的1%
  • 1vh,浏览器视口高度的1%

所以,内嵌的盒子就不应该使用这俩单位。

四、vminvmax

【H5移动端】关于前端H5移动端的单位适配


写一个三角符号

/*记忆口诀:盒子宽高均为零,三面边框皆透明。 */
div:after{
    position: absolute;
    width: 0px;
    height: 0px;
    content: " ";
    border-right: 100px solid transparent;
    border-top: 100px solid #ff0;
    border-left: 100px solid transparent;
    border-bottom: 100px solid transparent;
}

不用伪元素也行。

也可以用css3的clip-path去绘制,有空可以去学学


伪类和伪元素

参考:http://t.csdn.cn/keASZ

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值