【问题标题】:HTML background image offset by x pixels from the centerHTML 背景图像从中心偏移 x 个像素
【发布时间】:2011-08-24 07:43:22
【问题描述】:

我想将一张图片作为网页的背景,但让它相对于中心偏移一些像素。

我该怎么做?

我想要:

background-image: url("bg.png");
background-position: 25% center;
background-attachment: fixed;
background-repeat: no-repeat;

但我想要的不是 25%,而是“中心 - 50px”。有什么解决办法吗?

【问题讨论】:

  • 您要将图像向左还是向右移动并在其周围保留空白?
  • 能否修改图片并在其右侧添加50px的空间,然后再设置为背景图片?还是更复杂的图像?
  • 如果你想从左或右移动 - CSS3(imo更好的解决方案)在这里:stackoverflow.com/questions/3197250/…

标签: html css


【解决方案1】:

我相信我有一个可以实现您想要的解决方案:

背景图像(特别是页面背景)相对于中心偏移了多个像素。

这仅使用 HTML 和 CSS 工作 - 不需要 javascript。


更新

现在可以使用 background-positioncalc 作为 CSS 单元轻松实现。

以下 CSS 将实现与之前解决方案相同的结果(请参阅下面的“原始解决方案”):

#background-container {
    width: 100%;

    background-image: url("background-image.png");
    background-position: calc(50% - 50px) 50%;
    background-repeat: no-repeat;
}

注意:如果您需要支持旧版 IE,请勿使用此方法。


原方案

#background-container {
    width: 100%;
    left: -100px; /* this must be TWICE the required offset distance*/
    padding-right: 100px; /* must be the same amount as above */

    background-image: url("background-image.png");
    background-position: center;
    background-repeat: no-repeat;
}

它的作用是将整个容器水平移动指定的量(在本例中为向左 100 像素)。因为背景图片相对于容器居中,所以它会随着容器向左移动。

内边距修复了由于移动而出现在容器右侧的 100 像素空白区域。背景图像通过填充显示)。因为浏览器使用边框值而不是默认的内容框值来计算背景大小和定位,所以背景图像有效地向右移动了 50 像素 - 填充距离的一半。 (感谢 ErikE 的澄清)。

所以你的偏移/填充必须是所需偏移距离的两倍。

我在这里为您准备了一个示例页面: http://www.indieweb.co.nz/testing/background-offset-center.html

尝试调整窗口大小。您会看到紫色和蓝色背景图片(覆盖在标记页面中心的较深背景图片上)与页面中心左侧正好保持 50 像素(偏移/填充距离的一半)。


【讨论】:

  • 这应该是正确的答案。当然,另一个答案是向图像添加负空间以实现偏移是可行的,但从“如何仅使用代码实现此效果?”这一点更正确。立场。
  • 从技术上讲,填充不会像您所说的那样“增加整个容器宽度”。您的修复仍然有效,因为背景图像通过填充显示,因此所有浏览器(显然和特别)都使用边框框而不是内容框来计算背景大小和定位。在一般 CSS 定位中,填充仅在 Internet Explorer 中“添加到整个容器宽度”,因为它使用 box-sizing: border-box 而不是其他浏览器使用的 box-sizing: content-box
  • 值得注意的是,这只会让您将图像向左轻推。这对我来说非常适合向左移动,但如果你向右移动,则会拉伸页面。
  • 此解决方案是否适用于 FIXED 背景附件?如果背景粘在相对定位的父级上,则填充和位置将被忽略。也许应该在那个父母身上做这个把戏?
  • 我在使用它以 horizo​​ntal 偏移量居中时遇到了麻烦(例如background-position: top calc(50% - 50px),但我发现background-position-x: calc(50% - 50px) 工作得很好(至少在 Chrome 60 中)跨度>
【解决方案2】:

使用background-position: center;background-position: 50% 50%; 相同。

所以你可以使用calc 在 CSS 中做一些简单的数学运算来代替任何长度值,例如:

background-position: calc(50% - 50px) 50%;

将背景图片居中,但将其向左移动 50 像素。

【讨论】:

  • 这非常适合我的情况,谢谢!但是,值得注意的是,calc() 目前被认为是实验性的,而不是universally supported
  • 很好的答案。现在在 2016 年对 calc() 有很好的支持:d.pr/i/GrAk
  • 注意:IE9 中的部分支持是指在用作背景位置值时浏览器崩溃。 (来源:caniuse.com)。浏览器支持 Calc 和 IE9 一样原始,但 IE9 在 background-position 上使用时不支持 calc。
  • 仅供参考:在 Browserstack 中进行测试,它不会使我的 IE9 崩溃(我正在使用 background-position-xbackground-position-y 明确)。那么也许它已经修复或仅适用于某些情况?
【解决方案3】:

所以你希望它通过向左移动 50 个像素来居中。我会以透明空间的形式将 50 像素添加到图像中,除非您正在处理绝对尺寸。

【讨论】:

  • 你不能在 jpeg 中具有透明度。
  • 是的,但是在 gif 和 png 中你可以。 OP 声明了 png,有时可行的解决方法是将我的方法替换为背景颜色而不是透明。
  • 我需要睡觉,我可以发誓它有 .jpg,在这种情况下它是有效的 ;)
【解决方案4】:

没有明显的 CSS 答案。您要么需要使用 JavaScript 来计算值,要么做一些棘手的事情。您可以尝试保留 background-position:25% center 并添加 position:relative;left:-50pxmargin-left:-50px 但这些可能不起作用,具体取决于您使用 DOM 元素的方式。

【讨论】:

    【解决方案5】:

    我为此找到的唯一方法是将背景放在另一个 div 中,然后使用 javascript 重新定位...

    <style>
        body {
            width: 100%;
            overflow: hidden;
            }
        #bg {
            position: absolute;
            background: url(images/background.jpg) center top;
            }
    </style>
    
    <script>
        function recenter(){
            var $pos = $('#content').offset().left;
            $('#bg').css('left',$pos-580);
        }
        recenter();
        $(window).resize(function(){ recenter(); });
    </script>
    
    <body>
        <div id="bg"></div>
        <div id="content">
            blah
        </div>
    </body>
    

    【讨论】:

      【解决方案6】:

      如果你知道图片的宽度,你可以使用这个:

      background-position: (BgWidth - 50)px 0px;
      

      请注意,您不能这样,即您需要计算 (BgWidth - 50),然后将数字写在那里。

      如果你不知道宽度,你可以使用 Javascript(带或不带 jQuery)然后使用这个:

      $(#ID).css('background-position', (BgWidth - 50)+'px 0px');
      

      【讨论】:

        【解决方案7】:

        卢克的回答很好,

        还有一件事,如果你的块宽度大于屏幕分辨率,你必须把你的块放在另一个容器中并这样做:

        #container{
          position:relative;
          overflow:hidden;
        }
        
        #shadowBox{
          width: 100%;
          left: -100px; /* this must be TWICE the required offset distance*/
          padding-right: 100px; /* must be the same amount as above */
          background-image: url("background-image.png");
          background-position: center;
          background-repeat: no-repeat;
          position:absolute: /*this is needed*/
        }
        

        【讨论】:

          【解决方案8】:

          我的回答肯定为时已晚,但不知何故我找到了另一个解决方案。

          padding-left: 100px; /* offset you need */
          padding-right: 100%;
          

          padding-right: 100px;
          padding-left: 100%;
          

          例子效果一样。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-07-05
            • 2011-04-05
            • 2011-03-12
            • 2023-03-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多