2013-08-29 45 views
7

我有一个背景图像,我想在其上覆盖特定位置上的几个框消息。有没有办法将盒子粘贴到图像上,以便它与图像一起缩放并保持它的确切位置?它可能需要缩放框内文本的字体大小。在特定位置的图像上覆盖文本框

在另一个说明中,如何更改背景不透明度而不影响其上的框。

这里是一个的jsfiddle链接:

UPDATE 我想要的结果看起来像this与路径的特定零件盒。当图像调整大小时,我的箱子会四处走动。似乎不清楚。

CSS

.back { 
    height: 85em; 
    margin-bottom: 5em; 
    background: url(http://kpv.s3.amazonaws.com/static/img/film.jpg) no-repeat; 
    background-size: contain; 
    color: #ffffff; 
    text-shadow: 1px 1px 1px #000000; 
} 
.box-message { 
    max-width: 15em; 
    min-height: 10em; 
    box-sizing: border-box; 
    box-shadow: 1px 0 3px rgba(0, 0, 0, 0.11), -1px 0 3px rgba(0, 0, 0, 0.11); 
    background: #fff; 
    color:#000; 
    padding: 25px 25px 35px 25px; 
    position: relative; 
} 
.flow_three { 
    margin-top: 3em; 
    margin-left: 5em; 
} 
.flow_two { 
    margin-top: 3em; 
    margin-left: 10em; 
} 
.flow_text h3 { 
    color: #1BB366; 
    font-size: 20px; 
} 
.flow_text p { 
    font-size: 18px; 
    line-height: 25px; 
} 
.back .container { 
    position: relative; 
    z-index: 2; 
} 
.container { 
    width: 940px; 
} 

HTML

<div class="back"> 
    <div class="container"> 
     <div class="box-message flow_text flow_three"> 
      <h3>text</h3> 

      <p>text txtegv dsf asd fsda f asdf f as df sadf .</p> 
     </div> 
     <div class="box-message flow_text flow_two"> 
      <h3>text</h3> 

      <p>text txtegv dsf asd fsda f asdf f as df sadf .</p> 
     </div> 
    </div> 
</div> 
+5

你应该知道已经jsFiddle会让我们更容易地帮你 – Itay

+0

jsfiddle添加! http://jsfiddle.net/zd3CA/ – Kiarash

+1

你会遇到一团糟,试图用CSS来做到这一切。你最好的选择是在使用jquery调整屏幕大小时设置框的宽度/高度/边距。如果你想用CSS来做所有事情,你的盒子缺少宽度:x%。你可以做margin-top:x%;等等,但它会很难让它看起来像你的例子和缩放比例,你希望得到的结果与CSS单独 – Frank

回答

1

您只需将图像作为背景图像应用到您的相对定位(父级)容器元素,并将'background-size'设置为'包含'(如您已经完成的那样)。

现在,如果您使用百分比宽度值定义您的(子)框并将它们的绝对位置与其位置的百分比(相对)值进行绝对定位。整体应该完美地放大和缩小。

+0

容器不会全部宽度。或者我可以做到这一点。你会只在一个元素上显示这个jsfilddle吗? – Kiarash

+0

这是一个小提琴:http://jsfiddle.net/QDWgs/ – Netsurfer

+0

这使用新的视口单位的字体大小已经有相当好的支持。 容器的填充底部取决于BG图像的纵横比和容器的宽度(例如,请参阅http://www.mademyday.de/css-height-equals-width-with-pure- css.html)。 如果您可能需要或想要做某种“微调”,主要取决于您想要支持的浏览器(版本)。 – Netsurfer

1

如果你说你想要一个背景图片为您的形式,只是通过CSS应用背景图像。 没有理由在表单后面创建一个元素作为背景,除非您打算通过js应用动画。即使那时我会建议使用AS2/AS3。

因此,正如我所说的通过CSS在表单上使用背景图像。

+1

如果不更改childs属性,则无法更改父元素的不透明度。 –

+0

解决方法:使用不同的元素为背景,就像我说的,我会建议AS2/AS3 – 19greg96

+0

定位您的其他元素。如果你不介意,你可以在jsfiddle上试试这个。 –

0

我建议使用svg。

我做了一个例子:

<svg width="640" height="480" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 
<!-- Created with SVG-edit - http://svg-edit.googlecode.com/ --> 

<g> 
    <title>Layer 1</title> 
    <image x="0" y="0" width="640" height="480" id="svg_1" xlink:href="http://kpv.s3.amazonaws.com/static/img/film.jpg"/> 
    <rect fill="#FF0000" stroke="#000000" stroke-width="5" x="92" y="77" width="130" height="79" id="svg_4"/> 
    <rect fill="#FF0000" stroke="#000000" stroke-width="5" x="91.5" y="213" width="130" height="79" id="svg_6"/> 
    <rect fill="#FF0000" stroke="#000000" stroke-width="5" x="91.5" y="338.5" width="130" height="79" id="svg_7"/> 
    <rect fill="#FF0000" stroke="#000000" stroke-width="5" x="281.5" y="195" width="186" height="113.03077" id="svg_8"/> 
    <rect fill="#FF0000" stroke="#000000" stroke-width="5" x="468.5" y="31" width="161" height="97.83847" id="svg_9"/> 
    <rect fill="#FF0000" stroke="#000000" stroke-width="5" x="474.50001" y="306.99999" width="144.99999" height="88.11538" id="svg_10"/> 
    <text xml:space="preserve" text-anchor="middle" font-family="serif" font-size="24" id="svg_2" y="124" x="157" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="0" stroke="#000000" fill="#000000">Asd</text> 
    <text id="svg_3" xml:space="preserve" text-anchor="middle" font-family="serif" font-size="24" y="262" x="155" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="0" stroke="#000000" fill="#000000">Asd</text> 
    <text id="svg_5" xml:space="preserve" text-anchor="middle" font-family="serif" font-size="24" y="387" x="157" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="0" stroke="#000000" fill="#000000">Asd</text> 
    <text id="svg_11" xml:space="preserve" text-anchor="middle" font-family="serif" font-size="24" y="261" x="374" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="0" stroke="#000000" fill="#000000">Asd</text> 
    <text id="svg_12" xml:space="preserve" text-anchor="middle" font-family="serif" font-size="24" y="88" x="553" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="0" stroke="#000000" fill="#000000">Asd</text> 
    <text id="svg_14" xml:space="preserve" text-anchor="middle" font-family="serif" font-size="24" y="357" x="548" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="0" stroke="#000000" fill="#000000">Asd</text> 
</g> 
</svg> 

有人用此工具:http://svg-edit.googlecode.com/svn/branches/2.6/editor/svg-editor.html

一旦你的SVG完成后,你可以简单地链接到它在你的CSS背景属性,瞧你有它使用包含元素调整大小。

或者你可以计算每个元素的相对于包含元素的位置和大小,并根据它来编写你的css。

0

为了达到您想要的效果,首先图像必须与.box-message元素共享相同的空间参考(例如坐标系统)。这是通过将图像放置在标签中并使其成为.box-message元素的兄弟来实现的。我们还需要该图像是定义父级高度和宽度的唯一子元素。为此,.box-message元素设置为相对于父级的绝对定位,并且图像的width设置为100%。这允许图像与父容器一起调整大小并保持其纵横比。

对于绝对定位现在在.box-message元素,我们设置它们的坐标相对于图像与topleft属性。这会将.box-message元素的左上角锚定到图像上的特定点。要从中心点定位.box-message元素,您可以添加transform: translate3d(-50%,-50%,0);属性。您可以在.box-message元素上设置最小/最大宽度/高度属性,并使其相对于图像调整大小。

最后,可以通过在视口单元中指定大小(vw和/或vh)来调整字体大小。看看这个教程和例子:http://css-tricks.com/examples/ViewportTypography/

每当调整视口,字体大小应相应地改变。

看看这个例子小提琴:http://jsfiddle.net/3wq25/1/

+0

谢谢。除了字体,你的jsfiddle代码工作得很好。盒子在正确的位置,但字体不变,所以看起来很奇怪。 – Kiarash

+0

@Kiarash我也注意到了这一点。我想知道这是否是它在iframe中的结果。我会看看并尝试修复它。 – BigMacAttack

+0

@Kiarash显然它是一个浏览器[bug](https://code.google.com/p/chromium/issues/detail?id=124331),可以通过几行javascript轻松修复。新的小提琴:http://jsfiddle.net/3wq25/1/ – BigMacAttack

1

更新

调整大小宽度保持盒子就位与不透明的背景

您可以直接设置背景图片的元素,并定义background-width设置为cover让图像按比例覆盖背景。

但是,这不会投射固定在某个位置的任何子元素。

此外 - 不能为背景图像设置单独的不透明度。需要将其设置在图像所附的元素上,这意味着它也会影响子元素。

为了解决这个一个可以:

  • 编辑图像本身和保存出具有所需不透明度PNG。
  • 可以使用画布修改不透明度(请参阅下面的解决方案)
  • 或者可以使用图像元素作为该元素的子元素。后者对于这种情况足够有效(并且比使用画布更有效)。

这是一个简单但有效的解决方案(Firefox中存在问题,因为此浏览器目前不支持必需的CSS属性,但提供了一个可能的选项)。

HTML:

的HTML代码的小重结构:

<div id="container"> 
    <img src="http://kpv.s3.amazonaws.com/static/img/film.jpg" width="794" height="477" /> 
    <div class="box-message flow_one">Ipsum lorem dummy text. 
     <br>Ipsum lorem dummy text. 
     <br>Ipsum lorem dummy text. 
     <br> 
    </div> 
    <div class="box-message flow_two">Ipsum lorem dummy text. 
     <br>Ipsum lorem dummy text. 
     <br>Ipsum lorem dummy text. 
     <br> 
    </div> 
</div> 

CSS:

html, body { 
    width:100%; 
    height:100%; 
    margin:0; 
    padding:0; 
} 

/* Important: use fixed width/height for container */ 
#container { 
    position:relative; 
    width:794; 
    height:477; 
} 

/* Let image follow width 100% and height auto-adjusted */ 
#container > img { 
    width:100%; 
    height:auto; 
    opacity:0.5; 
} 

.box-message { 
    position:absolute; 
    border:2px solid #000; 
    border-radius:7px; 
    background:rgba(255, 255, 255, 0.85); 
    padding:7px; 
} 
.flow_one { 
    left:12%; 
    top:10%; 
} 
.flow_two { 
    left:50%; 
    top:42%; 
} 

(为什么图象是单独在这里的唯一原因是为儿童元素提供不同的不透明度。)

附加提示:如果您需要使用与设备屏幕相关的不同字体大小,则可以使用@media查询覆盖font-size

的JavaScript:

我们需要一个小片段用JavaScript相比图像/背景宽度来计算宽比。

该比率则用于zoom属性,我们设定的方案,因为这将扩大在它(为Firefox,我们需要使用transform:scale(f)父母和一切的CSS规则,但是这有问题,因为它似乎与当前的积累背景宽度)。

/// init parent element at load 
redraw(); 

/// call everytime we resize 
window.onresize = redraw; 

/// calc ratio for zoom 
function redraw() { 
    /// ratio f = window width/background width (hard-coded for demo) 
    var f = window.innerWidth/794; 
    //FF: container.style.transform = 'scale(' + f + ')'; 
    container.style.zoom = f.toFixed(2); 
} 

ONLINE DEMO HERE(Chrome和其他浏览器支持CSS zoom

更新2

由于无论你如何扭曲和转动的东西,你会遇到兼容性问题,这种方法以及CSS方法。一个浏览器支持一件事,另一个浏览器支持另一件事但不是第一件等等,他们还没有。

更坚实的方法(远离旧的IE浏览器)是使用纯JavaScript或诸如jQuery的包装来执行元素的位置,大小,字体等的手动计算。

一个可以通过测试像这样的检查,如果浏览器是能够使用例如变焦功能:

if (typeof container.style.zoom === 'undefined') { 

    /// manually calculate relations 

} else { 
    container.style.zoom = factor; 
} 

当然,计算部分是不是作为需要通过元件进行迭代这里示出和比较繁琐以适合您的最终解决方案的方式如此。

不透明度

如果单独的图像元件也没有背景图像(预先定义的不透明度)是一个选项,然后这个解决方案提供了该选项。请注意,在调整大小的情况下,这不是非常有效,但可以作为最后解决方案。

下面是使用帆布一个例子:

var img = document.createElement('img'), 

    canvas = document.createElement('canvas'), 
    ctx = canvas.getContext('2d'), 

    opacity = 0.5; 

/// when image has loaded and a resize event occured 
img.onload = window.onresize = draw; 

/// resize canvas and draw image at given opacity 
function draw() { 

    /// set canvas = window client size 
    canvas.width = window.innerWidth; 
    canvas.height = window.innerHeight; 

    /// set opacity of canvas 
    ctx.globalAlpha = opacity; 

    /// draw image to canvas size 
    ctx.drawImage(img, 0, 0, canvas.width, canvas.height); 

    /// set background to resized image 
    container.style.background = 'url(' + canvas.toDataURL() + ') no-repeat left top'; 
} 

/// request cross-origin sharing (if different domain than page) 
img.crossOrigin = 'anonymous'; 

/// set image source and start loading image 
img.src = 'http://i.imgur.com/Y77lhhL.jpg'; 

ONLINE DEMO HERE

注:对于这个工作,你需要满足的要求CORS(跨域资源共享)。这意味着图像是从某个原点(域,路径)加载 - 或者 - 如果从服务器允许跨源共享的另一个原点加载。

你可以看到小提琴演示,你提供的原始图像链接将无法使用这种方法,所以我将图像移动到imgur.com,它允许跨源共享,它的工作原理。

+0

对于第一部分,我并不是指缩小浏览器。我的意思是重新调整浏览器的大小。 (阅读手机兼容,虽然我只关心不同的屏幕尺寸),但您的不透明解决方案很聪明。 – Kiarash

+0

只是要清楚,我希望这是屏幕的宽度,不管屏幕的大小。 – Kiarash

+0

@Kiarash我更新了CSS并在答案中拨弄。如果你想调整成比例,我还添加了一个注释。 – K3N

1

该解决方案可以使用像%和em这样的流体单位并使用绝对位置。

的风格是:

*,html{ 
margin:0px; 
padding:0px; 
} 
.back { 
    height: 51em; 
    margin-bottom: 5em; 
    background: url(http://kpv.s3.amazonaws.com/static/img/film.jpg) no-repeat; 
    background-size: contain; 
    color: #ffffff; 
    text-shadow: 1px 1px 1px #000000; 
    width: 60%; 
    } 
    .back .container { 
    position: relative; 
    z-index: 2; 
    } 
    .container { 
    width: 100%; 
    height: 100%; 
    } 
    .box-message { 

    box-sizing: border-box; 
    box-shadow: 1px 0 3px rgba(0, 0, 0, 0.11), -1px 0 3px rgba(0, 0, 0, 0.11); 
    background: #fff; 
    color: #000; 
    padding: 1% 2%; 
    width: 26.66%; 
    } 
    .flow_three { 
    margin-top: 5%; 
    margin-left: 5%; 
    position: absolute; 
    } 
    .flow_two { 
    margin-top: 1%; 
    float: right; 
    right: 2%; 
    position: absolute; 
    } 
    .flow_center{ 
    position: absolute; 
    margin-top: 26%; 
    margin-left: 44%; 
    } 
    .flow_text h3 { 
    color: #1BB366; 
    font-size: 1.25em; 
    } 
    .flow_text p { 
    font-size: 1.125em; 
    line-height: 95%; 
    } 

的HTML是

<div class="back"> 
<div class="container"> 
    <div class="box-message flow_text flow_three"> 
     <h3>text</h3> 

     <p>text txtegv dsf asd fsda f asdf f as df sadf .</p> 
    </div> 
    <div class="box-message flow_text flow_two"> 
     <h3>text</h3> 

     <p>text txtegv dsf asd fsda f asdf f as df sadf .</p> 
    </div> 
    <div class="box-message flow_text flow_center"> 
     <h3>text</h3> 

     <p>text txtegv dsf asd fsda f asdf f as df sadf .</p> 
    </div> 
    </div> 
</div> 
0

所以......没有人意识到这是这容易吗?

CSS:

.img { 
background-image:url('image.jpg'); 
width: 100%; 
height: 200px; 
padding: 200px; 
margin: 0px; 
} 

HTML:

<table class="img"><tr><td> 

<h1>Text Here</h1> 

<h3>Text Here</h3> 

</td></tr></table> 
0

我会lettering.js做到这一点。 http://letteringjs.com/

设置默认文本大小,然后通过添加填充来保持相对框大小。

两者都应该轻松扩展。

2
.should_work_on_any_browser{ /*For Opacity*/ 
    min-height: 100px; 
    margin: auto; 
    -moz-opacity: 0.52; 
    opacity: 0.52; 
    -ms-filter:"progid:DXImageTransform.Microsoft.Alpha"(Opacity=52); 
    position:relative; 
}