我有一张背景图片,我想在其上叠加一些特定位置的盒子信息。有没有办法将盒子粘贴到图像上,以便它与图像一起缩放并保持其准确位置?它可能还需要缩放框内文本的字体大小。
另一方面,我如何更改背景不透明度而不影响其上的方框。
这是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>
答案 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
元素上的绝对定位,我们使用top
和left
属性设置相对于图像的坐标。这会将.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
,使图像按比例覆盖背景。
但是,这不会将任何固定到某个位置的子元素投射出来。
此外 - 无法为背景图像设置单独的不透明度。需要在图像附加的元素上设置它,这意味着它也会影响子元素。
要解决这个问题,可以:
这是一个简单但有效的解决方案(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)