页面布局的多种方法

淡淡的烟草味﹌ 2022-06-06 08:10 263阅读 0赞

CSS3与页面布局学习总结——页面布局的多种方法

一、负边距与浮动布局

转载:http://www.cnblogs.com/zhangyongl/p/6123522.html

1.1、负边距

所谓的负边距就是margin取负值的情况,如margin:-100px,margin:-100%。当一个元素与另一个元素margin取负值时将拉近距离。常见的功能如下:

1.1.1、向上移动

当多个元素同时从标准流中脱离开来时,如果前一个元素的宽度为100%宽度,后面的元素通过负边距可以实现上移。当负的边距超过自身的宽度将上移,只要没有超过自身宽度就不会上移,示例如下:

复制代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>负边距</title>
  6. <style type="text/css">
  7. * {
  8. margin: 0;
  9. padding: 0;
  10. }
  11. #div1 {
  12. height: 100px;
  13. background: lightblue;
  14. width: 100%;
  15. float: left;
  16. }
  17. #div2 {
  18. height: 100px;
  19. background: lightgreen;
  20. width: 30%;
  21. float: left;
  22. margin-left: -100%;
  23. }
  24. </style>
  25. </head>
  26. <body>
  27. <div id="div1">div1
  28. </div>
  29. <div id="div2">div2
  30. </div>
  31. </body>
  32. </html>

复制代码

运行效果:

1069950-20161201203044162-1630295671.png

1069950-20161201203107662-254561082.png

1069950-20161201203121990-1641866871.png

1.1.2、去除列表右边框

开发中常需要在页面中展示一些列表,如商品展示列表等,如果我们要实现如下布局:

1069950-20161201203159646-598611340.png

实现代码

复制代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>负边距</title>
  6. <style type="text/css">
  7. * {
  8. margin: 0;
  9. padding: 0;
  10. }
  11. #div1 {
  12. width: 780px;
  13. height: 380px;
  14. margin: 0 auto;
  15. border: 3px solid dodgerblue;
  16. overflow: hidden;
  17. margin-top: 10px;
  18. }
  19. .box {
  20. width: 180px;
  21. height: 180px;
  22. margin: 0 20px 20px 0;
  23. background: orangered;
  24. float: left;
  25. }
  26. #div2{
  27. margin-right: -20px;
  28. }
  29. </style>
  30. </head>
  31. <body>
  32. <div id="div1">
  33. <div id="div2">
  34. <div class="box">
  35. </div>
  36. <div class="box">
  37. </div>
  38. <div class="box">
  39. </div>
  40. <div class="box">
  41. </div>
  42. <div class="box">
  43. </div>
  44. <div class="box">
  45. </div>
  46. <div class="box">
  47. </div>
  48. <div class="box">
  49. </div>
  50. </div>
  51. </div>
  52. </body>
  53. </html>

复制代码

1069950-20161201203321818-1101418428.png

1.1.3、负边距+定位,实现水平垂直居中

1.1.4、去除列表最后一个li元素的border-bottom

代码如下:

复制代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>负边距</title>
  6. <style type="text/css">
  7. * {
  8. margin: 0;
  9. padding: 0;
  10. list-style: none;
  11. }
  12. #news {
  13. width: 200px;
  14. border: 2px solid lightblue;
  15. margin: 20px 0 0 20px;
  16. font-family: 'Heiti SC', 'Microsoft YaHei';
  17. color: brown;
  18. }
  19. #news li{
  20. height: 26px;
  21. line-height: 26px;
  22. border-bottom: 1px dashed lightblue;
  23. }
  24. .lastLi{
  25. margin-bottom:-1px ;/*意思是向上移回1px 跟框框重合了*/
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <div id="news">
  31. <ul>
  32. <li>Item A</li>
  33. <li>Item B</li>
  34. <li>Item C</li>
  35. <li>Item D</li>
  36. <li class="lastLi">Item E</li>
  37. </ul>
  38. </div>
  39. </body>
  40. </html>

复制代码

运行效果:

1069950-20161201203713115-2030967303.png

方法二:

使用CSS3中的新增加选择器,选择最后一个li,不使用类样式,好处是当li的个数不确定时更加方便。

如果li的border-bottom颜色与ul的border颜色是一样的时候,在视觉上是被隐藏了。如果其颜色不一致的时候还是有问题,给ul写个overflow:hidden;就可以解决这个问题。

练习:

要求效果:

1069950-20161201203837693-974558390.png

实现代码:

  

复制代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>负边距</title>
  6. <style type="text/css">
  7. * {
  8. margin: 0;
  9. padding: 0;
  10. }
  11. #div1 {
  12. width: 780px;
  13. margin: 0 auto;
  14. border: 3px solid dodgerblue;
  15. overflow: hidden;
  16. margin-top: 10px;
  17. }
  18. .box {
  19. width: 180px;
  20. height: 180px;
  21. margin: 0 20px 30px 0;
  22. float: left;
  23. position: relative;
  24. background: url(img/2.jpg) no-repeat;
  25. overflow: hidden;
  26. position: relative;
  27. }
  28. #div2{
  29. margin-right: -20px;
  30. }
  31. .footer
  32. {
  33. position: absolute;
  34. bottom: 0;
  35. height: 40px;
  36. line-height: 40px;
  37. transition: height 0.5s;
  38. font-family: 'Heiti SC', 'Microsoft YaHei';
  39. font-size: 14px;
  40. color: white;
  41. }
  42. .footer:hover{
  43. transition: height 0.5s;
  44. height: 60px;
  45. cursor: pointer;
  46. }
  47. .span1{
  48. width: 110px;
  49. height: 100%;
  50. background: #3c3c3c;
  51. opacity: 0.8;
  52. float: left;
  53. }
  54. .span2{
  55. width: 70px;
  56. height: 100%;
  57. float: left;
  58. background: deeppink;
  59. text-align: center;
  60. opacity: 0.8;
  61. }
  62. </style>
  63. </head>
  64. <body>
  65. <div id="div1">
  66. <div id="div2">
  67. <div class="box" >
  68. <div class="footer">
  69. <div class="span1">安踏体育运动</div>
  70. <div class="span2">$139元</div>
  71. </div>
  72. </div>
  73. <div class="box" >
  74. <div class="footer">
  75. <div class="span1">安踏体育运动</div>
  76. <div class="span2">$139元</div>
  77. </div>
  78. </div>
  79. <div class="box" >
  80. <div class="footer">
  81. <div class="span1">安踏体育运动</div>
  82. <div class="span2">$139元</div>
  83. </div>
  84. </div>
  85. <div class="box" >
  86. <div class="footer">
  87. <div class="span1">安踏体育运动</div>
  88. <div class="span2">$139元</div>
  89. </div>
  90. </div>
  91. <div class="box" >
  92. <div class="footer">
  93. <div class="span1">安踏体育运动</div>
  94. <div class="span2">$139元</div>
  95. </div>
  96. </div>
  97. <div class="box" >
  98. <div class="footer">
  99. <div class="span1">安踏体育运动</div>
  100. <div class="span2">$139元</div>
  101. </div>
  102. </div>
  103. <div class="box" >
  104. <div class="footer">
  105. <div class="span1">安踏体育运动</div>
  106. <div class="span2">$139元</div>
  107. </div>
  108. </div>
  109. <div class="box" >
  110. <div class="footer">
  111. <div class="span1">安踏体育运动</div>
  112. <div class="span2">$139元</div>
  113. </div>
  114. </div>
  115. <div class="box" >
  116. <div class="footer">
  117. <div class="span1">安踏体育运动</div>
  118. <div class="span2">$139元</div>
  119. </div>
  120. </div>
  121. <div class="box" >
  122. <div class="footer">
  123. <div class="span1">安踏体育运动</div>
  124. <div class="span2">$139元</div>
  125. </div>
  126. </div>
  127. <div class="box" >
  128. <div class="footer">
  129. <div class="span1">安踏体育运动</div>
  130. <div class="span2">$139元</div>
  131. </div>
  132. </div>
  133. <div class="box" >
  134. <div class="footer">
  135. <div class="span1">安踏体育运动</div>
  136. <div class="span2">$139元</div>
  137. </div>
  138. </div>
  139. </div>
  140. </div>
  141. </div>
  142. </body>
  143. </html>

复制代码

1.2、双飞翼布局

经典三列布局,也叫做圣杯布局【Holy Grail of Layouts】是Kevin Cornell在2006年提出的一个布局模型概念,在国内最早是由淘宝UED的工程师传播开来,在中国也有叫法是双飞翼布局,它的布局要求有几点:

1、三列布局,中间宽度自适应,两边定宽;
2、中间栏要在浏览器中优先展示渲染;
3、允许任意列的高度最高;
4、要求只用一个额外的DIV标签;
5、要求用最简单的CSS、最少的HACK语句;

在不增加额外标签的情况下,圣杯布局已经非常完美,圣杯布局使用了相对定位,以后布局是有局限性的,而且宽度控制要改的地方也多。在淘宝UED(User Experience Design)探讨下,增加多一个div就可以不用相对布局了,只用到了浮动和负边距,这就是我们所说的双飞翼布局,实现的代码如下:

复制代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>双飞翼页面布局</title>
  6. <style type="text/css">
  7. *{
  8. padding: 0;
  9. margin: 0;
  10. }
  11. body,html{
  12. height: 100%;
  13. font: 20px/40px"microsoft yahei";
  14. color: black;
  15. }
  16. #container{
  17. width: 100%;
  18. margin: 0 auto;
  19. height: 100%;
  20. }
  21. #header,#footer{
  22. height: 12.5%;
  23. width: 100%;
  24. background: deeppink;
  25. }
  26. #main{
  27. height: 75%;
  28. }
  29. #center,#left,#right{
  30. height: 100%;
  31. float: left;
  32. }
  33. #center{
  34. width: 100%;/*这里center已经占满了中间这一栏 left right都是在它的上面*/
  35. background: #1fc195;
  36. }
  37. #left{
  38. background: lightgrey;
  39. width: 15%;
  40. margin-left: -100%;/*向左偏移自己的100% 回到上一行的开头*/
  41. }
  42. #right{
  43. background: #2e6da4;
  44. width: 15%;
  45. margin-left: -15%;/*向左偏移自己本身的长度 回到了上一行的末尾*/
  46. }
  47. #main-inner{
  48. padding-left: 15%;/*回到自己的开头*/
  49. }
  50. </style>
  51. </head>
  52. <body>
  53. <div id="container">
  54. <div id="header">
  55. header
  56. </div>
  57. <div id="main">
  58. <div id="center">
  59. <div id="main-inner">
  60. center
  61. </div>
  62. </div>
  63. <div id="left">
  64. left
  65. </div>
  66. <div id="right">
  67. right
  68. </div>
  69. </div>
  70. <div id="footer">
  71. footer
  72. </div>
  73. </div>
  74. </body>
  75. </html>

复制代码

运行效果:

1069950-20161201204041771-958659656.png

1.3、多栏布局

1.3.1、栅格系统

栏栅格系统就是利用浮动实现的多栏布局,在bootstrap中用的非常多,这里以一个980像素的宽实现4列的栅格系统,示例代码如下:

复制代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>栅格系统</title>
  6. <style type="text/css">
  7. * {
  8. padding: 0;
  9. margin: 0;
  10. }
  11. html,
  12. body {
  13. height: 100%;
  14. }
  15. #container {
  16. width: 980px;
  17. margin: 0 auto;
  18. height: 10%;
  19. }
  20. #container div {
  21. height: 100%;
  22. }
  23. .col25 {
  24. width: 25%;
  25. background: lightgreen;
  26. float: left;
  27. }
  28. .col50 {
  29. width: 50%;
  30. background: lightblue;
  31. float: left;
  32. }
  33. .col75 {
  34. width: 75%;
  35. background: lightcoral;
  36. float: left;
  37. }
  38. </style>
  39. </head>
  40. <body>
  41. <div id="container">
  42. <div class="col25">
  43. A
  44. </div>
  45. <div class="col50">
  46. B
  47. </div>
  48. <div class="col25">
  49. D
  50. </div>
  51. </div>
  52. </body>
  53. </html>

复制代码

运行效果:

1069950-20161201204425677-1942493066.png

1.3.2、多列布局

栅格系统并没有真正实现分栏效果(如word中的分栏),CSS3为了满足这个要求增加了多列布局模块,如果需要实现多列布局模块先看看这几个CSS3属性:

column-count: | auto
功能:设置或检索对象的列数
适用于:除table外的非替换块级元素, table cells, inline-block元素

: 用整数值来定义列数。不允许负值
auto: 根据 <’ column-width ‘> 自定分配宽度

column-gap: | normal
功能:设置或检索对象的列与列之间的间隙
适用于:定义了多列的元素
计算值:绝对长度值或者normal

column-rule:<’ column-rule-width ‘> || <’ column-rule-style ‘> || <’ column-rule-color ‘>
功能:设置或检索对象的列与列之间的边框。与border属性类似。
适用于:定义了多列的元素

columns:<’ column-width ‘> || <’ column-count ‘>
功能:设置或检索对象的列数和每列的宽度
适用于:除table外的非替换块级元素, table cells, inline-block元素
<’ column-width ‘>: 设置或检索对象每列的宽度
<’ column-count ‘>: 设置或检索对象的列数

示例代码:

复制代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>多列布局</title>
  6. <style type="text/css">
  7. #div1{
  8. column-count: 3; /*分3栏*/
  9. column-gap: 40px; /*栏间距*/
  10. column-rule: 2px solid lightgreen; /*栏间分隔线,与border设置类似*/
  11. line-height: 26px;
  12. font-size: 14px;
  13. height: 500px;
  14. background: lightcyan;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <div id="div1">
  20. CSS即层叠样式表(Cascading StyleSheet)。 在网页制作时采用层叠样式表技术,可以有效地对页面的布局、字体、颜色、背景和其它效果实现更加精确的控制。 只要对相应的代码做一些简单的修改,就可以改变同一页面的不同部分,或者页数不同的网页的外观和格式。CSS3是CSS技术的升级版本,CSS3语言开发是朝着模块化发展的。以前的规范作为一个模块实在是太庞大而且比较复杂,所以,把它分解为一些小的模块,更多新的模块也被加入进来。这些模块包括: 盒子模型、列表模块、超链接方式 、语言模块 、背景和边框 、文字特效 、多栏布局等。CSS即层叠样式表(Cascading StyleSheet)。 在网页制作时采用层叠样式表技术,可以有效地对页面的布局、字体、颜色、背景和其它效果实现更加精确的控制。 只要对相应的代码做一些简单的修改,就可以改变同一页面的不同部分,或者页数不同的网页的外观和格式。CSS3是CSS技术的升级版本,CSS3语言开发是朝着模块化发展的。以前的规范作为一个模块实在是太庞大而且比较复杂,所以,把它分解为一些小的模块,更多新的模块也被加入进来。这些模块包括: 盒子模型、列表模块、超链接方式 、语言模块 、背景和边框 、文字特效 、多栏布局等。
  21. </div>
  22. </body>
  23. </html>

复制代码

运行效果:

1069950-20161201204559099-1454182630.png

二、弹性布局(Flexbox)

假设在项目中有一个这样的需求:同一行有3个菜单,每个菜单占1/3的宽度,怎么实现?

复制代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>flex</title>
  6. <style type="text/css">
  7. * {
  8. padding: 0;
  9. margin: 0;
  10. list-style: none;
  11. }
  12. html,
  13. body {
  14. height: 100%;
  15. }
  16. #menu {
  17. width: 980px;
  18. margin: 0 auto;
  19. display: flex; /*当前块为弹性盒*/
  20. }
  21. #menu li{
  22. flex: auto; /*弹性盒中的单项*/
  23. float: left;
  24. }
  25. #menu li a{
  26. display:block;
  27. height: 26px;
  28. line-height: 26px;
  29. border:1px solid cornflowerblue;
  30. margin-right: 2px;
  31. text-decoration: none;
  32. text-align: center;
  33. }
  34. </style>
  35. </head>
  36. <body>
  37. <ul id="menu">
  38. <li><a href="#" class="item">公司简介</a></li>
  39. <li><a href="#" class="item">商品展示</a></li>
  40. <li><a href="#" class="item">后台管理</a></li>
  41. <li><a href="#" class="item">企业文化</a></li>
  42. <li><a href="#" class="item">在线咨询</a></li>
  43. </ul>
  44. </body>
  45. </html>

复制代码

运行效果:

1069950-20161201204823881-864599738.png

三、流式布局(Fluid)

固定布局和流式布局在网页设计中最常用的两种布局方式。固定布局能呈现网页的原始设计效果,流式布局则不受窗口宽度影响,流式布局使用百分比宽度来限定布局元素,这样可以根据客户端分辨率的大小来进行合理的显示。

固定布局效果:

1069950-20161202135531615-528030479.png

用百分比来做 简单粗暴又实用。

三、瀑布流布局

瀑布流布局是流式布局的一种。是当下比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。最早采用此布局的网站是Pinterest,逐渐在国内流行开来。

3.1、演示

常见瀑布流布局网站:
鼻祖:Pinterest
通用类:豆瓣市集,花瓣网,我喜欢,读图知天下
美女图片:图丽网
时尚资讯类:看潮网
时尚购物类:蘑菇街,美丽说,人人逛街,卡当网
品牌推广类:凡客达人
家居o2o类:新巢网小猫家
微博社交类: 都爱看
搞笑图片类:道趣儿
艺术收藏类:微艺术
潮流图文分享:荷都分享网

3.2、特点

3.3、masonry实现瀑布流布局

masonry是一个响应式网格布局库(非jQuery)。(Cascading grid layout library)

如果使用CSS+JavaScript当然可以实现瀑布流布局,但相对麻烦,masonry是一个javascript插件,通过该插件可以轻松实现瀑布流布局,和CSS中float的效果不太一样的地方在 于,float先水平排列,然后再垂直排列,使用Masonry则垂直排列元素,然后将下一个元素放置到网格中的下一个开发区域。这种效果可以最小化处理 不同高度的元素在垂直方向的间隙。

官网:http://masonry.desandro.com/

源码:https://github.com/desandro/masonry

1069950-20161202135734818-1525849905.png

3.3.1、下载并引用masonry

可以去官网或github下载“masonry.pkgd.min.js”,将下载到的插件添加到项目中,并在页面中添加引用,如下所示:

  1. <script src="js/masonry/masonry.pkgd.min.js" type="text/javascript" charset="utf-8"></script>
  • masonry.pkgd.js un-minified
  • masonry.pkgd.min.js minified

CDN:

  1. <script src="https://unpkg.com/masonry-layout@4.1/dist/masonry.pkgd.js"></script>
  2. <!-- or -->
  3. <script src="https://unpkg.com/masonry-layout@4.1/dist/masonry.pkgd.min.js"></script>

3.3.2、初始化插件

使用jQuery:

  1. $('.grid').masonry({
  2. // options...
  3. itemSelector: '.grid-item',
  4. columnWidth: 200
  5. });

原生JavaScript:

复制代码

  1. init with element
  2. var grid = document.querySelector('.grid');
  3. var msnry = new Masonry( grid, {
  4. // options...
  5. itemSelector: '.grid-item',
  6. columnWidth: 200
  7. });

复制代码

HTML:

  1. <div class="grid" data-masonry='{ "itemSelector": ".grid-item", "columnWidth": 200 }'>
  2. <div class="grid-item"></div>
  3. <div class="grid-item"></div>
  4. ...
  5. </div>

常用属性如下:

itemSelector : ‘.item’,//瀑布流布局中的单项选择器
columnWidth : 240 ,//一列的宽度
isAnimated:true,//使用jquery的布局变化,是否启用动画
animationOptions:{
//jquery animate属性 渐变效果 Object { queue: false, duration: 500 }
},
gutterWidth:0,//列的间隙 Integer
isFitWidth:true,//是否适应宽度 Boolean
isResizableL:true,//是否可调整大小 Boolean
isRTL:false,//是否使用从右到左的布局 Boolean

初始化代码如下:

ContractedBlock.gif

运行效果:

1069950-20161202141107834-1761210604.png

3.3.4、使用了图片的瀑布流

复制代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>瀑布流布局</title>
  6. <style type="text/css">
  7. #grid {
  8. width: 82%;
  9. margin: 0 auto;
  10. }
  11. </style>
  12. </head>
  13. <body>
  14. <div id="grid">
  15. <div class="grid-item">
  16. <a href="#">
  17. <img src="img/1.jpg" width="200" />
  18. </a>
  19. </div>
  20. <div class="grid-item">
  21. <a href="#">
  22. <img src="img/2.jpg" width="200" />
  23. </a>
  24. </div>
  25. <div class="grid-item">
  26. <a href="#">
  27. <img src="img/3.jpg" width="200" />
  28. </a>
  29. </div>
  30. <div class="grid-item">
  31. <a href="#">
  32. <img src="img/1.jpg" width="200" />
  33. </a>
  34. </div>
  35. <div class="grid-item">
  36. <a href="#">
  37. <img src="img/4.jpg" width="200" />
  38. </a>
  39. </div>
  40. <div class="grid-item">
  41. <a href="#">
  42. <img src="img/5.jpg" width="200" />
  43. </a>
  44. </div>
  45. <div class="grid-item">
  46. <a href="#">
  47. <img src="img/6.jpg" width="200" />
  48. </a>
  49. </div>
  50. <div class="grid-item">
  51. <a href="#">
  52. <img src="img/1.jpg" width="200" />
  53. </a>
  54. </div>
  55. <div class="grid-item">
  56. <a href="#">
  57. <img src="img/7.jpg" width="200" />
  58. </a>
  59. </div>
  60. <div class="grid-item">
  61. <a href="#">
  62. <img src="img/4.jpg" width="200" />
  63. </a>
  64. </div>
  65. <div class="grid-item">
  66. <a href="#">
  67. <img src="img/1.jpg" width="200" />
  68. </a>
  69. </div>
  70. <div class="grid-item">
  71. <a href="#">
  72. <img src="img/5.jpg" width="200" />
  73. </a>
  74. </div>
  75. <div class="grid-item">
  76. <a href="#">
  77. <img src="img/4.jpg" width="200" />
  78. </a>
  79. </div>
  80. <div class="grid-item">
  81. <a href="#">
  82. <img src="img/5.jpg" width="200" />
  83. </a>
  84. </div>
  85. <div class="grid-item">
  86. <a href="#">
  87. <img src="img/4.jpg" width="200" />
  88. </a>
  89. </div>
  90. <div class="grid-item">
  91. <a href="#">
  92. <img src="img/1.jpg" width="200" />
  93. </a>
  94. </div>
  95. <div class="grid-item">
  96. <a href="#">
  97. <img src="img/5.jpg" width="200" />
  98. </a>
  99. </div>
  100. <div class="grid-item">
  101. <a href="#">
  102. <img src="img/4.jpg" width="200" />
  103. </a>
  104. </div>
  105. <div class="grid-item">
  106. <a href="#">
  107. <img src="img/5.jpg" width="200" />
  108. </a>
  109. </div>
  110. </div>
  111. <script src="js/masonry.pkgd.min.js" type="text/javascript" charset="utf-8"></script>
  112. <script type="text/javascript">
  113. window.onload = function() {
  114. var msnry = new Masonry('#grid', {
  115. itemSelector: '.grid-item',
  116. columnWidth: 220,
  117. });
  118. }
  119. </script>
  120. </body>
  121. </html>

复制代码

运行效果:1069950-20161203103906146-1388459199.png

注意:上面的示例中我们使用了window.onload事件,原因是如果图片没有加载完成就执行瀑布流布局会引起堆叠的问题,其实就是初始化是没有检测到图片的高度,window.onload在有许多图片的环境下会有性能问题,这里给大家介绍另一个组件。

3.3.5、imagesLoaded

imagesLoaded 是一个用于来检测网页中的图片是否载入完成的 JavaScript 工具库。支持回调的获取图片加载的进度,还可以绑定自定义事件。可以结合 jQuery、RequireJS 使用。

官网:http://imagesloaded.desandro.com/

源码:https://github.com/desandro/imagesloaded

示例代码:

复制代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>imagesLoaded – 检测网页中的图片是否加载</title>
  6. </head>
  7. <body>
  8. <div id="div1">
  9. <img src="img/h/h(2).jpg" width="300" /><img src="img/h/h(1).jpg" width="300" />
  10. </div>
  11. <script src="js/jquery-1.11.3.min.js" type="text/javascript" charset="utf-8"></script>
  12. <script src="js/imagesloaded-master/imagesloaded.pkgd.min.js" type="text/javascript" charset="utf-8"></script>
  13. <script>
  14. imagesLoaded(document.querySelector('#div1'), function(instance) {
  15. alert('所有的图片都加载完成了');
  16. });
  17. $('#div1').imagesLoaded()
  18. .always(function(instance) {
  19. console.log('all images loaded');
  20. })
  21. .done(function(instance) {
  22. console.log('all images successfully loaded');
  23. })
  24. .fail(function() {
  25. console.log('all images loaded, at least one is broken');
  26. })
  27. .progress(function(instance, image) {
  28. var result = image.isLoaded ? 'loaded' : 'broken';
  29. console.log('image is ' + result + ' for ' + image.img.src);
  30. });
  31. </script>
  32. </body>
  33. </html>

复制代码

运行效果如同上

属性与事件官网有详细的说明这里只列出来了部分,下面是官网列出的选择:

复制代码

  1. $('.selector').infinitescroll({
  2. loading: {
  3. finished: undefined,
  4. finishedMsg: "<em>Congratulations, you've reached the end of the internet.</em>",
  5. img: null,
  6. msg: null,
  7. msgText: "<em>Loading the next set of posts...</em>",
  8. selector: null,
  9. speed: 'fast',
  10. start: undefined
  11. },
  12. state: {
  13. isDuringAjax: false,
  14. isInvalidPage: false,
  15. isDestroyed: false,
  16. isDone: false, // For when it goes all the way through the archive.
  17. isPaused: false,
  18. currPage: 1
  19. },
  20. behavior: undefined,
  21. binder: $(window), // used to cache the selector for the element that will be scrolling
  22. nextSelector: "div.navigation a:first",
  23. navSelector: "div.navigation",
  24. contentSelector: null, // rename to pageFragment
  25. extraScrollPx: 150,
  26. itemSelector: "div.post",
  27. animate: false,
  28. pathParse: undefined,
  29. dataType: 'html',
  30. appendCallback: true,
  31. bufferPx: 40,
  32. errorCallback: function () { },
  33. infid: 0, //Instance ID
  34. pixelsFromNavToBottom: undefined,
  35. path: undefined, // Can either be an array of URL parts (e.g. ["/page/", "/"]) or a function that accepts the page number and returns a URL
  36. maxPage:undefined // to manually control maximum page (when maxPage is undefined, maximum page limitation is not work)
  37. });

复制代码

3.5.1、异步加载普通页面

p1.html页面:

复制代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style type="text/css">
  7. .item {
  8. height: 200px;
  9. }
  10. </style>
  11. </head>
  12. <body>
  13. <h2>产品列表</h2>
  14. <div id="items">
  15. <p class="item">产品一</p>
  16. <p class="item">产品一</p>
  17. <p class="item">产品一</p>
  18. <p class="item">产品一</p>
  19. <p class="item">产品一</p>
  20. <p class="item">产品一</p>
  21. </div>
  22. <a href="p2.html" id="next">下一页</a>
  23. <script src="../js/jquery-1.11.3.min.js" type="text/javascript" charset="utf-8"></script>
  24. <script src="../js/infinite-scroll/jquery.infinitescroll.min.js" type="text/javascript" charset="utf-8"></script>
  25. <script type="text/javascript">
  26. $('#items').infinitescroll({
  27. navSelector: "#next", // 页面分页元素(成功后会被隐藏)
  28. nextSelector: "a#next", // 需要点击的下一页链接,和2的html要对应
  29. itemSelector: ".item", // ajax回来之后,每一项的selecter,比如每篇文章都有item这个class
  30. debug: true, //是否调试
  31. dataType: 'html', //数据类型
  32. maxPage: 3, //最大页数
  33. path: function(index) { //路径
  34. return "p" + index + ".html";
  35. }
  36. }, function(newElements, data, url) { //成功后的回调
  37. //console.log("路径:" + url);
  38. $(newElements).css('background-color', '#ffef00');
  39. // $(this).append(newElements);
  40. });
  41. </script>
  42. </body>
  43. </html>

复制代码

p2.html页面:

复制代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>P2</title>
  6. </head>
  7. <body>
  8. <p class="item">产品二</p>
  9. <p class="item">产品二</p>
  10. <p class="item">产品二</p>
  11. <p class="item">产品二</p>
  12. <p class="item">产品二</p>
  13. <p class="item">产品二</p>
  14. </body>
  15. </html>

复制代码

p3.html页面:

复制代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>P3</title>
  6. </head>
  7. <body>
  8. <p class="item">产品三</p>
  9. <p class="item">产品三</p>
  10. <p class="item">产品三</p>
  11. <p class="item">产品三</p>
  12. <p class="item">产品三</p>
  13. <p class="item">产品三</p>
  14. </body>
  15. </html>

复制代码

运行效果:

3.5.2、异步加载json并解析

m1.html页面:

复制代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>相册</title>
  6. <style type="text/css">
  7. .item {
  8. float: left;
  9. min-height: 300px;
  10. }
  11. </style>
  12. </head>
  13. <body>
  14. <h2>相册</h2>
  15. <div id="items">
  16. <p class="item"><img src="../img/i/1.jpg" /></p>
  17. <p class="item"><img src="../img/i/2.jpg" /></p>
  18. <p class="item"><img src="../img/i/3.jpg" /></p>
  19. <p class="item"><img src="../img/i/4.jpg" /></p>
  20. <p class="item"><img src="../img/i/5.jpg" /></p>
  21. <p class="item"><img src="../img/i/6.jpg" /></p>
  22. </div>
  23. <a href="m2.json" id="next"></a>
  24. <script src="../js/jquery-1.11.3.min.js" type="text/javascript" charset="utf-8"></script>
  25. <script src="../js/infinite-scroll/jquery.infinitescroll.min.js" type="text/javascript" charset="utf-8"></script>
  26. <script type="text/javascript">
  27. $('#items').infinitescroll({
  28. navSelector: "#next",
  29. nextSelector: "a#next",
  30. itemSelector: ".item",
  31. debug: true,
  32. dataType: 'json',
  33. maxPage: 3,
  34. appendCallback:false,
  35. path: function(index) {
  36. return "m" + index + ".json";
  37. }
  38. }, function(data) {
  39. for(var i=0;i<data.length;i++){
  40. $("<p class='item'><img src='../img/i/"+data[i]+".jpg' /></p>").appendTo("#items");
  41. }
  42. });
  43. </script>
  44. </body>
  45. </html>

复制代码

m2.json数据:

  1. [1,2,3,4,5,6]

m3.json数据:

  1. [7,8,9,4,5,6]

运行结果:

1069950-20161203104520177-1433296677.png

四、响应式布局(Responsive)

a)、内部样式

@media screen and (width:800px){ … }

b)、导入样式

@import url(example.css) screen and (width:800px);

c)、链接样式

d)、XML中应用样式
<?xml-stylesheet media=”screen and (width:800px)” rel=”stylesheet” href=”example.css” ?>

4.3、Hello World

在页面上放一个层,当屏幕大小在100-640之间时

示例代码:

  

复制代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>媒介查询</title>
  6. <style type="text/css">
  7. #div1 {
  8. background: lightblue;
  9. height: 100px;
  10. }
  11. @media only screen and (min-width: 100px) and (max-width: 640px) {
  12. #div1 {
  13. background: lightgreen;
  14. height: 200px;
  15. }
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <div id="div1">
  21. Hello World!
  22. </div>
  23. </body>
  24. </html>

复制代码

运行效果:

1069950-20161203105008318-1744941204.png

但屏幕缩小时的运行效果:

1069950-20161203105034052-388817848.png

4.4、媒介查询语法

@media queries是CSS3中引入的,不仅可以实现媒介类型的查询可以实现设备特性的查询,可以简单认为是对CSS2.1中的media的增强,基本语法如下:

@media [not|only] media_type and feature

not:取反操作

only:让不支持media query的设备但读取media type类型的浏览器忽略这个样式

media_type:是媒介类型,具体如下:

" class="reference-link">63651-20161205084702413-977149362.png

feature:定义设备特性,多数允许加前缀min-,max-,多个条件可以使用and连接,and两侧需要空格。

63651-20161205085626132-1208303876.png

常见写法:

  1. @media only screen and (min-width: 320px) and (max-width: 640px) {
  2. }

复制代码

复制代码

  1. @media min-device-width:1024px and max-width:989px),screen and max-device-width:480px),(max-device-width:480px and orientation:landscape),(min-device-width:480px and max-device-width:1024px and orientation:portrait {
  2. CSS样式...
  3. }

复制代码

复制代码

and表示与,条件要同时满足;逗号表示或。

4.5、响应式栅格系统(Responsive)

在前面的布局中我们学习栅格系统,这里通过媒介查询实现响应式栅格系统,脚本如下:

复制代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>响应式栅格</title>
  6. <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  7. <style type="text/css">
  8. * {
  9. margin: 0;
  10. padding: 0;
  11. }
  12. html,
  13. body {
  14. height: 100%;
  15. font: 20px/20px "microsoft yahei";
  16. }
  17. div {
  18. min-height: 100px;
  19. }
  20. .row {
  21. width: 800px;
  22. background: deepskyblue;
  23. margin: 0 auto;
  24. }
  25. .row:after {
  26. content: ' ';
  27. display: table;
  28. clear: both;
  29. }
  30. .col25 {
  31. width: 25%;
  32. background: lightgreen;
  33. }
  34. .col50 {
  35. width: 50%;
  36. background: lightcoral;
  37. }
  38. .col75 {
  39. width: 75%;
  40. background: lightblue;
  41. }
  42. [class*=col] {
  43. float: left;
  44. }
  45. /*0-480手机*/
  46. @media only screen and (max-width:480px) {
  47. .row {
  48. width: 100%;
  49. }
  50. [class*=col] {
  51. float: none;
  52. margin-top: 5px;
  53. width: 100%;
  54. }
  55. }
  56. /*480-960平板,手机横屏*/
  57. @media only screen and (min-width: 480px) and (max-width: 960px) {
  58. .row {
  59. width: 480px;
  60. }
  61. }
  62. /*960PC屏幕*/
  63. @media only screen and (min-width:960px) {
  64. .row {
  65. width: 960px;
  66. }
  67. }
  68. </style>
  69. </head>
  70. <body>
  71. <div id="container">
  72. <div id="header" class="row">
  73. header
  74. </div>
  75. <div id="main" class="row">
  76. <div id="left" class="col25">left</div>
  77. <div id="center" class="col50">center</div>
  78. <div id="right" class="col25">right</div>
  79. </div>
  80. <div id="footer" class="row">
  81. footer
  82. </div>
  83. </div>
  84. </body>
  85. </html>

复制代码

运行效果:

宽屏时:

1069950-20161205215504882-1986867267.png

小屏时:

1069950-20161205215550444-298631648.png

4.6、respond.js

respond.js是一个用于让IE8以下浏览器支持@media queries的插件,也就是使用Respond.js能让IE6-8支持CSS3 Media Query。Bootstrap里面就引入了这个JS文件,压缩后只有3KB。该脚本循环遍历页面上的所有 CSS 引用,并使用媒体查询分析 CSS 规则。然后,该脚本会监控浏览器宽度变化,添加或删除与 CSS 中媒体查询匹配的样式。最终结果是,能够在原本不支持的浏览器上运行媒体查询。

要注意的问题:

if CSS files are encoded in UTF-8 with Byte-Order-Mark, they will not work with Respond.js in IE7 or IE8.

微软的utf-8格式且BOM的文件会出问题,BOM格式文档头3个字节就是BOM,会影响程序对文档的处理。

最近有测试发现IE8还是出现了问题,动画@keyframe中的@符号造成的影响会使respond.js失效,因此,在使用respond.js时,尽量就不要用CSS3动画。

下载地址:https://github.com/scottjehl/Respond/

引入方法:

  1. <!--[if lt IE 9]>
  2. <script src="html5shiv.js"></script>
  3. <script src="respond.min.js"></script>
  4. <![endif]-->

4.7、移动优先(Mobile First)

.8、视区(viewport)

4.8.1、需要设置viewport的原因

viewport也称视口,PC上是指浏览器窗口的可视区域。先了解两个概念:

可见视口(visual viewport):浏览器窗口的可视区域

布局视口(layout viewport):CSS在应用时所设置的布局最大宽度。布局视口可以大于可见视口。

复制代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>viewport</title>
  6. <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  7. </head>
  8. <body>
  9. <p>
  10. viewport也称视口,PC上是指浏览器窗口的可视区域。先了解两个概念: 可见视口(visual viewport):浏览器窗口的可视区域 布局视口(layout viewport):CSS在应用时所设置的布局最大宽度。布局视口可以大于可见视口。
  11. </p>
  12. </body>
  13. </html>

复制代码

在手机上的运行效果:

1069950-20161205215916116-1046247051.png

首先如果不设置meta viewport标签,那么移动设备上浏览器默认的宽度(布局视口)值为800px,980px,1024px等这些,总之是大于屏幕宽度(可见视口)的。这里的宽度所用的单位px都是指css中的px,它跟代表实际屏幕物理像素的px不是一回事。

每个移动设备浏览器中都有一个理想的宽度(ideal viewport),这个理想的宽度是指css中的宽度,跟设备的物理宽度没有关系,在css中,这个宽度就相当于100%的所代表的那个宽度。

一般在head中加上如下的meta即可:

  1. <meta name="viewport" content="width=device-width, initial-scale=1" />

发表评论

表情:
评论列表 (有 0 条评论,263人围观)

还没有评论,来说两句吧...

相关阅读

    相关 多种方法实现自适应布局

    最近切了几个手机端的网页,第一次切的是美团的首页,为了自适应不同的手机分辨率,需要用到自适应布局,切图的时候是用的第一中方法,用到了定位,后来查找了一些其他方法,现在就介绍几种

    相关 页面布局

    页面布局 > 问题:假设高度默认`100px` ,请写出三栏布局,其中左栏、右栏各为`300px`,中间自适应。 ![20180305_1520.png][] 分析: