SQL 查询能使用事务嘛?合适嘛?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 查询能使用事务嘛?合适嘛?相关的知识,希望对你有一定的参考价值。

如果只有一个单独的查询肯定不需要使用事务.
可是在多句SQL命令一起发出的时候 插入更新需要事务时候 查询也必须加上事务

比如
事务开始
插入表A一个字段B (主键 int 标识 自动增)
然后查询出 这个表A的 字段B的值
插入附属表E 关联字段C (int )

结束事务

这样可行嘛?关键对数据库影响大嘛
顺便问下 事务 他存放在SQL里是执行语句还是执行结果?

事务,就是要么全部执行,要么全部不执行。

事务开始

插入表A一个字段B (主键 int 标识 自动增)

<-- 假如这里意外发生了,那么 最终 A 表不会多一条数据。

然后查询出 这个表A的 字段B的值

插入附属表E 关联字段C (int )

<-- 假如这里意外发生了,那么 最终 A 表 E 表 不会多数据。

结束事务

<-- 假如这里意外发生了,那么 最终 A 表 E 表,还是有数据的。

==================================================

对于 Oracle 数据库来说:

事务开始
插入表A一个字段B (主键 int 标识 自动增)

-- 这个时候,只有你,能查询到你刚才新增的那条记录。
-- 你新增的,未提交的数据,其他人是看不到的。

然后查询出 这个表A的 字段B的值

插入附属表E 关联字段C (int )

-- 这个时候,未提交, 你新增的 表A与表E的数据,只有你这个会话能看到
-- 别人看不到。

结束事务

-- 事务提交以后,别人
SELECT * FROM A
SELECT * FROM E
能够看到你刚才插入的数据了。

============================
还是Oracle

事务是通过 一种叫 undo 的机制来处理的。

比如
事务开始
插入表A一个字段B (主键 int 标识 自动增)

-- 将数据写入到 表A的存储区域
-- 同时记录 undo 信息, 就是针对你的 INSERT INTO A ... 的SQL
-- undo 的 SQL 是 DELETE FROM A WHERE B=...

然后查询出 这个表A的 字段B的值

插入附属表E 关联字段C (int )

-- 将数据写入到 表E的存储区域
-- 同时记录 undo 信息, 就是针对你的 INSERT INTO E ... 的SQL
-- undo 的 SQL 是 DELETE FROM E WHERE C=...

-- 假如这个时候,服务器重新启动了
-- 那么下次服务器启动的时候,将把没有提交的事务 undo掉
-- 也就是执行前面的
-- DELETE FROM A WHERE B=...
-- DELETE FROM E WHERE C=...

结束事务

-- 这个时候,提交事务了,也就是 Commit 了。
-- 将 SCN ( System Change Number)递增
-- 通过将 SCN 递增,使得 别的用户,可以访问到你新增加的数据。
-- 前面所使用的 undo 空间,将腾出来,给别的用户使用。
参考技术A 事务的好处在于,当你需要对多个表进行相关性操作时,使用BeginTrans()开启事务,然后操作。

如果中间哪个表更新出错了,或者数据有问题,你可以用RollBack()方法在取消之前的相关性操作,如果没有错,那就使用Commit()方法提交你的修改。

另外,在这个过程中,所有你改动的内容只对你自己有效,别人不能知道你改了什么,也不能对你正在改的表做修改,直到你提交之后,别人才能修改这些表,检索出你修改过的内容。
参考技术B 使用事务是一个非常好的保护程序安全的方式,该方法对数据库基本不产生影响,在提交事务之前sql语句是不执行的,提交事务之后则全部执行,如果碰到停电等特殊事故,只执行一条sql的时候,则这条sql仍是不执行的。 参考技术C 可以用 TOP 或者 子查询 或 union本回答被提问者采纳

这几种经典 CSS 布局问题你都能解决嘛?


一、让一个元素水平垂直居中,到底有多少种方案?

水平居中

  • 对于 行内元素: text-align: center;

  • 对于确定宽度的块级元素:

  1. width和margin实现。margin: 0 auto;

  2. 绝对定位和margin-left: -width/2, 前提是父元素position: relative

  • 对于宽度未知的块级元素

  1. table标签配合margin左右auto实现水平居中。使用table标签(或直接将块级元素设值为display:table),再通过给该标签添加左右margin为auto。

  2. inline-block实现水平居中方法。display:inline-block和text-align:center实现水平居中。

  3. 绝对定位+transform,translateX可以移动本身元素的50%。

  4. flex布局使用justify-content:center

垂直居中

  1. 利用 line-height实现居中,这种方法适合纯文字类

  2. 通过设置父容器 相对定位,子级设置 绝对定位,标签通过margin实现自适应居中

  3. 弹性布局 flex:父级设置display: flex; 子级设置margin为auto实现自适应居中

  4. 父级设置相对定位,子级设置绝对定位,并且通过位移 transform实现

  5. table布局,父级通过转换成表格形式,然后子级设置 vertical-align实现。(需要注意的是:vertical-align: middle使用的前提条件是内联元素以及display值为table-cell的元素)。

二、浮动布局的优点?有什么缺点?清除浮动有哪些方式?

浮动布局简介:当元素浮动以后可以向左或向右移动,直到它的外边缘碰到包含它的框或者另外一个浮动元素的边框为止。元素浮动以后会脱离正常的文档流,所以文档的普通流中的框就变现的好像浮动元素不存在一样。

优点

这样做的优点就是在图文混排的时候可以很好的使文字环绕在图片周围。另外当元素浮动了起来之后,它有着块级元素的一些性质例如可以设置宽高等,但它与inline-block还是有一些区别的,第一个就是关于横向排序的时候,float可以设置方向而inline-block方向是固定的;还有一个就是inline-block在使用时有时会有空白间隙的问题

缺点

最明显的缺点就是浮动元素一旦脱离了文档流,就无法撑起父元素,会造成父级元素的高度塌陷。

清除浮动的方式

  1. 添加额外标签

 
   
   
 
  1. <div class="parent">

  2. //添加额外标签并且添加clear属性

  3. <div style="clear:both"></div>

  4. //也可以加一个br标签

  5. </div>

  1. 父级添加overflow属性,或者设置高度

 
   
   
 
  1. <div class="parent" style="overflow:hidden">//auto 也可以

  2. //将父元素的overflow设置为hidden

  3. <div class="f"></div>

  4. </div>

  1. 建立伪类选择器清除浮动(推荐)

 
   
   
 
  1. //在css中添加:after伪元素

  2. .parent:after{

  3. /* 设置添加子元素的内容是空 */

  4. content: '';

  5. /* 设置添加子元素为块级元素 */

  6. display: block;

  7. /* 设置添加的子元素的高度0 */

  8. height: 0;

  9. /* 设置添加子元素看不见 */

  10. visibility: hidden;

  11. /* 设置clear:both */

  12. clear: both;

  13. }

  14. <div class="parent">

  15. <div class="f"></div>

  16. </div>

三、 使用display:inline-block会产生什么问题?解决方法?

问题复现

问题: 两个display:inline-block元素放到一起会产生一段空白。

如代码:

 
   
   
 
  1. <!DOCTYPE html>

  2. <html lang="en">

  3. <head>

  4. <meta charset="UTF-8">

  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">

  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">

  7. <title>Document</title>

  8. <style>

  9. .container {

  10. width: 800px;

  11. height: 200px;

  12. }


  13. .left {

  14. font-size: 14px;

  15. background: red;

  16. display: inline-block;

  17. width: 100px;

  18. height: 100px;

  19. }


  20. .right {

  21. font-size: 14px;

  22. background: blue;

  23. display: inline-block;

  24. width: 100px;

  25. height: 100px;

  26. }

  27. </style>

  28. </head>

  29. <body>

  30. <div class="container">

  31. <div class="left">

  32. </div>

  33. <div class="right">

  34. </div>

  35. </div>

  36. </body>

  37. </html>

效果如下:

这几种经典 CSS 布局问题你都能解决嘛?

产生空白的原因

元素被当成行内元素排版的时候,元素之间的空白符(空格、回车换行等)都会被浏览器处理,根据CSS中white-space属性的处理方式(默认是normal,合并多余空白),原来 HTML代码中的回车换行被转成一个空白符,在字体不为0的情况下,空白符占据一定宽度,所以inline-block的元素之间就出现了空隙。

解决办法

1. 将子元素标签的结束符和下一个标签的开始符写在同一行或把所有子标签写在同一行

 
   
   
 
  1. <div class="container">

  2. <div class="left">

  3. </div><div class="right">

  4. </div>

  5. </div>

2. 父元素中设置font-size: 0,在子元素上重置正确的font-size

 
   
   
 
  1. .container{

  2. width:800px;

  3. height:200px;

  4. font-size: 0;

  5. }

3. 为子元素设置float:left

 
   
   
 
  1. .left{

  2. float: left;

  3. font-size: 14px;

  4. background: red;

  5. display: inline-block;

  6. width: 100px;

  7. height: 100px;

  8. }

  9. //right是同理

四、布局题:div垂直居中,左右10px,高度始终为宽度一半

问题描述: 实现一个div垂直居中, 其距离屏幕左右两边各10px, 其高度始终是宽度的50%。同时div中有一个文字A,文字需要水平垂直居中。

思路一:利用height:0; padding-bottom: 50%;

 
   
   
 
  1. <!DOCTYPE html>

  2. <html lang="en">

  3. <head>

  4. <meta charset="UTF-8">

  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">

  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">

  7. <title>Document</title>

  8. <style>

  9. *{

  10. margin: 0;

  11. padding: 0;

  12. }

  13. html, body {

  14. height: 100%;

  15. width: 100%;

  16. }

  17. .outer_wrapper {

  18. margin: 0 10px;

  19. height: 100%;

  20. /* flex布局让块垂直居中 */

  21. display: flex;

  22. align-items: center;

  23. }

  24. .inner_wrapper{

  25. background: red;

  26. position: relative;

  27. width: 100%;

  28. height: 0;

  29. padding-bottom: 50%;

  30. }

  31. .box{

  32. position: absolute;

  33. width: 100%;

  34. height: 100%;

  35. display: flex;

  36. justify-content: center;

  37. align-items: center;

  38. font-size: 20px;

  39. }

  40. </style>

  41. </head>

  42. <body>

  43. <div class="outer_wrapper">

  44. <div class="inner_wrapper">

  45. <div class="box">A</div>

  46. </div>

  47. </div>

  48. </body>

  49. </html>

强调两点:

  1. padding-bottom究竟是相对于谁的?

答案是相对于 父元素的width

那么对于这个outwrapper的用意就很好理解了。CSS呈流式布局,div默认宽度填满,即100%大小,给outwrapper设置margin: 0 10px;相当于让左右分别减少了10px。

  1. 父元素相对定位,那绝对定位下的子元素宽高若设为百分比,是相对谁而言的?

相对于父元素的(content + padding)值, 注意不含border

延伸:如果子元素不是绝对定位,那宽高设为百分比是相对于父元素的宽高,标准盒模型下是content, IE盒模型是content+padding+border。

思路二: 利用calc和vw

 
   
   
 
  1. <!DOCTYPE html>

  2. <html lang="en">

  3. <head>

  4. <meta charset="UTF-8">

  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">

  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">

  7. <title>Document</title>

  8. <style>

  9. * {

  10. padding: 0;

  11. margin: 0;

  12. }


  13. html,

  14. body {

  15. width: 100%;

  16. height: 100%;

  17. }


  18. .wrapper {

  19. position: relative;

  20. width: 100%;

  21. height: 100%;

  22. }


  23. .box {

  24. margin-left: 10px;

  25. /* vw是视口的宽度, 1vw代表1%的视口宽度 */

  26. width: calc(100vw - 20px);

  27. /* 宽度的一半 */

  28. height: calc(50vw - 10px);

  29. position: absolute;

  30. background: red;

  31. /* 下面两行让块垂直居中 */

  32. top: 50%;

  33. transform: translateY(-50%);

  34. display: flex;

  35. align-items: center;

  36. justify-content: center;

  37. font-size: 20px;

  38. }

  39. </style>

  40. </head>

  41. <body>

  42. <div class="wrapper">

  43. <div class="box">A</div>

  44. </div>

  45. </body>

  46. </html>

效果如下:

这几种经典 CSS 布局问题你都能解决嘛?

五、CSS如何进行品字布局?

第一种

 
   
   
 
  1. <!doctype html>

  2. <html>


  3. <head>

  4. <meta charset="utf-8">

  5. <title>品字布局</title>

  6. <style>

  7. * {

  8. margin: 0;

  9. padding: 0;

  10. }

  11. body {

  12. overflow: hidden;

  13. }

  14. div {

  15. margin: auto 0;

  16. width: 100px;

  17. height: 100px;

  18. background: red;

  19. font-size: 40px;

  20. line-height: 100px;

  21. color: #fff;

  22. text-align: center;

  23. }


  24. .div1 {

  25. margin: 100px auto 0;

  26. }


  27. .div2 {

  28. margin-left: 50%;

  29. background: green;

  30. float: left;

  31. transform: translateX(-100%);

  32. }


  33. .div3 {

  34. background: blue;

  35. float: left;

  36. transform: translateX(-100%);

  37. }

  38. </style>

  39. </head>


  40. <body>

  41. <div class="div1">1</div>

  42. <div class="div2">2</div>

  43. <div class="div3">3</div>

  44. </body>


  45. </html>

效果:

这几种经典 CSS 布局问题你都能解决嘛?

第二种(全屏版)

 
   
   
 
  1. <!doctype html>

  2. <html>

  3. <head>

  4. <meta charset="utf-8">

  5. <title>品字布局</title>

  6. <style>

  7. * {

  8. margin: 0;

  9. padding: 0;

  10. }


  11. div {

  12. width: 100%;

  13. height: 100px;

  14. background: red;

  15. font-size: 40px;

  16. line-height: 100px;

  17. color: #fff;

  18. text-align: center;

  19. }


  20. .div1 {

  21. margin: 0 auto 0;

  22. }


  23. .div2 {

  24. background: green;

  25. float: left;

  26. width: 50%;

  27. }


  28. .div3 {

  29. background: blue;

  30. float: left;

  31. width: 50%;

  32. }

  33. </style>

  34. </head>


  35. <body>

  36. <div class="div1">1</div>

  37. <div class="div2">2</div>

  38. <div class="div3">3</div>

  39. </body>

  40. </html>

效果:

这几种经典 CSS 布局问题你都能解决嘛?

六、CSS如何进行圣杯布局

圣杯布局如图:

这几种经典 CSS 布局问题你都能解决嘛?

而且要做到左右宽度固定,中间宽度自适应。

1.利用flex布局

 
   
   
 
  1. <!DOCTYPE html>

  2. <html lang="en">

  3. <head>

  4. <meta charset="UTF-8">

  5. <title>Document</title>

  6. <style>

  7. *{

  8. margin: 0;

  9. padding: 0;

  10. }

  11. .header,.footer{

  12. height:40px;

  13. width:100%;

  14. background:red;

  15. }

  16. .container{

  17. display: flex;

  18. }

  19. .middle{

  20. flex: 1;

  21. background:yellow;

  22. }

  23. .left{

  24. width:200px;

  25. background:pink;

  26. }

  27. .right{

  28. background: aqua;

  29. width:300px;

  30. }

  31. </style>

  32. </head>

  33. <body>

  34. <div class="header">这里是头部</div>

  35. <div class="container">

  36. <div class="left">左边</div>

  37. <div class="middle">中间部分</div>

  38. <div class="right">右边</div>

  39. </div>

  40. <div class="footer">这里是底部</div>

  41. </body>

  42. </html>

2.float布局(全部float:left)

 
   
   
 
  1. <!DOCTYPE html>

  2. <html lang="en">


  3. <head>

  4. <meta charset="UTF-8">

  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">

  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">

  7. <title>Document</title>

  8. <style>

  9. *{

  10. margin: 0;

  11. padding: 0;

  12. }

  13. .header,

  14. .footer {

  15. height: 40px;

  16. width: 100%;

  17. background: red;

  18. }


  19. .footer {

  20. clear: both;

  21. }


  22. .container {

  23. padding-left: 200px;

  24. padding-right: 250px;

  25. }


  26. .container div {

  27. position: relative;

  28. float: left;

  29. }


  30. .middle {

  31. width: 100%;

  32. background: yellow;

  33. }


  34. .left {

  35. width: 200px;

  36. background: pink;

  37. margin-left: -100%;

  38. left: -200px;

  39. }


  40. .right {

  41. width: 250px;

  42. background: aqua;

  43. margin-left: -250px;

  44. left: 250px;

  45. }

  46. </style>

  47. </head>


  48. <body>

  49. <div class="header">这里是头部</div>

  50. <div class="container">

  51. <div class="middle">中间部分</div>

  52. <div class="left">左边</div>

  53. <div class="right">右边</div>

  54. </div>

  55. <div class="footer">这里是底部</div>

  56. </body>


  57. </html>

这种float布局是最难理解的,主要是浮动后的负margin操作,这里重点强调一下。

设置负margin和left值之前是这样子:

这几种经典 CSS 布局问题你都能解决嘛?

左边的盒子设置margin-left: -100%是将盒子拉上去,效果:

 
   
   
 
  1. .left{

  2. /* ... */

  3. margin-left: -100%;

  4. }

这几种经典 CSS 布局问题你都能解决嘛?

然后向左移动200px来填充空下来的padding-left部分

 
   
   
 
  1. .left{

  2. /* ... */

  3. margin-left: -100%;

  4. left: -200px;

  5. }

效果呈现:

这几种经典 CSS 布局问题你都能解决嘛?

右边的盒子设置margin-left: -250px后,盒子在该行所占空间为0,因此直接到上面的middle块中,效果:

 
   
   
 
  1. .right{

  2. /* ... */

  3. margin-left: -250px;

  4. }

这几种经典 CSS 布局问题你都能解决嘛?

然后向右移动250px, 填充父容器的padding-right部分:

 
   
   
 
  1. .right{

  2. /* ... */

  3. margin-left: -250px;

  4. left: 250px;

  5. }

现在就达到最后的效果了:

这几种经典 CSS 布局问题你都能解决嘛?

3.float布局(左边float: left, 右边float: right)

 
   
   
 
  1. <!DOCTYPE html>

  2. <html lang="en">


  3. <head>

  4. <meta charset="UTF-8">

  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">

  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">

  7. <title>Document</title>

  8. <style>

  9. *{

  10. margin: 0;

  11. padding: 0;

  12. }

  13. .header,

  14. .footer {

  15. height: 40px;

  16. width: 100%;

  17. background: red;

  18. }

  19. .container{

  20. overflow: hidden;

  21. }


  22. .middle {

  23. background: yellow;

  24. }


  25. .left {

  26. float: left;

  27. width: 200px;

  28. background: pink;

  29. }


  30. .right {

  31. float: right;

  32. width: 250px;

  33. background: aqua;

  34. }

  35. </style>

  36. </head>


  37. <body>

  38. <div class="header">这里是头部</div>

  39. <div class="container">

  40. <div class="left">左边</div>

  41. <div class="right">右边</div>

  42. <div class="middle">中间部分</div>

  43. </div>

  44. <div class="footer">这里是底部</div>

  45. </body>


  46. </html>

4. 绝对定位

 
   
   
 
  1. <!DOCTYPE html>

  2. <html lang="en">


  3. <head>

  4. <meta charset="UTF-8">

  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">

  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">

  7. <title>Document</title>

  8. <style>

  9. *{

  10. margin: 0;

  11. padding: 0;

  12. }

  13. .header,

  14. .footer {

  15. height: 40px;

  16. width: 100%;

  17. background: red;

  18. }

  19. .container{

  20. min-height: 1.2em;

  21. position: relative;

  22. }


  23. .container>div {

  24. position: absolute;

  25. }


  26. .middle {

  27. left: 200px;

  28. right: 250px;

  29. background: yellow;

  30. }


  31. .left {

  32. left: 0;

  33. width: 200px;

  34. background: pink;

  35. }


  36. .right {

  37. right: 0;

  38. width: 250px;

  39. background: aqua;

  40. }

  41. </style>

  42. </head>


  43. <body>

  44. <div class="header">这里是头部</div>

  45. <div class="container">

  46. <div class="left">左边</div>

  47. <div class="right">右边</div>

  48. <div class="middle">中间部分</div>

  49. </div>

  50. <div class="footer">这里是底部</div>

  51. </body>


  52. </html>

5.grid布局

 
   
   
 
  1. <!DOCTYPE html>

  2. <html lang="en">


  3. <head>

  4. <meta charset="UTF-8">

  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">

  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">

  7. <title>Document</title>

  8. <style>

  9. body{

  10. display: grid;

  11. }

  12. #header{

  13. background: red;

  14. grid-row:1;

  15. grid-column:1/5;

  16. }


  17. #left{

  18. grid-row:2;

  19. grid-column:1/2;

  20. background: orange;

  21. }

  22. #right{

  23. grid-row:2;

  24. grid-column:4/5;

  25. background: cadetblue;

  26. }

  27. #middle{

  28. grid-row:2;

  29. grid-column:2/4;

  30. background: rebeccapurple

  31. }

  32. #footer{

  33. background: gold;

  34. grid-row:3;

  35. grid-column:1/5;

  36. }

  37. </style>

  38. </head>


  39. <body>

  40. <div id="header">header</div>

  41. <div id="left">left</div>

  42. <div id="middle">middle</div>

  43. <div id="right">right</div>

  44. <div id="footer">footer</footer></div>


  45. </body>


  46. </html>

看看grid布局,其实也挺简单的吧,里面的参数应该不言而喻了。

另外说一点,到2019年为止,grid现在绝大多数浏览器已经可以兼容了,可以着手使用了。

这几种经典 CSS 布局问题你都能解决嘛?

当然,还有table布局,年代比较久远了,而且对SEO不友好,知道就可以,这里就不浪费篇幅了。

七、CSS如何实现双飞翼布局?

这几种经典 CSS 布局问题你都能解决嘛?

有了圣杯布局的铺垫,双飞翼布局也就问题不大啦。这里采用经典的float布局来完成。

 
   
   
 
  1. <!DOCTYPE html>

  2. <html lang="en">


  3. <head>

  4. <meta charset="UTF-8">

  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">

  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">

  7. <title>Document</title>

  8. <style>

  9. *{

  10. margin: 0;

  11. padding: 0;

  12. }

  13. .container {

  14. min-width: 600px;

  15. }

  16. .left {

  17. float: left;

  18. width: 200px;

  19. height: 400px;

  20. background: red;

  21. margin-left: -100%;

  22. }

  23. .center {

  24. float: left;

  25. width: 100%;

  26. height: 500px;

  27. background: yellow;

  28. }

  29. .center .inner {

  30. margin: 0 200px;

  31. }

  32. .right {

  33. float: left;

  34. width: 200px;

  35. height: 400px;

  36. background: blue;

  37. margin-left: -200px;

  38. }

  39. </style>

  40. </head>


  41. <body>

  42. <article class="container">

  43. <div class="center">

  44. <div class="inner">双飞翼布局</div>

  45. </div>

  46. <div class="left"></div>

  47. <div class="right"></div>

  48. </article>

  49. </body>


  50. </html>

八、什么是BFC?什么条件下会触发?渲染规则?应用场景有哪些?

1.什么是BFC?

W3C对BFC的定义如下:浮动元素和绝对定位元素,非块级盒子的块级容器(例如 inline-blocks, table-cells, 和 table-captions),以及overflow值不为"visiable"的块级盒子,都会为他们的内容创建新的BFC(Block Fromatting Context, 即块级格式上下文)。

2.触发条件

一个HTML元素要创建BFC,则满足下列的任意一个或多个条件即可:下列方式会创建块格式化上下文:

  • 根元素()

  • 浮动元素(元素的 float 不是 none)

  • 绝对定位元素(元素的 position 为 absolute 或 fixed)

  • 行内块元素(元素的 display 为 inline-block)

  • 表格单元格(元素的 display为 table-cell,HTML表格单元格默认为该值)

  • 表格标题(元素的 display 为 table-caption,HTML表格标题默认为该值)

  • 匿名表格单元格元素(元素的 display为 table、table-row、 table-row-group、table-header-group、table-footer-group(分别是HTML table、row、tbody、thead、tfoot的默认属性)或 inline-table)

  • overflow 值不为 visible 的块元素 -弹性元素(display为 flex 或 inline-flex元素的直接子元素)

  • 网格元素(display为 grid 或 inline-grid 元素的直接子元素) 等等。

3.BFC渲染规则

(1)BFC垂直方向边距重叠

(2)BFC的区域不会与浮动元素的box重叠

(3)BFC是一个独立的容器,外面的元素不会影响里面的元素

(4)计算BFC高度的时候浮动元素也会参与计算

4.应用场景

1. 防止浮动导致父元素高度塌陷

现有如下页面代码:

 
   
   
 
  1. <!DOCTYPE html>

  2. <html lang="en">

  3. <head>

  4. <meta charset="UTF-8">

  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">

  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">

  7. <title>Document</title>

  8. <style>

  9. .container {

  10. border: 10px solid red;

  11. }

  12. .inner {

  13. background: #08BDEB;

  14. height: 100px;

  15. width: 100px;

  16. }

  17. </style>

  18. </head>

  19. <body>

  20. <div class="container">

  21. <div class="inner"></div>

  22. </div>

  23. </body>

  24. </html>

这几种经典 CSS 布局问题你都能解决嘛?接下来将inner元素设为浮动:

 
   
   
 
  1. .inner {

  2. float: left;

  3. background: #08BDEB;

  4. height: 100px;

  5. width: 100px;

  6. }

会产生这样的塌陷效果:

这几种经典 CSS 布局问题你都能解决嘛?

但如果我们对父元素设置BFC后, 这样的问题就解决了:

 
   
   
 
  1. .container {

  2. border: 10px solid red;

  3. overflow: hidden;

  4. }

同时这也是清除浮动的一种方式。

2. 避免外边距折叠

两个块同一个BFC会造成外边距折叠,但如果对这两个块分别设置BFC,那么边距重叠的问题就不存在了。

现有代码如下:

 
   
   
 
  1. <!DOCTYPE html>

  2. <html lang="en">


  3. <head>

  4. <meta charset="UTF-8">

  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">

  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">

  7. <title>Document</title>

  8. <style>

  9. .container {

  10. background-color: green;

  11. overflow: hidden;

  12. }


  13. .inner {

  14. background-color: lightblue;

  15. margin: 10px 0;

  16. }

  17. </style>

  18. </head>


  19. <body>

  20. <div class="container">

  21. <div class="inner">1</div>

  22. <div class="inner">2</div>

  23. <div class="inner">3</div>

  24. </div>

  25. </body>


  26. </html>

这几种经典 CSS 布局问题你都能解决嘛?

此时三个元素的上下间隔都是10px, 因为三个元素同属于一个BFC。现在我们做如下操作:

 
   
   
 
  1. <div class="container">

  2. <div class="inner">1</div>

  3. <div class="bfc">

  4. <div class="inner">2</div>

  5. </div>

  6. <div class="inner">3</div>

  7. </div>

style增加:

 
   
   
 
  1. .bfc{

  2. overflow: hidden;

  3. }

效果如下:

这几种经典 CSS 布局问题你都能解决嘛?可以明显地看到间隔变大了,而且是原来的两倍,符合我们的预期。

关于CSS布局问题,先分享到这里,后续会不断地补充,希望对你有所启发。如果对你有帮助的话,别忘了帮忙点个赞哦。

- END -


长按二维码关注,漫漫前端路,结伴同行


来自恺哥的推荐阅读



我就知道你在看!

以上是关于SQL 查询能使用事务嘛?合适嘛?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA面试题之三—Mysql索引了解嘛?怎么优化查询效率?

SQL 查询语句×45

sql 中的查询语句

oracle重建数据字典会影响业务嘛

Mysql explain

从零开始写简易读写分离,不难嘛!