9-2 补充内容雪碧图的自适应缩放
本节编程练习不计算学习进度,请电脑登录imooc.com操作

补充内容雪碧图的自适应缩放

本节的内容没有在七夕主题效果中实现,这是一个额外的知识点,留给大家思考的一个问题:雪碧图如何做自适应缩放?

本课程采用了CSS3的动画关键帧实现了精灵动画,所有的精灵图都是通过合成的雪碧图获取的,这样带来了一个根本问题:通过background-position获取的图片,正常情况下是无法缩放的,因为图片的位置是固定了,如果通过这种方式实现了精灵图那么在不同的分辨率下其实都是固定的尺寸,这样效果就明显有点呆板了

针对这样的问题,当然也有折中的办法,比如我们不加载精灵图,而是通过background-image加载一张一张的图片,这样是可以的,但是需要预加载的处理,否则图片大了会闪屏了。一般精灵图都是通过position处理比较合理,我们有没有办法把这个图片给缩放一下达到自适应的目的呢?这里我给大家一个参考的方案,CSS3有一个scale可以这样处理。

这里先参考下我右边代码的实现效果,人物是不是感觉缩放了?

缩放原理:

通过CSS3的scale处理直接可以让元素缩放

需要处理的问题:

带来的问题:

具体的算法我右边已经给出来了

通过UI的设计与屏幕算一个缩放比

$(document).width() / 1440

通过这个缩放比,设置下元素的缩放大小,然后通过实际的人物尺寸与缩放比算出人物内部缩放的数据boyInsideLeft与boyInsideTop

最终,要定为人物在中间位置的算法:

人物在马路中间 = 马路中间路的垂直距离 - 人物原始的垂直距离 - 人物缩放后的垂直距离

这样算法我们可以弄一个公共方法出来,通过这样的方式,我们可以很愉快的改造雪碧图实现自适应布局了~~~

PS: 我之后又仔细研究下雪碧图的自适应问题,想到一种比较完美的方案,具体可以参见我的博客:原创:CSS3技术-雪碧图自适应缩放

 

任务

  1. <!DOCTYPE html>
  2. <html>
  3.  
  4. <head>
  5. <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  6. <title>慕课七夕主题</title>
  7. <link rel='stylesheet' href='style.css' />
  8. <link rel='stylesheet' href='pageA.css' />
  9. <script src="http://libs.baidu.com/jquery/1.9.1/jquery.js"></script>
  10. <script type="text/javascript" src="Swipe.js"></script>
  11. </head>
  12. <style type="text/css">
  13. .charector {
  14. width: 151px;
  15. height: 291px;
  16. left: 6%;
  17. top: 55%;
  18. position: absolute;
  19. background: url(http://img1.sycdn.imooc.com//55ade248000198ae10550582.png) -0px -291px no-repeat;
  20. }
  21. </style>
  22.  
  23. <body>
  24. <div id='content'>
  25. <ul class='content-wrap'>
  26. <li>
  27. <div class="a_background">
  28. <div class="a_background_top"></div>
  29. <div class="a_background_middle"></div>
  30. <div class="a_background_botton"></div>
  31. </div>
  32. </li>
  33. <li> 页面2 </li>
  34. <li> 页面3 </li>
  35. </ul>
  36. <div id="boy" class="charector"></div>
  37. </div>
  38. <script type="text/javascript">
  39. var swipe = Swipe($("#content"));
  40.  
  41. var $boy = $("#boy");
  42.  
  43. // 设置一下缩放比例与基点位置
  44. var proportion = $(document).width() / 1440;
  45. // 设置元素缩放
  46. $boy.css({
  47. transform: 'scale(' + proportion + ')'
  48. });
  49.  
  50. // 获取数据
  51. var getValue = function(className) {
  52. var $elem = $('' + className + '');
  53. // 走路的路线坐标
  54. return {
  55. height: $elem.height(),
  56. top: $elem.position().top
  57. };
  58. }
  59.  
  60. // 路的中间到顶部的距离
  61. var pathY = function() {
  62. var data = getValue('.a_background_middle');
  63. return data.top + data.height / 2;
  64. }();
  65.  
  66. // 获取人物元素布局尺寸
  67. var boyHeight = $boy.height();
  68. var boyWidth = $boy.width();
  69. // 计算下缩放后的元素与实际尺寸的一个距离
  70. var boyInsideLeft = (boyWidth - (boyWidth*proportion))/2;
  71. var boyInsideTop = (boyHeight - (boyHeight*proportion))/2;
  72.  
  73. // 修正小男孩的正确位置
  74. // 中间路的垂直距离 - 人物原始的垂直距离 - 人物缩放后的垂直距离
  75. $boy.css({
  76. top: pathY - (boyHeight * proportion) - boyInsideTop
  77. });
  78. </script>
  79. </body>
  80.  
  81. </html>
  1. /////////
  2. //页面滑动 //
  3. /////////
  4.  
  5.  
  6. /**
  7.  * [Swipe description]
  8.  * @param {[type]} container [页面容器节点]
  9.  * @param {[type]} options [参数]
  10.  */
  11. function Swipe(container) {
  12. // 获取第一个子节点
  13. var element = container.find(":first");
  14. var swipe = {};
  15.  
  16. // li页面数量
  17. var slides = element.find(">");
  18.  
  19. // 获取容器尺寸
  20. var width = container.width();
  21. var height = container.height();
  22.  
  23. // 设置li页面总宽度
  24. element.css({
  25. width: (slides.length * width) + 'px',
  26. height: height + 'px'
  27. });
  28.  
  29. // 设置每一个页面li的宽度
  30. $.each(slides, function(index) {
  31. var slide = slides.eq(index); // 获取到每一个li元素
  32. slide.css({
  33. width: width + 'px',
  34. height: height + 'px'
  35. });
  36. });
  37.  
  38. // 监控完成与移动
  39. swipe.scrollTo = function(x, speed) {
  40. // 执行动画移动
  41. element.css({
  42. 'transition-timing-function' : 'linear',
  43. 'transition-duration' : speed + 'ms',
  44. 'transform' : 'translate3d(-' + x + 'px,0px,0px)'
  45. });
  46. return this;
  47. };
  48.  
  49. return swipe;
  50. }
  1. * {
  2. padding: 0;
  3. margin: 0;
  4. }
  5.  
  6. ol,
  7. ul,
  8. li {
  9. list-style-type: none;
  10. }
  11. /*主体部分*/
  12.  
  13. #content {
  14. width: 100%;
  15. height: 100%;
  16. /*top: 20%;*/
  17. overflow: hidden;
  18. position: absolute;
  19. }
  20.  
  21. .content-wrap {
  22. position: relative;
  23. }
  24.  
  25. .content-wrap > li {
  26. background: #CAE1FF;
  27. color: red;
  28. float: left;
  29. overflow: hidden;
  30. position: relative;
  31. }
  32.  
  33. li:nth-child(2) {
  34. background: #9BCD9B;
  35. }
  36.  
  37. li:nth-child(3) {
  38. background: yellow;
  39. }
  40.  
  41. a {
  42. position: absolute;
  43. top: 50%;
  44. left: 40%;
  45. }
  1. /*背景图*/
  2.  
  3. .a_background {
  4. width: 100%;
  5. height: 100%;
  6. position: absolute;
  7. }
  8.  
  9. .a_background_top{
  10. width: 100%;
  11. height: 71.6%;
  12. background-image: url("http://img1.sycdn.imooc.com//55addf6900019d8f14410645.png");
  13. background-size: 100% 100%;
  14. }
  15.  
  16.  
  17. .a_background_middle{
  18. width: 100%;
  19. height: 13.1%;
  20. background-image: url("http://img1.sycdn.imooc.com//55addf800001ff2e14410118.png");
  21. background-size: 100% 100%;
  22. }
  23.  
  24. .a_background_botton{
  25. width: 100%;
  26. height: 15.3%;
  27. background-image: url("http://img1.sycdn.imooc.com//55addfcb000189b314410138.png");
  28. background-size: 100% 100%;
  29. }
返回课程