CSS隐藏元素、BFC、元素居中、布局

news2024/11/14 13:45:14

1、css中有哪些方式可以隐藏页面元素?区别是什么?

1.1 display:none

元素在页面上将彻底消失,元素本身占有的空间会被其他元素占有,导致浏览器的重排和重绘。

特点:元素不可见,不占据空间,不会触发点击事件。

1.2 visibility:hidden

元素会隐藏,DOM结果仍然存在,只是一个不可见的状态。不会触发重排,会触发重绘。

特点:元素不可见,占据页面空间,无法响应点击事件。

1.3 opacity:0

设置元素的透明度为0.不会触发重排,一般情况下会触发重绘。(如果利用animation动画,对opacity做变化【animation会默认触发GPU加速】,则只会触发GPU层面的composite,不会触发重绘。

特点:改变元素透明度,元素不可见,占据页面空间,可以响应点击事件。

1.4 设置height与width属性为0

将元素的marign、border、padding、height和width等影响元素盒模型的属性设置为0,如果元素内有子元素或内容,还应该设置其overflow:hidden来隐藏其子元素。

特点:元素不可见,不占据页面空间,无法响应点击事件。

1.5 position:absolute将元素移出可见区域

.hide{
    position:absolute; 
    top:-9999px; 
    left:-9999px;
}

特点:元素不可见,不影响页面布局。

1.6 clip-path:通过裁剪的方式

.hide{ 
    clip-path:polygon(0px 0px,0px 0px,0px 0px,0px 0px)
}

特点:元素不可见,占据页面空间,无法响应点击事件。

display:none

visibility:hidden

opacity:0

页面中

不存在

存在

存在

重排

不会

不会

重绘

不一定

自身绑定事件

不会触发

不会触发

可触发

transition

不支持

支持

支持

子元素可复原

不能

不能

被遮挡的元素可触发事件

不能

2、BFC(Block Formatting Context)

(1)定义和渲染规则

块级格式化上下文,是页面中的一块渲染区域,并且有一套属于自己的渲染规则(6个):

  • 内部的盒子在垂直方向上会一个接一个排列。

  • 同一个BFC上相邻两个盒子的margin会发生重叠,与方向无关。

  • 每个元素的左外边距和包含块的左边界相接触(从左到右),即使浮动元素也是如此。

  • BFC的区域不会与float元素区域发生重叠

  • 计算BFC的高度时,浮动子元素也参与计算。

  • BFC是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然。

(2)触发条件

  • 根元素,即HTML

  • 浮动元素,即float值为left或right

  • overflow值不为visible,为auto、scroll、hidden

  • display的值为inline-block、inltable-cell、table-caption、table、inline-table、flex、inline-flex、grid、inline-grid

  • position的值为absolute或fixed

(3)应用场景

防止内部坍塌、清除内部浮动、自适应多栏布局

防止margin重叠(塌陷):在同一级的一个中加div块

清除内部浮动:(父元素添加overflow:hidden样式)

.par {
  border: 5px solid #fcc;
  width: 300px;
}
.child {
  border: 5px solid #f66;
  width: 100px;
  height: 100px;
  float: left;
}
<div class="par">
      <div class="child" />
      <div class="child" />
</div>

而BFC在计算高度时,浮动元素也会参与,可以触发.par元素才能BFC,则内部浮动元素计算高度时也会计算:

.par{
    overflow:hidden;
}

自适应多栏布局

例如:两栏布局:

.outter {
  width: 300px;
  position: relative;
}
.aside {
  width: 100px;
  height: 150px;
  float: left;
  background: #f66;
}
.main {
  height: 200px;
  background: #fcc;
}

<div class="outter">
      <div class="aside" />
      <div class="main" />
</div>

每个元素的左外边距与包含块的左边界相接触。因此,虽然.aside为浮动元素,但是.main的左边依然会与包含块的左边相接触。而BFC的区域不会与浮动盒子重叠,可以通过触发main生成BFC,以此适应两栏布局。

.main{
    overflow:hidden;
}

3、元素居中的实现方式

(1)定位+marign:auto(不需要知道自身元素的宽高)

父级元素设置为相对定位,子级元素设置为绝对定位、定位属性值设置为0以及margin:auto

/* 水平垂直居中 */
.father {
  width: 200px;
  height: 200px;
  background: skyblue;
  position: relative;
  /* relative元素相对于其正常位置进行定位。 */
}
.son {
  width: 100px;
  height: 100px;
  background: red;
  position: absolute;
  /* absolute相对于最近的定位祖先元素进行定位 */
  margin: auto;
  /* 水平垂直都居中 */
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
}

<div class="father">
   <div class="son" />
</div>

(2)定位+margin:负值(不要求知道父元素宽高,但需要知道子元素自身的宽高,负值为子元素宽度的一半)

父元素设置为相对定位,子元素设置绝对定位,移动自身50%实现水平垂直居中。

/* 水平垂直居中 */
.father {
  width: 200px;
  height: 200px;
  background: skyblue;
  position: relative;
  /* relative元素相对于其正常位置进行定位。 */
}
.son {
  width: 120px;
  height: 120px;
  background: red;
  position: absolute;
  left: 50%;
  top: 50%;
  margin-left: -60px;
  margin-top: -60px;
}

初始位置为方块1的位置;当设置left、top为50%的时候,内部子元素为方块2的位置;设置margin为负数时,内部子元素即到方块3的位置,即中间位置。

这种方案不要求父元素的高度,即使父元素的高度变化了,仍然可以保持在父元素的垂直居中位置,水平方向上同理。

(3)定位+transform(不需要知道自身元素的宽高)

父元素设置为相对定位,子元素绝对定位且transform:translate(-50%,-50%)将元素位移自己宽高的-50%,等价于margin-left:-50px; margin-top:-50px;(-50px为自身元素的宽高一半)

/* 水平垂直居中 */
.father {
  width: 300px;
  height: 300px;
  background: skyblue;
  position: relative;
  /* relative元素相对于其正常位置进行定位。 */
}
.son {
  width: 120px;
  height: 120px;
  background: red;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}
transform属性向元素应用2D或3D转换。该属性允许我们对元素进行旋转、缩放、移动或倾斜。

(4)table布局

设置父元素display:table-cell、vertical-align:middle、text-align:center,子元素设置为display:inline-block

/* 水平垂直居中 */
.father {
  width: 300px;
  height: 300px;
  background: skyblue;
  display: table-cell;
  /* 让标签元素以表格单元格的形式呈现,使元素类似于td标签。 */
  vertical-align: middle;
  text-align: center;
}
.son {
  width: 120px;
  height: 120px;
  background: red;
  display: inline-block;
}

(5)flex弹性布局(不需要知道自身元素的宽高)

父元素设置为display:flex; justify-content:center(垂直居中); align-items:center(水平居中);

/* 水平垂直居中 */
.father {
  width: 200px;
  height: 200px;
  background: skyblue;
  display: flex;
  /* 水平居中 */
  justify-content: center;
  /* 垂直居中(定义在交叉轴上如何对齐) */
  align-items: center;
}
.son {
  width: 100px;
  height: 100px;
  background: red;
}

<div class="father">
      <div class="son" />
</div>

(6)grid网格布局(不需要知道自身元素的宽高)

父元素设置display:grid; justify-content:center(垂直居中); align-items:center(水平居中);

/* 水平垂直居中 */
.father {
  width: 200px;
  height: 200px;
  background: skyblue;
  display: grid;
  /* 水平居中 */
  justify-content: center;
  /* 垂直居中(定义在交叉轴上如何对齐) */
  align-items: center;
}
.son {
  width: 100px;
  height: 100px;
  background: red;
}
<div class="father">
    <div class="son" />
</div>

总结:内联元素居中布局、块级元素居中布局

内联元素:

水平居中:

  • 行内元素可设置:text-align:center;

  • flex布局设置父元素display:flex; justify-content:center;

垂直居中:

  • 单行文本父元素确认高度:height===line-height

  • 多行文本父元素确认高度:display:table-cell; vertical-align:middle

块级元素:

水平居中:

定宽:marign:0 auto; 绝对定位+left:50%+margin:负自身一半

垂直居中:

position:absolute设置left、top、margin-left、margin-top(定高)

display:table-cell;

transform:translate(x,y)

flex(不定高、不定宽)

grid(不定高、不定宽),兼容性相对较差

4、如何实现两栏布局,右侧自适应?三栏布局中间自适应呢?

(1)两栏布局

适用于内容上具有明显主次关系的网页,如左侧定宽右侧自适应

实现思路:

  • 使用float左浮左边栏;右边模块使用margin-left撑出内容块做内容展示;为父级元素添加BFC,防止下方元素飞到上方内容。

.box{ 
    overflow:hidden; 
}   
.left{ 
    float:left; 
    width:200px; 
    background-color:gray; 
    height:400px;
}   
.right{
    margin-left:210px; 
    height:200px;
    background-coloe:lightgray;
}
  • 使用flex弹性布局

.box{ 
    display:flex;
} 
.left{
    width:100px;
} 
.right{
    flex:1
}

注意flex容器的一个默认属性值:align-items:stretch;这个属性导致列等高的效果,为了让两个盒子高度自动,需要设置align-items: flex-start;

(2)三栏布局

按照左中右的顺序进行排列,通常中间列最宽,左右两列次之。

实现三栏布局中间自适应的布局方式有:

两边使用float,中间使用margin;两边使用absolute,中间使用margin;两边使用float和负margin; display:table属性;flex实现; grid实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/383966.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试阿里自动化测试工程师被狂虐,回家猛补3个月,成功上岸字节

前言 大家好&#xff0c;我是小祖&#xff0c;个人背景&#xff1a;985中下游&#xff0c;无大厂实习&#xff08;小厂打杂&#xff09;&#xff0c;无竞赛&#xff0c;无相关论文。 毕业几年&#xff0c;表面上用过很多技术&#xff0c;但都没能深入学习&#xff0c;一年的工…

python 支付宝营销活动现金红包开发接入流程-含接口调用加签

1 创建网页/移动应用 2 配置接口加签方式 涉及到金额的需要上传证书&#xff0c;在上传页面有教程&#xff0c; 在支付宝开放平台秘钥工具中生成CSR证书&#xff0c;会自动保存应用公钥和私钥到电脑上&#xff0c;调用支付宝接口需要应用私钥进行加签 上传完CSR证书后会有三个…

互联网衰退期,测试工程师35岁的路该怎么走...

国内的互联网行业发展较快&#xff0c;所以造成了技术研发类员工工作强度比较大&#xff0c;同时技术的快速更新又需要员工不断的学习新的技术。因此淘汰率也比较高&#xff0c;超过35岁的基层研发类员工&#xff0c;往往因为家庭原因、身体原因&#xff0c;比较难以跟得上工作…

DSP_TMS320F28335_PIE学习笔记

前言 本文重点探讨DSP PIE模块的学习笔记&#xff0c;由于学这部内容的时候&#xff0c;是用28335学的&#xff0c;所以标题是用的28335&#xff0c;但其实28377D和28335的PIE使用基本上是一样的&#xff0c;也是可以借鉴的。 正文 原理 讲点原理&#xff0c;PIE&#xff0…

linux minio更改密码MINIO_ACCESS_KEY报错

minio版本RELEASE.2020-11-13T20-10-18Z启动文件配置如下cat run.sh#!/bin/bashexport MINIO_ACCESS_KEYminioexport MINIO_SECRET_KEYfasffnohup /opt/minio/minio.RELEASE.2020-11-13T20-10-18Z server http://192.168.100.x/data/minio_data http://192.168.100.x/data/mini…

Docker中对已存在运行的容器修改端口映射

一、初次创建容器&#xff0c;指定宿主机和容器端口的映射&#xff0c;如下示例&#xff1a; docker run -itd -p 11935:1935 -p 11985:1985 -p 18080:8080 -p 20903:20903 -p 18888:8888 \ --restartalways \ -v /srv/srs3/conf/:/usr/local/srs/conf/ \ -v /srv/srs3/objs/:…

Android总结汇总

一、APP1、混合开发项目AHP地址&#xff1a;https://github.com/Witnin/AHP简介&#xff1a;KotlinJava二、路由框架1、集成ARouter导航框架官网地址&#xff08;停止维护&#xff09;&#xff1a;https://github.com/alibaba/ARouter/blob/master/README_CN.mdjadepeakpoet&am…

Leedcode 1011. 在 D 天内送达包裹的能力

题目 传送带上的包裹必须在 days 天内从一个港口运送到另一个港口。 传送带上的第 i 个包裹的重量为 weights[i]。每一天&#xff0c;我们都会按给出重量&#xff08;weights&#xff09;的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。 返回能在 day…

利用DSCync进行域内权限维持

一个域环境可以拥有多台域控制器&#xff0c;每台域控制器各自存储着一份所在域的活动目录的可写副本&#xff0c;对目录的任何修改都可以从源域控制器同步到本域、域树或域林中的其他域控制器上。当一个域控想从另一个域控获取域数据更新时&#xff0c;客户端域控会向服务端域…

【Echarts图例点击事件】自定义Echarts图例legend点击事件(已解决)

目录先睹为快&#xff08;效果&#xff09;1、实现Echarts多条曲线2、点击echarts触发接口请求2.1 先默认隐藏部分数据2.2 自定义legend图例点击事件3、源码下载地址&#xff08;解压即用&#xff09;**【写在前面】**这下我又不得不说了&#xff0c;还是客户现场使用时想查询一…

宽度学习系统BLS推广到在线学习的论文阅读记录

BELS: A BROAD ENSEMBLE LEARNING SYSTEM FOR DATA STREAM CLASSIFICATION 摘要&#xff1a;这篇文章主要是将BLS推广到适用于在线学习的邻域&#xff0c;提出了其如何进行适合在线学习的增量更新&#xff0c;以及面对概念漂移的适应 所提出的算法BELS 稀疏特征映射的更新 …

【牛客网刷题记录】,后面遇到的一些问题都会在这里记录,欢迎大家批评指正

文章目录数据结构篇数组字符串链表树图堆算法篇哈希查找排序数据库篇SQL语言篇数据结构篇 数组 省流&#xff1a; 计算二维数组指定元素的位置压缩矩阵 1. 执行以下代码段(程序已包含所有必需的头文件)会输出什么结果。 char a[] "abcd", b[10] "abcd"…

被围绕的区域

题目链接 leetcode——在线链接 题目描述 给你一个 m x n 的矩阵 board &#xff0c;由若干字符 ‘X’ 和 ‘O’ &#xff0c;找到所有被 ‘X’ 围绕的区域&#xff0c;并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。 题目示例 输入&#xff1a;board [[“X”,“X”,“X”,…

德标1.4571合金元素钛的影响

1.45711.4571介绍&#xff1a;1.4571在316的基础上加入了钛&#xff0c;为解决316晶间腐蚀发展起来的钢种&#xff0c;有良好的耐晶间腐蚀性能&#xff0c;在稀H2SO4、H3PO4及有机酸和海洋大气中耐蚀性能有所提高。其它性能和316相近。◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆…

【项目实战】为什么我选择使用CloseableHttpClient,而不是HttpClient,他们俩有什么区别?

一、HttpClient介绍 HttpClient是Commons HttpClient的老版本&#xff0c;已被抛弃&#xff0c;不推荐使用&#xff1b; HttpClient是一个接口&#xff0c;定义了客户端HTTP协议的操作方法。 它可以用于发送HTTP请求和接收HTTP响应。 HttpClient接口提供了很多方法来定制请求…

RK3288-android8-IR-选不中小窗口

IR红外功能,多么基础的功能,但是说来也不简单 因为,小小的红外看似基础,实则设计太多东西了, 从关机涉及Uboot;到内核kernel键码上报;到android键码的实现,小小的功能涉及大大的范围; (101条消息) rk3288-android8-IR-mouse_旋风旋风的博客-CSDN博客 大家可以看一下我之前的…

考研复试——数据结构

文章目录数据结构什么是数据结构&#xff1f;逻辑结构和物理结构有什么区别&#xff1f;为什么对单链表设置头结点&#xff1f;算法的特点&#xff1f;常见的数据结构有哪些&#xff1f;栈在后缀表达式求值的算法思想&#xff1a;队列溢出现象&#xff1f;解决方法&#xff1f;…

【项目精选】基于Java的超级玛丽游戏的设计与实现(源码+论文+视频)

点击下载源码 超级玛丽小游戏的JAVA程序&#xff0c;进入游戏后首先按空格键开始&#xff0c;利用方向键来控制的马里奥的移动&#xff0c;同时检测马里奥与场景中的障碍物和敌人的碰撞&#xff0c;并判断马里奥的可移动性和马里奥的生命值。当马里奥通过最后一个场景后游戏结束…

项目经理如何管理好自己的时间

由于项目各种不定因素的存在&#xff0c;有时侯我们看到有些项目经理虽然成天忙得焦头烂额&#xff0c;但绩效甚微也就不足为怪了&#xff0c;如何能让宝贵的时间花在“刀刃”上&#xff0c;抓住了问题的要害&#xff0c;才能使工作事半功倍。 1、做好工作计划 项目经理比较擅…

目前已经有80多万个数据库迁移到了亚马逊云科技上

Gartner是全球最具权威的IT研究公司&#xff0c;在IT研究领域可以说是无人不知、无人不晓。它每年都会发布各种IT产业评测报告&#xff0c;分析未来技术发展&#xff0c;帮助客户进行市场分析、技术选择、投资决策。最近看到Gartner发布的云数据库魔力象限报告&#xff0c;这也…