Có cách nào để sử dụng văn bản làm nền với CSS không?


92

Tôi muốn sử dụng văn bản động làm nền cho các phần tử nhất định trong thẻ của mình. Vì điều này, tôi có thể sử dụng hình ảnh (văn bản động). Làm cách nào để làm điều đó chỉ với CSS hoặc JavaScript?

Câu trả lời:


81

Bạn có thể có một phần tử được định vị tuyệt đối bên trong phần tử được định vị tương đối của mình:

<div id="container">
    <div id="background">
    Text to have as background
    </div>
    Normal contents
</div>

Và sau đó là CSS:

#container {
   position: relative;
}

#background {
   position: absolute;
   top: 0;
   left: 0;
   bottom: 0;
   right: 0;
   z-index: -1;
   overflow: hidden;
}

Đây là một ví dụ về nó .


146

Hình nền văn bản 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>

Đây là phiên bản CSS thụt lề để bạn có thể hiểu rõ hơn. Lưu ý rằng điều này không hoạt động , thay vào đó bạn cần sử dụng lớp lót duy nhất SVG từ đoạn mã trên:

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>");
}

Không chắc nó có tính di động như thế nào (hoạt động trên Firefox 31 và Chrome 36) và về mặt kỹ thuật nó là một hình ảnh ... nhưng nguồn là nội tuyến và văn bản thuần túy, và nó có tỷ lệ vô hạn.

@senectus nhận thấy rằng nó hoạt động tốt hơn trên IE nếu bạn mã hóa base64: https://stackoverflow.com/a/25593531/895245


Hấp dẫn. Tôi chỉ có thể được điều này để làm việc trong Firefox 31, nhưng không phải Chrome 36 hoặc Safari 7.
JP Richardson

@JPRichardson Đúng, ở đây cũng vậy. Trên Chrome 36, tôi có ấn tượng rằng nền ở đó, nhưng trên các chữ cái rất nhỏ. Có lẽ tôi đang quên đặt một số thông số kích thước nền / SVG?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Ya, tôi đang thử nghiệm nó vào lúc này ... có vẻ như có thể là "viewBox"? Tôi vẫn đang lộn xộn với nó.
JP Richardson

1
Ciro: dựa trên câu trả lời của bạn, tôi đã có thể kết hợp điều này với nhau ... hoạt động khá tốt! Cảm ơn! codepen.io/jprichardson/pen/GnxKr
JP Richardson

2
@CiroSantilli 烏坎 事件 2016 六四 事件 法轮功 câu trả lời tuyệt vời! Bạn có bất kỳ ý tưởng nào về cách cải thiện kết xuất trên Chrome không? Nó trông thực sự tồi tệ ở đó. Cảm ơn trước
Alejandro García Iglesias

47

Có thể có (nhưng rất khó) chỉ với CSS sử dụng các phần tử giả: before hoặc: after:

.bgtext {
  position: relative;
}

.bgtext:after {
  content: "Background text";
  position: absolute;
  top: 0;
  left: 0;
  z-index: -1;
}
<div class="bgtext">
  Foreground text
</div>

Điều này có vẻ hiệu quả, nhưng có thể bạn sẽ cần chỉnh sửa một chút. Cũng lưu ý rằng nó sẽ không hoạt động trong IE6 vì nó không hỗ trợ :after.


Cập nhật: Hiện tại, tất cả các trình duyệt hiện đại đều hỗ trợ các phần tử giả. Ví dụ, đó là cách FontAwesome hoạt động cho các biểu tượng CSS (sử dụng: before trên các phần tử nội tuyến).
Cédric Françoys

Chỉ cần lưu ý rằng Firefox không cho phép: before và: after trên các phần tử không thể có nội dung bên trong, như các trường nhập liệu. Điều này tôn trọng thông số CSS chính thức.
Nicolas Bouliane

21

Giải pháp của Ciro về một nền SVG Data URI có chứa văn bản là rất thông minh.

Tuy nhiên, nó sẽ không hoạt động trong IE nếu bạn chỉ thêm nguồn SVG thuần túy vào URI dữ liệu.

Để giải quyết vấn đề này và làm cho nó hoạt động trong IE9 trở lên, hãy mã hóa SVG thành base64. Đây là một công cụ tuyệt vời.

Vì vậy, điều này:

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>');

Trở thành cái này:

background:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjx0ZXh0IHg9IjUlIiB5PSI1JSIgZm9udC1zaXplPSIzMCIgZmlsbD0icmVkIj5JIGxvdmUgU1ZHITwvdGV4dD48L3N2Zz4=');

Đã thử nghiệm và nó hoạt động trên IE9-10-11, WebKit (Chrome 37, Opera 23) và Gecko (Firefox 31).

http://jsfiddle.net/qapp5dLn/


1
Đây là một công cụ tốt hơn: jpillora.com/base64-encoder đơn giản, không có lỗi, tự động điền, xem trước hình ảnh. Đúng, nó tốt hơn trong những bước nhảy vọt.
Jack Giffin

9

@Ciro

Bạn có thể ngắt mã svg nội dòng bằng dấu gạch chéo ngược "\"

Đã kiểm tra bằng mã bên dưới trong Chrome 54 và 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>");
}

Tôi thậm chí đã kiểm tra điều này,

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>\
");

và nó hoạt động (ít nhất là trong Chrome 54 & Firefox 50 ==> sử dụng trong NWjs & Electron guarenteed)


5

Sử dụng CSS thuần túy:

(Nhưng sử dụng điều này trong những trường hợp hiếm hoi, vì phương pháp HTML là CÁCH ƯU ĐÃI ).

.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>


2

Bạn có thể làm cho phần tử chứa văn bản bg có thứ tự xếp chồng thấp hơn (chỉ số z, vị trí) và thậm chí có thể đặt độ mờ. Vì vậy, phần tử bạn cần ở trên cùng sẽ cần thứ tự xếp chồng cao hơn (chỉ số z: 5; vị trí: tương đối; đối với ví dụ) và phần tử phía sau sẽ cần thứ gì đó thấp hơn (mặc định hoặc chỉ là chỉ số z thấp hơn như 3 và vị trí: tương đối ;).


0

Tôi hy vọng điều này có thể giúp bạn

<!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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.