我想要在我的标签中使用动态文本作为某些元素的背景。由于这个原因,我不能使用图片(而是使用动态文本)。我该如何只使用CSS或JavaScript实现这个效果?
我想要在我的标签中使用动态文本作为某些元素的背景。由于这个原因,我不能使用图片(而是使用动态文本)。我该如何只使用CSS或JavaScript实现这个效果?
SVG文本背景图像
body {
background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' version='1.1' height='50px' width='120px'><text x='0' y='15' fill='red' font-size='20'>I love SVG!</text></svg>");
}
<p>I hate SVG!</p><p>I hate SVG!</p><p>I hate SVG!</p><p>I hate SVG!</p>
<p>I hate SVG!</p><p>I hate SVG!</p><p>I hate SVG!</p><p>I hate SVG!</p>
以下是 CSS 的缩进版本,以便您更好地理解。请注意,此方法不起作用,您需要使用上面代码段中的单行 SVG 代替:
body {
background-image:url("data:image/svg+xml;utf8,
<svg xmlns='http://www.w3.org/2000/svg' version='1.1'
height='50px' width='120px'>
<text x='0' y='15' fill='red' font-size='20'>I love SVG!</text>
</svg>");
}
不确定这个方法有多少可移植性(在Firefox 31和Chrome 36上可以运行),而且它在技术上是一张图片......但源代码是内联和纯文本的,并且可以无限缩放。
@senectus发现,如果您对其进行Base64编码,则在IE上效果更佳:https://dev59.com/6nM_5IYBdhLWcg3w3nRs#25593531
你可以在相对定位元素内部放置一个绝对定位元素:
#container {
position: relative;
}
#background {
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
z-index: -1;
overflow: hidden;
}
<div id="container">
<div id="background">
Text to have as background
</div>
Normal contents
</div>
这里有一个示例。
仅使用CSS的:before或:after伪元素可能是可能的(但非常hackish):
.bgtext {
position: relative;
}
.bgtext:after {
content: "Background text";
position: absolute;
top: 0;
left: 0;
z-index: -1;
}
<div class="bgtext">
Foreground text
</div>
这似乎可行,但你可能需要稍作调整。请注意,由于IE6不支持:after
,所以它无法在该浏览器中工作。
Ciro的关于包含文本的SVG Data URI背景的解决方案非常聪明。
然而,如果您只将纯SVG源代码添加到数据URI中,则无法在IE中使用。
为了解决这个问题并使其在IE9及以上版本中正常工作,请将SVG编码为base64。这是一个很好的工具。
所以这个:
background:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><text x="5%" y="5%" font-size="30" fill="red">I love SVG!</text></svg>');
变成这样:
background:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjx0ZXh0IHg9IjUlIiB5PSI1JSIgZm9udC1zaXplPSIzMCIgZmlsbD0icmVkIj5JIGxvdmUgU1ZHITwvdGV4dD48L3N2Zz4=');
已在IE9-10-11、WebKit(Chrome 37,Opera 23)和Gecko(Firefox 31)中进行了测试并且能正常工作。
@Ciro
你可以使用反斜杠"\"
来中断内联SVG代码。
在Chrome 54和Firefox 50中测试了以下代码:
body {
background: transparent;
background-attachment:fixed;
background-image: url(
"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' version='1.1' width='170px' height='50px'> \
<rect x='0' y='0' width='170' height='50' style='stroke:white; fill:gray; stroke-opacity: 0.3; stroke-width: 3px; fill-opacity: 0.7; stroke-dasharray: 10 5; stroke-linecap=round; '/> \
<text x='85' y='30' style='fill:lightBlue; text-anchor: middle' font-size='16' transform='rotate(10,85,25)'>I love SVG!</text></svg>");
}
我甚至测试过这个。
background-image: url("\
data:image/svg+xml;utf8, \
<svg xmlns='http://www.w3.org/2000/svg' version='1.1' width='170px' height='50px'> \
<rect x='0' y='0' width='170' height='50'\
style='stroke:white; stroke-width: 3px; stroke-opacity: 0.3; \
stroke-dasharray: 10 5; stroke-linecap=round; \
fill:gray; fill-opacity: 0.7; '/> \
<text x='85' y='30' \
style='fill:lightBlue; text-anchor: middle' font-size='16' \
transform='rotate(10,85,25)'> \
I love SVG! \
</text> \
</svg>\
");
它能正常工作(至少在Chrome 54和Firefox 50中可以使用 ==> 在NWjs和Electron中使用是有保证的)
(但在罕见情况下使用此方法,因为HTML方法是首选方式)。
.container{
position:relative;
}
.container::before{
content:"";
width: 100%; height: 100%; position: absolute; background: black; opacity: 0.3; z-index: 1; top: 0; left: 0;
background: black;
}
.container::after{
content: "Your Text"; position: absolute; top: 0; left: 0; bottom: 0; right: 0; z-index: 3; overflow: hidden; font-size: 2em; color: red; text-align: center; text-shadow: 0px 0px 5px black; background: #0a0a0a8c; padding: 5px;
animation-name: blinking;
animation-duration: 1s;
animation-iteration-count: infinite;
animation-direction: alternate;
}
@keyframes blinking {
0% {opacity: 0;}
100% {opacity: 1;}
}
<div class="container">here is main content, text , <br/> images and other page details</div>
<!DOCTYPE html>
<html>
<head>
<style>
:root:after {
content: "Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark Watermark ";
position: fixed;
transform: rotate(300deg);
-webkit-transform: rotate(300deg);
color: rgb(187, 182, 182);
top:0;
z-index: -1;
}
</style>
</head>
<body>
<p>hey my name is JHM</p>
</body>
</html>
background-text{
font-size:30px;
font-weight:900;
color:#f1f1f1;
position:absolute;
z-index:-1;
}
<div id="container">
<background-text> This is background</background-text>
This if foreground text
</div>
除非你需要为背景设置相对位置,否则你实际上不需要为容器设置"position:relative"。
我看到这篇文章是为了想要在div容器的背景上添加文本,这是我使用两个flex容器想出来的解决方案。
.foreground {
display: flex;
background-color: #f7fcfc;
justify-content: center;
align-content: center;
border-radius: 3px;
border: 2px solid #86cdb6;
margin: 1em;
width: 100px;
height: 100px;
}
.foreground p {
font-family: sans-serif;
font-size: 12px;
font-weight: 900;
color: #86cdb6;
margin: auto;
text-align: center;
z-index: 2;
}
.background {
position: absolute;
display: flex;
align-content: center;
justify-content: center;
width: inherit;
height: inherit;
z-index: 1;
overflow: hidden;
}
.background p {
font-family: sans-serif;
font-size: 22px;
font-weight: 400;
color: #ddf1ef;
text-align: center;
margin: auto;
}
<div class="foreground">
<div class="background">
<p>Background
<br> Background
<br> Background
<br> Background
</p>
</div>
<p>Foreground</p>
</div>