在特定位置的图像上叠加文本框

时间:2013-08-29 21:30:35

标签: javascript html css css3

我有一张背景图片,我想在其上叠加一些特定位置的盒子信息。有没有办法将盒子粘贴到图像上,以便它与图像一起缩放并保持其准确位置?它可能还需要缩放框内文本的字体大小。

另一方面,我如何更改背景不透明度而不影响其上的方框。

这是jsfiddle的链接:http://jsfiddle.net/zd3CA/

更新 我希望结果看起来像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>

9 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

如果您要为表单填写背景图片,只需通过css应用背景图片即可。 除非您计划通过js应用动画,否则没有理由在窗体后面创建元素作为背景。即便如此,我建议使用AS2 / AS3。

所以,正如我所说,通过css在你的表格上使用背景图片。

答案 2 :(得分:1)

您只需将图像作为“background-image”应用于相对定位(父级)容器元素,并将“background-size”设置为“包含”(如您所做)。

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

答案 3 :(得分: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>

答案 4 :(得分: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。

答案 5 :(得分: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/

每当调整视口时,font-size应相应更改。

查看此示例小提琴:http://jsfiddle.net/3wq25/1/

答案 6 :(得分:0)

<强>更新

调整宽度,使用不透明背景保持盒子

您可以直接将背景图像设置为元素,并将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%;
}

(此处图像分离的唯一原因是允许子元素使用不同的不透明度。)

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

<强> JavaScript的:

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

然后将此比率用于我们设置编程的CSS规则的zoom属性,因为这将扩展父级及其中的所有内容(对于Firefox,我们需要使用transform:scale(f),但这有问题因为它似乎积累了背景的当前宽度。)

/// 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 (适用于支持CSS的Chrome和其他浏览器zoom

更新2

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

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

可以通过以下测试来检查浏览器是否能够使用缩放:

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

    /// manually calculate relations

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

当然,计算部分比这里显示的更繁琐,因为您需要以适合您最终解决方案的方式迭代元素等等。

不透明度

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

以下是使用canvas的示例:

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 ,它允许跨源共享并且它可以正常工作。

答案 7 :(得分: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>

答案 8 :(得分:0)

我会用lettering.js做这件事。 http://letteringjs.com/

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

两者都应该容易扩展。