5.11.2 CSS源码分析

在这一节,我们将只分析主要的一部分CSS样式,其他的样式因为和JavaScript代码关系比较大,所以会在JavaScript源码分析小节进行分析。首先,先看一下轮播插件的HTML结构示意图,如图5-18所示。

5.11.2 CSS源码分析 - 图1 图5-18 旋转轮播元素布局示意图

结构示意图中有8个序号,我们来逐一分析一下相关的CSS样式。首先是容器样式carousel,它只定义了一个相对定位position: relative;,所以在使用的过程中需要再次定义该元素的高度和宽度。

其次是2号carousel-inner样式,该样式是图片集的容器,其内部放置了多个以item为样式的div元素,主要定义了定位和默认的隐藏与显示状态。主要源码如下:

  1. // 源码5424行
  2. .carousel-inner { /*图片集容器*/
  3. position: relative; /*相对定位*/
  4. width: 100%; /*充满父元素*/
  5. overflow: hidden; /*超出部分隐藏,这一点非常重要,即将显示的图片将在超出部分,然后再以动画形式滑入*/
  6. }
  7. .carousel-inner > .item { /*每个图片item容器的样式*/
  8. position: relative; /*相对定位*/
  9. display: none; /*默认都不显示*/
  10. -webkit-transition: 0.6s ease-in-out left; /*过渡动画*/
  11. transition: 0.6s ease-in-out left;
  12. }
  13. .carousel-inner > .item > img,
  14. .carousel-inner > .item > a > img { /*item内的图片元素上应用的样式*/
  15. display: block; /*块级显示*/
  16. height: auto; /*高度自适应*/
  17. max-width: 100%; /*最大宽度100%*/
  18. line-height: 1;
  19. }
  20. .carousel-inner > .active,
  21. .carousel-inner > .next,
  22. .carousel-inner > .prev {
  23. /*inner容器内的任何元素,如果有acrive、prev、next样式,都设置为可见,主要用于上一张、下一张图的过渡*/
  24. display: block; /*块级显示*/
  25. }
  26. .carousel-inner > .active { /*如果是高亮图片,则左对齐*/
  27. left: 0;
  28. }

通过上述代码可以得知,默认情况下,所有的图片都是隐藏的,只有设置了.active样式的图片才以块级元素的方式显示出来,其位置是通过left: 0来达到左对齐的目的。

对于3、4、5号的图片说明样式,禁用一个.carousel-caption样式即可。源码如下:

  1. // 源码5563行
  2. .carousel-caption { /*图片说明,窄屏情况下*/
  3. position: absolute; /*绝对定位*/
  4. right: 15%; /*右边留15%间距*/
  5. bottom: 20px; /*底部外边距*/
  6. left: 15%; /*左边留15%间距*/
  7. z-index: 10; /*加大z-index,高于其他元素*/
  8. padding-top: 20px; /*顶部内间距*/
  9. padding-bottom: 20px; /*底部内间距*/
  10. color: #fff; /*文本为白色*/
  11. text-align: center; /*居中*/
  12. text-shadow: 0 1px 2px rgba(0, 0, 0, .6); /*阴影设置*/
  13. }
  14. .carousel-caption .btn {
  15. text-shadow: none; /*有按钮的话,取消按钮的阴影*/
  16. }

6号和7号分别是左右箭头,这两个箭头的z-index高度图片容器,其定义原理主要是,在记录大容器左边和右边的15%的距离,分别显示两个a链接,然后在a链接内部定义需要显示的小图标。a链接的位置和行为定义如下:

  1. // 源码5472行
  2. .carousel-control {
  3. position: absolute; /*绝对定位*/
  4. top: 0;
  5. bottom: 0; /*默认距离父元素的顶部、底部、左边都是0距离*/
  6. left: 0;
  7. width: 15%; /*宽度设置为整体父元素的15%*/
  8. /*省略部分代码 */
  9. opacity: .5;
  10. }
  11. .carousel-control.left { /*左箭头的背景设置*/
  12. background-repeat: repeat-x;
  13. background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
  14. }
  15. .carousel-control.right { /*右箭头的背景设置*/
  16. right: 0;
  17. left: auto;
  18. background-repeat: repeat-x;
  19. background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%,
  20. rgba(0, 0, 0, .5) 100%);
  21. }
  22. .carousel-control:hover,
  23. .carousel-control:focus { /*鼠标移动上去的时候加深透明度*/
  24. color: #fff;
  25. text-decoration: none;
  26. filter: alpha(opacity=90);
  27. outline: none;
  28. opacity: .9;
  29. }

然后定义a链接内部的小图标。关于小图标,作者定义了两种样式,一种是glyphicon表示左右方向字体图标,另外一种是icon的字符图标。通用定义如下:

  1. // 源码5503行
  2. .carousel-control .icon-prev,
  3. .carousel-control .icon-next,
  4. .carousel-control .glyphicon-chevron-left,
  5. .carousel-control .glyphicon-chevron-right { /*内部小图标设置*/
  6. position: absolute; /*绝对定位*/
  7. top: 50%; /*距carousel-control元素的顶部50%*/
  8. z-index: 5;
  9. display: inline-block; /*内联块级显示*/
  10. }
  11. .carousel-control .icon-prev,
  12. .carousel-control .glyphicon-chevron-left { /*向左的小图标*/
  13. left: 50%; /*距carousel-control元素的左边50%,即15%的一半*/
  14. }
  15. .carousel-control .icon-next,
  16. .carousel-control .glyphicon-chevron-right { /*向右的小图标*/
  17. right: 50%; /*距carousel-control元素的右边50%,即15%的一半*/
  18. }

字体样式glyphicon-chevron-left和glyphicon-chevron-right分别代表左右箭头;同理,字符样式icon-prev和icon-next分别代表另外一种形式的左右箭头,其字符是通过在before伪类上定义的。代码如下:

  1. // 源码5520行
  2. .carousel-control .icon-prev,
  3. .carousel-control .icon-next { /*字符小图标*/
  4. width: 20px; margin-top: -10px;
  5. height: 20px;margin-left: -10px;
  6. font-family: serif;
  7. }
  8. .carousel-control .icon-prev:before { /*左箭头*/
  9. content: '\2039';
  10. }
  11. .carousel-control .icon-next:before { /*右箭头*/
  12. content: '\203a';
  13. }

8号圆圈是代表指示符,其carousel-indicators样式最大一个注意点就是它的z-index是15,比图片的z-index还高,以防止被图片说明所遮盖。

  1. // 源码5534行
  2. .carousel-indicators { /*指示符*/
  3. position: absolute; /*绝对定位*/
  4. bottom: 10px; /*距离底部10像素*/
  5. left: 50%; /*距离左边50%*/
  6. z-index: 15; /*加大z-index,以防被遮盖*/
  7. /*省略一部分*/
  8. list-style: none;
  9. }
  10. .carousel-indicators li { /*指示符项*/
  11. display: inline-block; /*内联块显示*/
  12. width: 10px; /*宽度高度均为10像素*/
  13. height: 10px;
  14. margin: 1px;
  15. text-indent: -999px; /*隐藏内部文本*/
  16. cursor: pointer; /*鼠标手型*/
  17. /*省略一部分*/
  18. border-radius: 10px; /*因为高度和宽度都是10像素,角度为10像素就意味着它就是一个圆圈*/
  19. }
  20. .carousel-indicators .active { /*高亮的圆圈指示符背景显示为白色*/
  21. width: 12px; /*宽度和高度稍微加大一些*/
  22. height: 12px;
  23. margin: 0;
  24. background-color: #ffffff;
  25. }

上述1~8个区域的样式均为默认的普通样式,即无论是在窄屏还是在宽屏都可以。但作者为普通桌面浏览器又单独设置了一下,都稍微加大了一些,使其看起来更平滑。代码如下:

  1. // 源码5578行
  2. @media screen and (min-width: 768px) { /*如果是普通桌面浏览器屏幕*/
  3. .carousel-control .glyphicons-chevron-left,
  4. .carousel-control .glyphicons-chevron-right,
  5. .carousel-control .icon-prev,
  6. .carousel-control .icon-next { /*加大左右控制链接图片的大小*/
  7. width: 30px;
  8. height: 30px;
  9. margin-top: -15px;
  10. margin-left: -15px;
  11. font-size: 30px;
  12. }
  13. .carousel-caption { /*加大距离父容器的左右距离*/
  14. right: 20%;
  15. left: 20%;
  16. padding-bottom: 30px; /*加大底部内边距*/
  17. }
  18. .carousel-indicators {
  19. bottom: 20px; /*加大指示符的底部内边距*/
  20. }
  21. }

也就是说,可以像如下这样定义左右箭头:

  1. <!-- 左右控制按钮 -->
  2. <a data-slide="prev" href="#carousel-container" class="left carousel-control">
  3. <span class="icon-prev"></span>
  4. </a>
  5. <a data-slide="next" href="#carousel-container" class="right carousel-control">
  6. <span class="icon-next"></span>
  7. </a>