【问题标题】:how to dynamically size multi-css sprite image如何动态调整多 CSS 精灵图像的大小
【发布时间】:2012-10-12 21:07:17
【问题描述】:

我有一个由多个 css sprite 构建的图像,如以下问题所述:css image building with sprites

我将如何使用它以便我可以在顶部容器上应用一个大小来动态调整所有子容器的大小?

这是目前为止的工作小提琴:http://jsfiddle.net/hWhUb/3/

这是当前的html结构:

<div class="icon">
    <div class="brigade brigade-purple-left">&nbsp;</div>
    <div class="brigade brigade-purple-middle">&nbsp;</div>
    <div class="brigade brigade-purple-right">&nbsp;</div>
    <div class="icon-type icon-hero">&nbsp;</div>
</div>​

【问题讨论】:

    标签: css css-sprites


    【解决方案1】:

    我有几个问题,可能会导致解决方案:

    1. 您为什么要使用多个图像来实现使用一点 css3 和单个图像(cross thingie)可以轻松实现的东西?可以更轻松地调整单个图像的大小,按容器宽度的百分比,甚至使用 css3 background-size 属性。

    2. 如果您必须为每件事情使用图像,您是否可以考虑永远不要使用精灵?它的可维护性是纯粹的烦恼,特别是如果有人后来不得不把这个项目从你手中夺走。

    3. 也许两者兼而有之?

    如果你选择第二个选项,我建议使用 data uris。 这是一个简短的解释: http://css-tricks.com/data-uris/ 它比 sprite 多节省了一个 http 请求,更易于维护,而且总体大小的差异在我看来是相当微不足道的,而且支持很棒 - IE8+ 和所有理智的浏览器都在那里。 设置很容易,特别是如果您使用全能的 sass 解释器,但有一些漂亮的实用程序(命令行、gui 甚至基于 Web)可以将您的图像转换为 base64。 不费吹灰之力就可以支持IE7!

    编辑 3.11.12

    您还可以在选项中添加http://css3pie.com/ 以进行检查 - 它可以让您使用 Internet Explorer 执行我们非常喜欢和喜欢的 css3 技巧。这对我来说有点难以预测,但对于像这样的小壮举,它绝对可以做到这一点。

    此外,我在下面评论了您的浏览器支持需求。 IE7 不会阻止你;)

    【讨论】:

    • EladR 在我看来是一针见血。为图形使用数据 URI(甚至比精灵更好,因为不需要额外的 HTTP 请求;已作为 CSS 的一部分下载)。使用 background-size 适当地拉伸图像。另外,我只是查看了您的 sprite 文件 - 您可以单独使用 CSS3(背景颜色和圆角)完成 90% 的操作。所以是的.. EladR 说的。
    • 我想我应该把浏览器的要求。我需要它在 ie7+ 中工作
    • 在IE7下也能用,稍微费点力。根据我的研究,有一个叫做 mhtml 的东西,它使 IE7 和 IE8 都可以使用类似于 Data URI 的东西。不过,从我的实验来看,即使没有,它也能正常工作。很奇怪,但是嗯……无论如何都值得一试。有很多在线工具可以转换图像,如果您愿意,可以使用指南针甚至命令行工具。
    • Sprite 的可维护性并不高。我只是使用 grunt 生成它们。
    【解决方案2】:

    您可以将 zoom 用于 webkit/ie 和 -moz-transform:scale 用于 Firefox 的组合

    [class^="icon-"]{
        display: inline-block;
        background: url('../img/icons/icons.png') no-repeat;
        width: 64px;
        height: 51px;
        overflow: hidden;
        zoom:0.5;
        -moz-transform:scale(0.5);
        -moz-transform-origin: 0 0;
    }
    
    .icon-huge{
        zoom:1;
        -moz-transform:scale(1);
        -moz-transform-origin: 0 0;
    }
    
    .icon-big{
        zoom:0.60;
        -moz-transform:scale(0.60);
        -moz-transform-origin: 0 0;
    }
    
    .icon-small{
        zoom:0.29;
        -moz-transform:scale(0.29);
        -moz-transform-origin: 0 0;
    }
    

    【讨论】:

      【解决方案3】:

      实现它的方法之一是使用内联 CSS 并在 JavaScript 或 PHP/您使用的内容中动态生成属性值。

      假设你知道顶部容器的宽度和 css sprites 的位置

      计算左中右

      您也可以选择在单独的文件中生成 CSS 代码

      http://aquagraphite.com/2011/11/dynamically-generate-static-css-files-using-php/

      【讨论】:

      • 使用php的问题是,如果调整浏览器大小怎么办?那么所有这些计算都必须再次从服务器检索
      • 您要求的是在响应式布局中使用 CSS Sprites。这是不可取的,但可以实现。你应该在 PHP 中计算 % 而不是像素然后它应该没问题.. [link]chiefalchemist.com/…
      【解决方案4】:

      使用一点 jQuery,我可以将元素调整为任何你想要的大小 (resizeTo):

      $(document).ready(function () {
          $('#resize').click(function (e) {
              e.preventDefault();
              var resizeTo = 100,
                  resizeRatio = Number(resizeTo) / Number($(".icon").width());
      
              $(".icon").css('width', resizeTo);
              $(".child").each(function () {
                  var childWidth = Number($(this).width()),
                      childHeight = Number($(this).height()),
                      newChildWidth = childWidth * resizeRatio,
                      newChildHeight = childHeight * resizeRatio;
                  $(this).css({ 'width': newChildWidth, 'height': newChildHeight });
              });
          });
      });​
      

      然而,size 不会调整 sprite 的大小以适应新的盒子大小,所以这似乎是一项毫无意义的任务。

      提琴手:http://jsfiddle.net/hWhUb/4/

      【讨论】:

      • 实际上,我希望只用 css 来完成这一切。但是如果我们考虑到 jquery,我将如何调整精灵的大小?
      【解决方案5】:

      虽然你想做的事情可以完成,但我认为你的做法是错误的。它比它需要的复杂得多,但这个想法是合理的。

      看看你的精灵,唯一不能用 CSS 改变的是实际的图标(艺术品)。圆角和背景颜色——那是另一回事。

      CSS

      .icon-cross {
          background:purple url('cross.jpg') no-repeat 40px 12px;
          border-radius:5px;
          border:1px solid gray
      }
      
      @media only screen and (max-width:768px) {
          .icon-cross {
              background-size: 800px 1200px;
              background-position; ??px ??px
          }
      }
      
      @media only screen and (max-width:400px) {
          .icon-cross {
              background-size: 500px 900px;
              background-position; ??px ??px
          }
      }
      

      HTML

      <div class="icon-cross"></div>
      

      【讨论】:

      • 我有 3 个颜色框的原因是它们可以是 3 种不同的颜色
      【解决方案6】:

      您可以使用 css3 2d 转换:

      .icon {
       transform: scale(2);
       -ms-transform: scale(2); /* IE 9 */
       -webkit-transform: scale(2); /* Safari and Chrome */
       -o-transform: scale(2); /* Opera */
       -moz-transform: scale(2); /* Firefox */
      }
      

      并使用以下命令更改变换原点:transform-origin

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-23
        • 2012-11-15
        • 1970-01-01
        • 2013-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多