เงาข้อความภายในด้วย CSS


107

ฉันกำลังเล่นกับ CSS3 และพยายามที่จะบรรลุเอฟเฟกต์ข้อความเช่นนี้ (เงาด้านในที่พร่ามัวสีดำ):

แต่ฉันไม่สามารถหาวิธีสร้างเงาของข้อความภายในข้อความได้ ฉันสงสัยว่ามันยังคงเป็นไปได้หรือไม่เพราะองค์ประกอบกล่องเงาสามารถทำให้เงาภายในเป็นแบบนี้:

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

ความคิดใด ๆ ?


3
ไม่มีคำตอบสำหรับสิ่งนี้หากคุณไม่พร้อมที่จะไปหาภาพลวงตา ...
Aaria Carter-Weir

คำตอบ:


105

นี่เป็นเคล็ดลับเล็กน้อยที่ฉันค้นพบโดยใช้: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 }

แอตทริบิวต์ title ต้องเหมือนกันกับเนื้อหา การสาธิต: http://dabblet.com/gist/1609945


1
ดี! Creative :) ยังไม่เท่า Photoshop-esque อย่างที่ฉันต้องการ คุณสามารถตั้งค่าด้านบน / ซ้ายเป็น 5px แต่ละค่าเพื่อให้ได้ออฟเซ็ตเงาด้านใน 5px แต่จากนั้นตัวอักษรก็รั่วไหลออกมาอีกด้านหนึ่งซึ่งดูดีสำหรับ 1px และ 2px แต่แปลกสำหรับค่าที่สูงกว่า
ericteubert

1
ใช่มันดูดีเพียงแค่มีสีขาวเล็กน้อยที่ด้านล่าง มากกว่า 2px จะทำลายรูปลักษณ์
Web_Designer

1
สุดยอด! คุณสามารถใช้สิ่งนี้เพื่อทำข้อความสีขาวได้เช่นกันโดยเพิ่มความทึบเป็น. 9 หรือสร้างขอบเอียงโดยคงความทึบไว้ที่. 1 และกลับสี (+1)
JohnB

ทางออกที่ดี อย่างไรก็ตามล้มเหลวเมื่อใช้ร่วมกับการไล่ระดับข้อความ fe; (แย่เกินไปเดาว่าเราต้องรอ CSS4 เป็นเวลาหลายปีหรือมากกว่านั้นเพื่อให้เอฟเฟกต์ข้อความที่ยอดเยี่ยม
Michael Trouw

มันยอดเยี่ยมในโครเมี่ยมฉันกำลังดิ้นรนที่จะทำทางเลือกสำรองสำหรับ FF ซึ่งจะไม่ใช้กับ Chrome โดยไม่ใช้ JS และคลาสเนมสเปซ ความคิดใด ๆ ป.ล. ใช้งานได้สวยงามบนเอฟเฟกต์ leathr ดูเหมือนตราประทับ
Will Hancock

43

คุณควรจะทำได้โดยใช้ text-shadow หรือคิดแบบนี้:

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

นี่คือตัวอย่าง: http://jsfiddle.net/ekDNq/


8
ฮึ่มใช่ชนิดของ เอฟเฟกต์ภาพจะคล้ายกับพารามิเตอร์เหล่านี้ แต่ยังคงเป็นเงาหลังฟอนต์ ไม่อยู่ข้างใน. ในตัวอย่างของฉันฉันยังเบลอเงาที่แทรกอยู่และนั่นจะทำลายเอฟเฟกต์ที่นี่ ดังนั้น ... ทางออกที่ดีที่สุด แต่ยังคงเป็นเพียงการแฮ็กภาพลวงตา;)
ericteubert

2
โปรดทราบว่าคุณกำลังทำให้แบบอักษรอ้วนขึ้นโดยทำสิ่งนี้ สำหรับฟอนต์ขนาดเล็กและขนาดกลางอาจไม่เป็นที่ต้องการ
Jonatan Littke

20

นี่คือความพยายามที่ดีที่สุดของฉัน:

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

ปัญหาคือจะคลิปเงาที่ตกบริเวณขอบได้อย่างไร !!! ฉันลองใช้ webkit โดยใช้ background-clip: text แต่ webkit แสดงเงาเหนือพื้นหลังจึงไม่ทำงาน

การสร้าง Text Mask ด้วย CSS?

หากไม่มีเลเยอร์มาสก์ด้านบนจะเป็นไปไม่ได้ที่จะสร้างเงาภายในที่แท้จริงบนข้อความ

บางทีอาจมีคนแนะนำให้ W3C เพิ่มbackground-clip: reverse-textซึ่งจะตัดมาสก์ผ่านพื้นหลังแทนที่จะตัดพื้นหลังให้พอดีกับข้อความ

ไม่ว่าจะเป็นหรือแสดงเงาข้อความเป็นส่วนหนึ่งของพื้นหลังแล้วตัดด้วย background-clip: text

ฉันพยายามวางตำแหน่งองค์ประกอบข้อความที่เหมือนกันด้านบน แต่ปัญหาคือ background-clip: ข้อความตัดพื้นหลังให้พอดีกับข้อความ แต่เราต้องการสิ่งที่ตรงกันข้าม

ฉันลองใช้ text-stroke: 20px white; ทั้งองค์ประกอบนี้และองค์ประกอบด้านบน แต่จังหวะข้อความจะเข้าและออก

วิธีการอื่น

เนื่องจากในปัจจุบันไม่มีวิธีสร้างมาสก์ข้อความกลับด้านใน CSS คุณสามารถเปลี่ยนเป็น SVG หรือผ้าใบและสร้างรูปภาพแทนที่ข้อความด้วยเลเยอร์ทั้งสามเพื่อให้ได้เอฟเฟกต์ของคุณ

เนื่องจาก SVG เป็นชุดย่อยของ XML ข้อความ SVG จึงยังคงสามารถเลือกและค้นหาได้และเอฟเฟกต์สามารถสร้างได้โดยใช้โค้ดน้อยกว่า Canvas

มันจะยากกว่าที่จะบรรลุสิ่งนี้ด้วย Canvas เพราะมันไม่มี Dom ที่มีเลเยอร์เหมือน SVG

คุณสามารถสร้าง SVG ได้ทั้งฝั่งเซิร์ฟเวอร์หรือเป็นวิธีการแทนที่ข้อความจาวาสคริปต์ในเบราว์เซอร์

อ่านเพิ่มเติม:

SVG เทียบกับ Canvas:

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

การตัดและการมาสก์ด้วยข้อความ SVG:

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


2
ฉันได้โพสต์คำอธิบายโดยละเอียดเพิ่มเติมเกี่ยวกับการพยายามอย่างเต็มที่ของคุณพร้อมตัวอย่าง ลองดูสิ!
Alba Mendez

1
ตัวอย่างนี้นำไปที่รุนแรงมาก
Alba Mendez

มีเงาด้านนอกในตัวอย่างของคุณ
AlexKh

13

คำอธิบายที่แม่นยำยิ่งขึ้นของ CSS ในคำตอบของ kendo451

มีอีกวิธีหนึ่งในการรับภาพลวงตาเงาภายในที่แปลกใหม่
ซึ่งฉันจะอธิบายในสามขั้นตอนง่ายๆ สมมติว่าเรามี HTML นี้:

<h1>Get this</h1>

และ CSS นี้:

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

เป็นสโลแกนที่ดี

ขั้นตอนที่ 1

เริ่มต้นด้วยการทำให้ข้อความโปร่งใส:

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

มันเป็นกล่อง

ขั้นตอนที่ 2

ตอนนี้เราครอบตัดพื้นหลังให้เป็นรูปร่างของข้อความ:

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

พื้นหลังเป็นข้อความ!

ขั้นตอนที่ 3

ตอนนี้ความมหัศจรรย์: เราจะเบลอtext-shadowซึ่งจะอยู่ด้านหน้าของพื้นหลังดังนั้นจึงให้ความรู้สึกเหมือนเงาภายใน!

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

เราเข้าใจแล้ว!  เย้!

ดูผลสุดท้าย

ข้อเสีย?

  • ใช้งานได้เฉพาะใน Webkit ( background-clipไม่สามารถทำได้text)
  • หลายเงา? อย่าแม้แต่จะคิด
  • คุณจะได้รับแสงภายนอกด้วย

"เงาซ้อนหรือไม่อย่าเพิ่งคิด" เกี่ยวกับอะไรtext-shadow: 1px 1px 1px #000, 3px 3px 5px blue;?
Morpheus

@ Morpheus ข้อเสียอย่างหนึ่งของวิธีนี้คือคุณไม่สามารถใช้เงาหลาย ๆ เงากับข้อความได้
Alba Mendez

ขนาดและความสว่างของตัวอย่างนี้ทำให้ผู้อื่นมองเห็นได้ยาก คุณสามารถย้ายสิ่งเหล่านี้ไปเป็นข้อมูลโค้ดได้ไหม ขอบคุณ!
Josh Habdas

12

ตัวอย่างสง่างามโดยไม่ต้องใช้กระดาษห่อตำแหน่งหรือเนื้อหาที่ซ้ำซ้อนในมาร์กอัปที่:

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

ดูดีบนพื้นหลังสีเข้มเช่นกัน:

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

และฉันลิงค์ และลิงค์ ME2


ง่ายและไม่ต้องการการปรับแต่งใด ๆ ในการมาร์กอัป การทำงานที่ดี!
Josh Habdas

10

คุณสามารถทำสิ่งนี้ได้ น่าเสียดายที่ไม่มีวิธีใช้สิ่งที่ใส่เข้าไปในเงาข้อความ แต่คุณสามารถปลอมด้วยสีและตำแหน่งได้ ลดความเบลอลงแล้วจัดเงาตามด้านขวาบน สิ่งนี้อาจทำเคล็ดลับ:

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

... แต่คุณจะต้องระวังจริงๆว่าสีไหนที่คุณใช้ไม่งั้นมันจะดูไม่ดี โดยพื้นฐานแล้วมันเป็นภาพลวงตาดังนั้นจึงไม่สามารถใช้ได้ในทุกบริบท นอกจากนี้ยังดูไม่ดีนักในขนาดตัวอักษรที่เล็กลงดังนั้นโปรดระวังด้วย


ไม่ใช่สิ่งที่ฉันกำลังมองหาจริงๆ ผลของข้อเสนอของคุณน่าสนใจ แต่อยู่ไกลจากตัวอย่างที่ฉันโพสต์
ericteubert

ถ้าอย่างนั้นก็ไม่มีคำตอบไม่ใช่กับ CSS3 ขอโทษที่ช่วยไม่ได้
hollsk

เงาที่ฝังไว้สามารถทำได้โดยใช้background-clipดังที่แสดงในคำตอบนี้
Josh Habdas

10

ไม่จำเป็นต้องมีเงาหลาย ๆ เงาหรืออะไรแปลก ๆ แบบนั้นคุณแค่ต้องหักล้างเงาของคุณในแกน y เชิงลบ

สำหรับข้อความสีเข้มบนพื้นหลังสีอ่อน:

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

หากคุณมีพื้นหลังสีเข้มคุณสามารถกลับสีและตำแหน่ง y:

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

เล่นกับค่า rgba ความทึบและความเบลอเพื่อให้ได้เอฟเฟกต์ที่เหมาะสม ขึ้นอยู่กับว่าคุณมีแบบอักษรและพื้นหลังสีอะไรและยิ่งตัวอักษรมีน้ำหนักมากเท่าไหร่ก็ยิ่งดีเท่านั้น


3
ยังคงเป็นเพียงภาพลวงตาไม่มีเงาภายในที่แท้จริง
ericteubert

25
... เงาทั้งหมดไม่ใช่ภาพลวงตาหรือ?
Charlie Schliesser

คุณไม่พอใจ @eteubert ... หมายถึงจริงๆ
เจมี่ฮัทเบอร์

7

ลองอัญมณีเล็ก ๆ ของรูปแบบนี้:

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

ฉันมักจะใช้ "ไม่มีคำตอบ" เป็นสิ่งท้าทาย


1
นี้จะสร้างโครงร่างสีขาวที่ด้านล่างของตัวอักษร แต่ผมกำลังมองหาสีดำเงาภายในพร่ามัว
ericteubert

1
วิธีนี้ได้ผลดีที่สุดสำหรับฉันโดยเฉพาะเมื่อใช้เงาข้อความขนาดเล็ก ฉันขอแนะนำให้ปรับแต่งค่า RGB เล็กน้อยหากจำเป็นเพื่อให้มันดูถูกต้องกับสีฟอนต์ของคุณ
Cory Schires

6

ฉันได้เห็นวิธีแก้ปัญหาที่นำเสนอมากมาย แต่ไม่มีสิ่งที่ฉันหวังไว้

นี่คือแฮ็คที่ดีที่สุดของฉันในเรื่องนี้โดยที่สีโปร่งใสพื้นหลังและเงาข้อความด้านบนเป็นสีเดียวกันโดยมีความทึบที่แตกต่างกันการจำลองมาสก์และเงาข้อความที่สองเป็นสีที่เข้มขึ้นและอิ่มตัวมากขึ้น ต้องการจริงๆ (ค่อนข้างง่ายที่จะทำกับ HSLA)

ใส่คำอธิบายภาพที่นี่

(btw ข้อความและรูปแบบตามOP ของเธรดที่หลอกลวง )


6

ฉันมีบางกรณีที่ฉันต้องการเงาภายในบนข้อความและสิ่งต่อไปนี้ได้ผลดีสำหรับฉัน:

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

สิ่งนี้ตั้งค่าความทึบของข้อความเป็น 80% จากนั้นสร้างเงาสองเงา:

  • อย่างแรกคือเงาสีขาว (สมมติว่าข้อความอยู่บนพื้นหลังสีขาว) ชดเชย 1px จากด้านซ้ายและ 2px จากด้านบนเบลอ 3px
  • อย่างที่สองคือเงาสีดำซึ่งมองเห็นได้ผ่านข้อความทึบ 80% แต่ไม่เห็นผ่านเงาแรกซึ่งหมายความว่าจะมองเห็นได้ภายในตัวอักษรของข้อความเฉพาะที่เงาแรกถูกแทนที่ (1px จากด้านซ้ายและ 2px จากด้านบน) หากต้องการเปลี่ยนความเบลอของเงาที่มองเห็นนี้ให้แก้ไขพารามิเตอร์เบลอสำหรับเงาชั้นแรก

ข้อควรระวัง

  • สิ่งนี้จะใช้ได้เฉพาะเมื่อสีของข้อความที่ต้องการสามารถทำได้โดยไม่จำเป็นต้องมีความทึบ 100%
  • วิธีนี้จะใช้ได้เฉพาะเมื่อสีพื้นหลังเป็นสีทึบ (ดังนั้นจะใช้ไม่ได้กับตัวอย่างเฉพาะของผู้ถามที่ข้อความอยู่บนพื้นหลังที่มีพื้นผิว)



4

ดูเหมือนว่าทุกคนจะมีคำตอบสำหรับเรื่องนี้ ฉันชอบวิธีแก้ปัญหาจาก @Web_Designer แต่ไม่จำเป็นต้องซับซ้อนถึงขนาดนั้นและคุณยังสามารถรับเงาภายในที่พร่ามัวที่คุณกำลังมองหาได้

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

จาก:before :afterเทคนิคโดย web_designer นี่คือสิ่งที่ใกล้เคียงกับรูปลักษณ์ของคุณมากขึ้น:

ขั้นแรกให้ข้อความของคุณเป็นสีของเงาด้านใน (black-ish ในกรณีของ OP)

ตอนนี้ใช้คลาส: after psuedo เพื่อสร้างสำเนาข้อความต้นฉบับแบบโปร่งใสโดยวางไว้ด้านบนของข้อความโดยตรง กำหนดเงาข้อความปกติโดยไม่มีการชดเชย กำหนดสีข้อความต้นฉบับให้กับเงาและปรับอัลฟาตามต้องการ

http://dabblet.com/gist/2499892

คุณไม่สามารถควบคุมการแพร่กระจายและอื่น ๆ ของเงาได้อย่างสมบูรณ์เช่นเดียวกับที่คุณทำใน PS แต่สำหรับค่าความเบลอที่น้อยกว่านั้นค่อนข้างผ่านได้ เงาพาดผ่านขอบเขตของข้อความดังนั้นหากคุณกำลังทำงานในสภาพแวดล้อมที่มีฉากหลังที่มีความเปรียบต่างสูงจะเห็นได้ชัด สำหรับรายการที่มีคอนทราสต์ต่ำโดยเฉพาะอย่างยิ่งรายการที่มีสีเดียวกันจะไม่หวือหวาเกินไป ตัวอย่างเช่นฉันสามารถสร้างข้อความแกะสลักที่ดูสวยงามมากในพื้นหลังโลหะโดยใช้เทคนิคนี้


3

นี่เป็นวิธีที่ยอดเยี่ยมสำหรับเงาข้อความแทรกแบบ TRUE โดยใช้คุณสมบัติ 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;
}

ดูเหมือนว่าลิงก์นั้นจะใช้งานไม่ได้ในขณะนี้
Nick White

ดูดีใน webkit แต่ก็ยังไม่ต้องใช้ Firefox 18.
gmeben

สิ่งนี้อาจมีการสนับสนุนที่ จำกัด แต่ฉันชอบอันนี้เพราะมันแทรกอยู่จริงๆ
Julian K

2

นี่คือสิ่งที่ฉันคิดขึ้นหลังจากดูแนวคิดบางส่วนที่นี่ แนวคิดหลักคือสีของข้อความจะกลมกลืนกับทั้งเงาและโปรดทราบว่าสิ่งนี้จะถูกใช้กับพื้นหลังสีเทา (มิฉะนั้นสีขาวจะแสดงได้ไม่ดี)

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

1

ลองใช้ตัวอย่างนี้สำหรับเงาข้อความแทรก นี่คือ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);

สำหรับกล่องเงา:

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

คุณสามารถดูข้อความออนไลน์และเงาของกล่อง: ข้อความออนไลน์และเงาของกล่อง

สำหรับตัวอย่างเพิ่มเติมคุณสามารถไปที่ที่อยู่นี้: โค้ดฟรีตัวอย่างเพิ่มเติม


0

มีวิธีที่ง่ายกว่ามากในการบรรลุเป้าหมายนี้

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

Voilà


0

สำหรับข้อความขนาดปกติบนปุ่ม small-ish

ฉันพบว่าแนวคิดอื่น ๆ ในหน้านี้สูญเสียประสิทธิภาพเมื่อใช้กับปุ่มขนาดเล็กที่มีตัวอักษรขนาดเล็ก คำตอบนี้ขยายในคำตอบของ RobertPitt

นี่คือการปรับแต่งเล็กน้อย:

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

บันทึก:

ฉันใช้ไซต์นี้เพื่อปรับแต่งเฉดสี


-1

ฉันใช้มันจากไซต์นี้และมันก็ดูดี ดูที่เงาด้านใน


1
ผู้ที่ลงคะแนนนี้สามารถบอกได้ว่าสิ่งนี้มีสิทธิ์ได้รับการโหวตลดลงอย่างไร หากคำตอบนี้เบี่ยงเบนไปจากคำถาม? หรือคุณคิดว่าเป็นสแปมเมอร์ .. ถ้าคุณอธิบายได้ฉันสามารถอัปเดตคำตอบได้ที่นี่
vkGunasekaran

+1 คำตอบเดียวกับ Web_Designer แต่อธิบายได้ดีกว่า บางทีผู้โหวตไม่ชอบที่คำตอบของคุณก็เหมือนกับคำตอบที่โพสต์ไว้ก่อนหน้านี้ แต่นี่คุณไป ฉันแค่ชดเชยให้คุณ :)
Jules Colle

2
เพิ่งลงคะแนน สิ่งนี้ไม่เพียง แต่จะซ้ำกันเท่านั้น แต่ยังไม่ได้อธิบายปัญหาหรือให้ตัวอย่างใด ๆ แต่เป็นเพียงลิงก์ มันแสดงให้เห็นถึงความพยายามเพียงเล็กน้อยจากผู้เขียนในความคิดของฉัน IMHO และ FTR
Alba Mendez
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.