【问题标题】:CSS images and Retina displaysCSS 图像和 Retina 显示
【发布时间】:2015-04-21 16:29:52
【问题描述】:

在 Macbook Pro Retina 和 Windows 上使用 Chrome 时,我在尝试为非视网膜和视网膜显示器显示图像时遇到了一些奇怪的行为。

我有一些方形图片,CSS如下:

/* NON RETINA */

/* style for all square images so no need to repeat */
.sq-img-small {
  background-size: 239px 239px;
  width:239px;
  height:239px;
  float:left;
  margin:0 0 20px 10px;
}

.sq-img-small.img-small-1 {
  background: url('../images/squares/food1.jpg') no-repeat top left;
}


/* RETINA */
@media 
  (-webkit-min-device-pixel-ratio: 2),(-moz-device-pixel-ratio: 2), (min-resolution: 192dppx) { 

  .sq-img-small.img-small-1 {
    background: url('../images/squares/food1.2x.jpg') no-repeat top left;
  }

我的 HTML 是:

<div class="sq-img-small img-small-1"></div>

非视网膜显示图像完美,但视网膜图像显示不正常。我无法在 div 中看到整个图像 - 它似乎已经放大了图像,所以我只能看到一小部分。

如果我添加:

background-size: 239px 239px;
width:239px;
height:239px;

进入视网膜.sq-img-small.img-small-1 块然后它显示正常,但我认为我不需要这样做,因为它应该从早期继承,对吗?还是@media 块以某种方式影响了继承?

===============更新===============

经过进一步调查,似乎为所有方形图像设置样式,然后指定每个图像的路径,当不在 @media 块内时工作正常,但当我在一个内执行相同操作时不起作用。

【问题讨论】:

    标签: html css


    【解决方案1】:

    只是给你一个例子。试试这个解决方案。

    /* for low resolution display */
    
    .image {
    
        background-image: url(/path/to/my/lowreslogo.png);
        background-size: 200px 300px;
        height: 300px;
        width: 200px;
    
    }
    
    /* for high resolution display */
    
    @media only screen and (min--moz-device-pixel-ratio: 2),
    only screen and (-o-min-device-pixel-ratio: 2/1),
    only screen and (-webkit-min-device-pixel-ratio: 2),
    only screen and (min-device-pixel-ratio: 2) {
    .image {    
        background: url(/path/to/my/highreslogo.png) no-repeat;    
        background-size: 200px 400px;    
    /* rest of your styles... */
    
    }
    }
    

    【讨论】:

    • 在我的问题中,我提到我可以按照您建议的方式让它工作,但我试图避免不必要的代码。当然,如果我已经设置了背景大小,那么我不应该再做一次。
    • 还要记住,我有多个图像要在 div 中显示。你的例子真的只适合一张图片
    • 虽然该示例可能无法即插即用以匹配您的 css 样式,但他的方法与各种 html 网站上的其他示例相匹配,包括 this one。只需将.image 更改为.img-small-1。重要的区别在于@media 查询的结构。
    【解决方案2】:

    您的尝试失败有 2 个可能的原因。 background-size 属性不会被继承,当没有通过background-shorthand 属性指定该属性时,此类属性会重置background-size

    因此,您不能期望 background-size 会从 .sq-img-small 继承到 .sq-img-small.img-small-1(但这可能不是问题,因为它们引用了相同的元素),并且因为您在 @987654328 上使用了速记属性@你重置了background-size

    来源:https://developer.mozilla.org/en-US/docs/Web/CSS/background-size

    至于工作的非视网膜图像;你的非视网膜图像可能是最开始的尺寸(239 像素 x 239 像素)吗?

    由于您当前的background-size-规则无效,您可以将其移动到速记属性中,并最终减少 1 行 css,但在 background-规则中增加一点冗余。然而,这似乎是一个小小的牺牲,因为您已经有 no-repeat top leftin 了:

    /* style for all square images so no need to repeat */
    .sq-img-small {
      width:239px;
      height:239px;
      float:left;
      margin:0 0 20px 10px;
    }
    
    .sq-img-small.img-small-1 {
      background: url('../images/squares/food1.jpg') no-repeat top left / 239px 239px;
    }
    
    
    /* RETINA */
    @media 
      (-webkit-min-device-pixel-ratio: 2),(-moz-device-pixel-ratio: 2), (min-resolution: 192dppx) { 
    
      .sq-img-small.img-small-1 {
        background: url('../images/squares/food1.2x.jpg') no-repeat top left / 239px 239px;
      }
    

    或者,您可以尝试将速记移到一般情况下,但您似乎在更新中尝试过此操作,但没有成功:

    /* style for all square images so no need to repeat */
    .sq-img-small {
      background: no-repeat top left / 239px 239px;
      width:239px;
      height:239px;
      float:left;
      margin:0 0 20px 10px;
    }
    
    .sq-img-small.img-small-1 {
      background-image: url('../images/squares/food1.jpg');
    }
    
    
    /* RETINA */
    @media 
      (-webkit-min-device-pixel-ratio: 2),(-moz-device-pixel-ratio: 2), (min-resolution: 192dppx) { 
    
      .sq-img-small.img-small-1 {
        background-image: url('../images/squares/food1.2x.jpg');
      }
    

    【讨论】:

      【解决方案3】:

      您似乎混合了 dpi 和 dppx 数字:

      根据本网站,http://brettjankord.com/2012/11/28/cross-browser-retinahigh-resolution-media-queries/

      dppx 单位是一个新单位,等于 webkit 使用的 device-pixel-ratio 值。

      但是,dppx 单位不像 dpi 单位那样受到广泛支持。 FF 16.0+ 和 Opera 12.10+ 支持 dppx 单位。

      IE 目前不支持 dppx 单位。

      (网站有点老了,dppx从v29开始就被Chrome支持了)

      @media
      only screen and (-webkit-min-device-pixel-ratio: 2),
      only screen and ( min-resolution: 192dpi),
      only screen and ( min-resolution: 2dppx) {
          /* Retina-specific stuff here */
      }
      

      dppx 和 dpi 有什么区别?

      DPI

      这个单位表示每英寸的点数。一个屏幕通常包含 72 或 96 dpi;打印的文档通常可以达到更高的 dpi。

      DPPX

      此单位表示每 px 单位的点数。由于 CSS in 与 CSS px 的固定比例为 1:96,因此 1dppx 相当于 96dpi,对应于由 image-resolution 定义的 CSS 中显示的图像的默认分辨率。

      source

      设备示例:

      iPhone 4 的屏幕为 3.5 英寸,尺寸为 640×960 像素。这计算为 326dpi 屏幕,它使用 2dppi,或每像素 2 个点。这个 2dppi 比率就是“视网膜”,以及为什么资产是 2 倍大小的原因。此外,这就是为什么 640px 宽度仅向浏览器显示为 320px 的原因,因为它为每 1 个基于 CSS 的像素绘制两个“点”/像素。 (将在两行像素上绘制一个 1px 的边框)

      【讨论】:

      • 我正在使用支持 dppx 的 Chrome - 我会更新我的问题
      • 查看网站了解更多关于跨浏览器 dpi css 的示例
      • 不是跨浏览器的问题。我只是在 Chrome 中测试它并试图让它工作!
      • 但是观察192dppx vs 2dppx,192是一个dpi值,其中dppx通常是1-3个tops
      • 进行了更改,但没有效果 - 不过会注意未来
      猜你喜欢
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      相关资源
      最近更新 更多