Bóng văn bản bên trong với CSS


107

Tôi hiện đang chơi với CSS3 và cố gắng đạt được hiệu ứng văn bản như thế này (bóng mờ bên trong màu đen):

Nhưng tôi không thể tìm ra cách tạo bóng chữ bên trong văn bản. Tôi tự hỏi liệu có còn khả thi không vì phần tử box-shadow có thể hiển thị bóng bên trong như thế này:

box-shadow: inset 0px -5px 10px 0px rgba(0, 0, 0, 0.5);

Bất kỳ ý tưởng?


3
Không câu trả lời cho điều này nếu bạn không chuẩn bị để đi cho một số ảo ảnh quang học ...
Aaria Carter-Weir

Câu trả lời:


105

Đây là một mẹo nhỏ mà tôi đã khám phá ra bằng cách sử dụng các phần tử giả :before:after:

.depth {
    color: black;
    position: relative;
}
.depth:before, .depth:after {
    content: attr(title);
    color: rgba(255,255,255,.1);
    position: absolute;
}
.depth:before { top: 1px; left: 1px }
.depth:after  { top: 2px; left: 2px }

Thuộc tính tiêu đề cần giống với nội dung. Demo: http://dabblet.com/gist/1609945


1
Đẹp! Sáng tạo :) Vẫn không giống như Photoshop như tôi muốn. Bạn có thể đặt các giá trị trên cùng / bên trái mỗi giá trị 5px để đạt được độ lệch bóng bên trong 5px nhưng sau đó chữ cái bị rò rỉ ở đầu bên kia - trông tuyệt vời cho 1px và 2px nhưng lạ đối với các giá trị cao hơn.
ericteubert

1
Vâng, nó chỉ trông đẹp với một chút màu trắng ở phía dưới. Bất kỳ nhiều hơn 2px sẽ phá hủy giao diện.
Web_Designer

1
Tuyệt vời! Bạn cũng có thể sử dụng điều này để làm văn bản màu trắng bằng cách tăng độ mờ lên .9 hoặc tạo các cạnh vát bằng cách giữ độ mờ ở mức .1 và đảo ngược màu sắc. (+1)
JohnB

Giải pháp tuyệt vời. Tuy nhiên, thất bại trong sự kết hợp với gradient văn bản fe; (quá xấu đoán chúng ta sẽ phải đợi cho CSS4 đối với một số năm hoặc lâu hơn cho các hiệu ứng văn bản tuyệt vời..
Michael Trouw

Điều đó thật tuyệt trong chrome, tôi đang cố gắng thực hiện một dự phòng thay thế cho FF, điều này sẽ không áp dụng cho Chrome nếu không sử dụng JS và một lớp không gian tên. Mọi suy nghĩ. PS Hoạt động tuyệt đẹp trên bg hiệu ứng leathr, trông giống như một con tem thương hiệu.
Will Hancock

43

Bạn sẽ có thể làm điều đó bằng cách sử dụng text-shadow, hãy suy nghĩ như sau:

.inner_text_shadow
{
    text-shadow: 1px 1px white, -1px -1px #444;
}

đây là một ví dụ: http://jsfiddle.net/ekDNq/


8
Hum, ừ, đại loại. Hiệu ứng hình ảnh tương tự với các thông số này nhưng nó vẫn là một cái bóng phía sau phông chữ. Không phải bên trong. Trong ví dụ của tôi, tôi thậm chí làm mờ bóng bên trong và điều đó sẽ phá hủy hiệu ứng ở đây. Vì vậy, giải pháp tốt nhất ... nhưng nhưng vẫn chỉ là một hình ảnh ảo tưởng Hack;)
ericteubert

2
Lưu ý rằng bạn đang làm cho phông chữ béo hơn bằng cách làm điều này. Đối với các phông chữ có kích thước vừa và nhỏ, bạn có thể không muốn.
Jonatan Littke

20

Đây là cách thử tốt nhất của tôi:

    .inner_shadow {
    color:transparent;
    background-color:white;
    text-shadow: 0 0 20px rgba(198,28,39,0.8), 0 0 0 black;
    font-family:'ProclamateHeavy';  // Or whatever floats your boat
    font-size:150px;
    }
   
    <span class="inner_shadow">Inner Shadow</span>
   

Vấn đề là làm sao để kẹp cái bóng chảy ra xung quanh viền !!! Tôi đã thử trong webkit bằng cách sử dụng background-clip: text, nhưng webkit hiển thị bóng trên nền nên nó không hoạt động.

Tạo Mặt nạ văn bản bằng CSS?

Nếu không có lớp mặt nạ trên cùng thì không thể tạo bóng bên trong thực sự trên văn bản.

Có lẽ ai đó nên khuyên W3C thêm background-clip: reverse-text , điều này sẽ cắt một mặt nạ xuyên qua nền thay vì cắt nền để vừa với bên trong văn bản.

Hoặc hiển thị bóng chữ như một phần của nền và cắt nó bằng background-clip: text.

Tôi đã cố gắng định vị tuyệt đối một phần tử văn bản giống hệt phía trên nó, nhưng vấn đề là background-clip: văn bản cắt nền để vừa với bên trong văn bản, nhưng chúng tôi cần điều đó ngược lại.

Tôi đã thử sử dụng text-stroke: 20px white; trên cả phần tử này và phần tử phía trên nó, nhưng nét chữ đi vào cũng như ra ngoài.

Phương pháp thay thế

Vì hiện tại không có cách nào để tạo mặt nạ văn bản ngược trong CSS, bạn có thể chuyển sang SVG hoặc Canvas và tạo hình ảnh thay thế văn bản với ba lớp để có được hiệu ứng của bạn.

Vì SVG là một tập hợp con của XML, văn bản SVG vẫn có thể lựa chọn và có thể tìm kiếm được, và hiệu ứng có thể được tạo ra với ít mã hơn Canvas.

Sẽ khó hơn để đạt được điều này với Canvas vì nó không có dom với các lớp như SVG.

Bạn có thể tạo SVG phía máy chủ hoặc dưới dạng phương pháp thay thế văn bản javascript trong trình duyệt.

Đọc thêm:

SVG so với Canvas:

http://dev.opera.com/articles/view/svg-or-canvas-choosing-between-the-two/

Cắt và tạo mặt nạ với Văn bản SVG:

http://www.w3.org/TR/SVG/text.html#TextElement


2
Tôi đã đăng một lời giải thích chi tiết hơn về sự cố gắng tốt nhất của bạn, với một ví dụ. Kiểm tra nó ra!
Alba Mendez

1
Ví dụ về điều này được đưa đến cực kỳ .
Alba Mendez

Có một cái bóng bên ngoài trong ví dụ của bạn
AlexKh

12

Giải thích chính xác hơn về CSS trong câu trả lời của kendo451 .

Có một cách khác để có được ảo giác bóng bên trong lạ mắt,
mà tôi sẽ giải thích trong ba bước đơn giản. Giả sử chúng ta có HTML này:

<h1>Get this</h1>

và CSS này:

h1 {
  color: black;
  background-color: #cc8100;
}

Đó là một khẩu hiệu hay

Bước 1

Hãy bắt đầu bằng cách làm cho văn bản trong suốt:

h1 {
  color: transparent;
  background-color: #cc8100;
}

Đó là một cái hộp

Bước 2

Bây giờ, chúng ta cắt nền đó thành hình dạng của văn bản:

h1 {
  color: transparent;
  background-color: #cc8100;
  background-clip: text;
}

Nền là văn bản!

Bước 3

Bây giờ, điều kỳ diệu: chúng ta sẽ đặt một vệt mờ text-shadow, sẽ ở phía trước nền , do đó tạo ấn tượng về một cái bóng bên trong!

h1 {
  color: transparent;
  background-color: #cc8100;
  background-clip: text;
  text-shadow: 0px 2px 5px #f9c800;
}

Chúng tôi hiểu rồi!  Yay!

Xem kết quả cuối cùng .

Nhược điểm?

  • Chỉ hoạt động trong Webkit ( background-clipkhông được text).
  • Nhiều bóng? Đừng nghĩ nữa.
  • Bạn cũng có được một ánh sáng bên ngoài.

"Nhiều bóng tối? Thậm chí không nghĩ." Về text-shadow: 1px 1px 1px #000, 3px 3px 5px blue;thì sao?
Morpheus

@Morpheus Một trong những nhược điểm của phương pháp này là bạn không thể áp dụng nhiều bóng cho văn bản.
Alba Mendez

Kích thước và độ sáng của ví dụ này gây khó khăn cho việc xem những người khác. Bạn có thể chuyển chúng thành đoạn mã không? Cảm ơn!
Josh Habdas

12

Một ví dụ thanh lịch mà không cần trình bao bọc định vị hoặc nội dung trùng lặp trong đánh dấu:

:root {
  background: #f2f2f2;
}
h1 {
  background-color: #565656;
  font: bold 48px 'Futura';
  color: transparent;
  text-shadow: 0px 2px 3px rgba(255, 255, 255, 0.8);
  -webkit-background-clip: text;
  -moz-background-clip: text;
  background-clip: text;
}
<center>
  <h1>Text With Inner Shadow</h1>
</center>

Trông cũng đẹp trên nền tối:

:root {
  --gunmetal-gray: #2a3439;
  background: var(--gunmetal-gray);
}

h1[itemprop="headline"] {
  font-family: 'Futura';
  font-size: 48px;
  padding-bottom: 0.35rem;
  font-variant-caps: all-small-caps;
  background-color: var(--gunmetal-gray);
  color: transparent;
  text-shadow: 0px 2px 3px rgba(255, 255, 255, 0.1);
  -webkit-background-clip: text;
  -moz-background-clip: text;
  background-clip: text;
  filter: brightness(3);
}
<center>
  <h1 itemprop="headline">Text With Inner Shadow</h1>
</center>

LIÊN KẾT VÀ TÔI VÀ LIÊN KẾT ME2


Đơn giản và không yêu cầu bất kỳ điều chỉnh nào đối với đánh dấu. Công việc tuyệt vời!
Josh Habdas

10

Bạn có thể làm điều này. Thật không may, không có cách nào để sử dụng phần chèn trên bóng văn bản, nhưng bạn có thể giả mạo nó bằng màu sắc và vị trí. Giảm độ mờ ngay xuống và sắp xếp bóng dọc theo phía trên bên phải. Một cái gì đó như thế này có thể thực hiện thủ thuật:

background-color:#D7CFBA;
color:#38373D;
font-weight:bold;
text-shadow:1px 1px 0 #FFFFFF;

... nhưng bạn sẽ cần phải thực sự, thực sự cẩn thận về màu sắc bạn sử dụng, nếu không, nó sẽ bị mất. Về cơ bản nó là một ảo ảnh quang học nên sẽ không hoạt động trong mọi bối cảnh. Nó cũng không thực sự trông tuyệt vời ở kích thước phông chữ nhỏ hơn, vì vậy hãy lưu ý điều đó.


Không thực sự là những gì tôi đang tìm kiếm. Hiệu quả của đề xuất của bạn là thú vị nhưng khác xa với ví dụ tôi đã đăng.
ericteubert

Sau đó, trong trường hợp đó, không có câu trả lời, không phải với CSS3. Xin lỗi tôi không giúp được gì.
hollsk

Có thể sử dụng bóng chèn background-clipnhư được hiển thị trong câu trả lời này .
Josh Habdas

10

Không cần nhiều bóng hoặc bất kỳ thứ gì lạ mắt như vậy, bạn chỉ cần bù bóng của mình theo trục y âm.

Đối với văn bản tối trên nền sáng:

text-shadow: 0px -1px 0px rgba(0, 0, 0, .75);

Nếu bạn có nền tối thì bạn chỉ cần đảo ngược màu và vị trí y:

text-shadow: 0px 1px 0px rgba(255, 255, 255, 0.75);

Thử với các giá trị rgba, độ mờ và độ mờ để có được hiệu ứng vừa phải. Nó sẽ phụ thuộc rất nhiều vào màu sắc và phông chữ bạn có, và phông chữ càng nặng thì càng tốt.


3
Vẫn chỉ là ảo ảnh quang học, không có bóng người thực bên trong.
ericteubert

25
... không phải tất cả bóng tối đều là ảo ảnh quang học sao?
Charlie Schliesser

bạn đang @eteubert gắt gỏng ... thực sự có nghĩa
Jamie Hutber

7

Hãy thử viên ngọc nhỏ của một biến thể:

text-shadow:0 1px 1px rgba(255, 255, 255, 0.5);

Tôi thường coi "không có câu trả lời" như một thách thức


1
Điều này tạo ra một đường viền màu trắng ở dưới cùng của phông chữ nhưng tôi đang tìm kiếm bóng mờ bên trong màu đen .
ericteubert

1
Điều này phù hợp nhất với tôi, đặc biệt là khi làm bóng văn bản nhỏ hơn. Tôi khuyên bạn nên điều chỉnh các giá trị RGB một chút nếu cần thiết để nó trông phù hợp với màu phông chữ của bạn.
Cory Schires

6

Tôi đã thấy nhiều giải pháp được đề xuất, nhưng không có giải pháp nào đúng như những gì tôi hy vọng.

Đây là cách tốt nhất của tôi về vấn đề này , trong đó màu trong suốt, nền và bóng văn bản trên cùng là cùng một màu với các độ mờ khác nhau, mô phỏng mặt nạ và bóng văn bản thứ hai là phiên bản tối hơn, bão hòa hơn của màu bạn. thực sự muốn (khá dễ thực hiện với HSLA).

nhập mô tả hình ảnh ở đây

(btw, văn bản và kiểu dáng dựa trên OP của luồng dupe )


6

Tôi đã gặp một vài trường hợp mà tôi cần bóng bên trong trên văn bản và những điều sau đây đã hoạt động tốt với tôi:

.inner {
    color: rgba(252, 195, 67, 0.8);
    font-size: 48px;
    text-shadow: 1px 2px 3px #fff, 0 0 0 #000;
}

Điều này đặt độ mờ của văn bản thành 80%, sau đó tạo ra hai bóng:

  • Đầu tiên là một bóng trắng (giả sử văn bản trên nền trắng) lệch 1px từ bên trái và 2px từ trên cùng, làm mờ 3px.
  • Bóng thứ hai là bóng đen có thể nhìn thấy qua văn bản có độ mờ 80% nhưng không qua bóng đầu tiên, có nghĩa là nó chỉ hiển thị bên trong các chữ cái văn bản nơi bóng đầu tiên bị dịch chuyển (1px từ bên trái và 2px từ trên cùng). Để thay đổi độ mờ của bóng có thể nhìn thấy này, hãy sửa đổi tham số làm mờ cho bóng lớp đầu tiên.

Cảnh báo

  • Điều này sẽ chỉ hoạt động nếu có thể đạt được màu sắc mong muốn của văn bản mà không cần phải có độ mờ 100%.
  • Điều này sẽ chỉ hoạt động nếu màu nền là đồng nhất (vì vậy, nó sẽ không hoạt động đối với ví dụ cụ thể của người hỏi khi văn bản nằm trên nền có kết cấu).



4

Có vẻ như mọi người đã có câu trả lời cho câu hỏi này. Tôi thích giải pháp từ @Web_Designer. Nhưng nó không cần quá phức tạp và bạn vẫn có thể có được bóng mờ bên trong mà bạn đang tìm kiếm.

http://dabblet.com/gist/3877605

.depth {
    display: block;
    padding: 50px;
    color: black;
    font: bold 7em Arial, sans-serif;
    position: relative;
 }

.depth:before {
    content: attr(title);
    color: transparent;
    position: absolute;
    text-shadow: 2px 2px 4px rgba(255,255,255,0.3);
}


3

Xây dựng dựa trên :before :afterkỹ thuật của web_designer, đây là một cái gì đó gần hơn với cái nhìn của bạn:

Đầu tiên, làm cho văn bản của bạn có màu của bóng bên trong (màu đen trong trường hợp của OP).

Bây giờ, sử dụng lớp: sau psuedo để tạo một bản sao trong suốt của văn bản gốc, được đặt trực tiếp trên đầu nó. Gán bóng văn bản thông thường cho nó mà không cần bù đắp. Gán màu văn bản gốc cho bóng và điều chỉnh alpha nếu cần.

http://dabblet.com/gist/2499892

Bạn không có quyền kiểm soát hoàn toàn đối với độ lan rộng, v.v. của bóng như bạn làm trong PS, nhưng đối với các giá trị mờ nhỏ hơn, nó khá khả thi. Bóng đi qua các giới hạn của văn bản, vì vậy nếu bạn đang làm việc trong môi trường có hậu cảnh - nền trước có độ tương phản cao, nó sẽ hiển nhiên. Đối với các mục có độ tương phản thấp hơn, đặc biệt là những mục có cùng màu sắc, nó không quá đáng chú ý. Ví dụ, tôi đã có thể tạo ra văn bản khắc trông rất đẹp trên nền kim loại bằng cách sử dụng kỹ thuật này.


3

Đây là một giải pháp tuyệt vời cho bóng văn bản chèn TRUE bằng cách sử dụng thuộc tính background-clip CSS3:

.insetText {
    background-color: #666666;
    -webkit-background-clip: text;
    -moz-background-clip: text;
    background-clip: text;
    color: transparent;
    text-shadow: rgba(255,255,255,0.5) 0px 3px 3px;
}

Liên kết đó dường như đã bị phá vỡ bây giờ.
Nick White

Có vẻ đẹp trong bộ webkit, nhưng vẫn là một điểm không phù hợp với Firefox 18.
gmeben

Điều này có thể có hỗ trợ hạn chế, nhưng tôi thích điều này vì nó thực sự phù hợp.
Julian K

2

Đây là những gì tôi nghĩ ra sau khi xem xét một số ý tưởng ở đây. Ý tưởng chính là màu của văn bản hòa trộn với cả hai bóng và lưu ý rằng điều này đang được sử dụng trên nền xám (nếu không màu trắng sẽ không hiển thị tốt).

.inset {
    color: rgba(0,0,0, 0.6);
    text-shadow: 1px 1px 1px #fff, 0 0 1px rgba(0,0,0,0.6);
}

1

Hãy thử ví dụ này cho bóng văn bản chèn. Đây là HTML

<h1 class="inset-text-shadow">Inset text shadow trick</h1>

CSS

body {
    background: #f8f8f8;
}
h1 {
    font-family: Helvetica, Arial, sans-serif;
    font-weight: bold;
    font-size: 6em;
    line-height: 1em;
}
.inset-text-shadow {
    /* Shadows are visible under slightly transparent text color */
    color: rgba(0,0,0,0.6);
    text-shadow: 2px 8px 6px rgba(0,0,0,0.2), 0px -5px 35px rgba(255,255,255,0.3);

}

Demo on Jsfiddle


0
text-shadow: 4px 4px 2px rgba(150, 150, 150, 1);

đối với bóng hộp:

-webkit-box-shadow: 7px 7px 5px rgba(50, 50, 50, 0.75);
-moz-box-shadow:    7px 7px 5px rgba(50, 50, 50, 0.75);
box-shadow:         7px 7px 5px rgba(50, 50, 50, 0.75);

bạn có thể thấy văn bản trực tuyến và bóng hộp: văn bản trực tuyến và bóng hộp

để biết thêm ví dụ, bạn có thể truy cập địa chỉ này: ví dụ thêm mã freeclup


0

Có một cách đơn giản hơn nhiều để đạt được điều này

.inner{color: red; text-shadow: 0 -1px 0 #666;} // #666 is the color of the inner shadow

Voilà


0

Đối với văn bản có kích thước bình thường trên các nút ish nhỏ

Tôi thấy các ý tưởng khác trên trang này bị mất hiệu quả khi được sử dụng trên các nút nhỏ với chữ viết nhỏ. Câu trả lời này mở rộng trên câu trả lời của RobertPitt .

Đây là một tinh chỉnh nhỏ:

text-shadow: 1px 1px transparent, -1px -1px black;

Ghi chú:

Tôi đã sử dụng trang web này để tinh chỉnh các sắc thái màu.


-1

Tôi đang sử dụng nó từ trang web này, nó cũng có vẻ tốt. Hãy nhìn vào nó Bóng bên trong


1
Người đã bỏ phiếu phản đối điều này, có thể nói điều này đủ điều kiện để bỏ phiếu từ chối như thế nào. Nếu câu trả lời này đi chệch khỏi câu hỏi? hoặc bạn có nghĩ là một spammer .. nếu bạn có thể giải thích tôi có thể cập nhật câu trả lời của tôi ở đây
vkGunasekaran

+1 Câu trả lời tương tự như Web_Designer nhưng được giải thích rõ hơn. Có thể người phản đối không thích thực tế là câu trả lời của bạn về cơ bản giống với câu trả lời được đăng sớm hơn. Nhưng của bạn đây. Tôi chỉ bồi thường nó cho bạn :)
Jules Colle

2
Chỉ bị phản đối. Đây không chỉ là một bản sao mà còn không giải thích vấn đề hoặc đưa ra bất kỳ đoạn trích nào mà chỉ là một liên kết. Nó cho thấy nỗ lực tối thiểu từ tác giả, theo ý kiến ​​của tôi. IMHO và FTR.
Alba Mendez
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.