เปลี่ยนสีของภาพ PNG ผ่าน CSS หรือไม่


464

เมื่อกำหนด PNG แบบโปร่งใสที่แสดงรูปทรงที่เรียบง่ายในสีขาวเป็นไปได้หรือไม่ที่จะเปลี่ยนสีของสิ่งนี้ผ่าน CSS การซ้อนทับบางอย่างหรือไม่?


4
คุณสามารถตั้งค่าbackground-colorคุณสมบัติ CSS คุณสามารถสร้างส่วนที่ไม่โปร่งใสซึ่งจะได้รับการแก้ไขและส่วนที่โปร่งใสของภาพซึ่งจะถูกเติมด้วยสีใด ๆ ที่คุณชอบผ่าน CSS นั่นคือสิ่งที่คุณต้องการบรรลุ
jakub.g

2
@qbk นี่เป็นคำตอบที่คุ้มค่าไม่ใช่แค่ความคิดเห็น และคุณเอาชนะฉันได้ภายใน 1 วินาทีโดยทางเทคนิค
คิริล G

2
คุณสามารถใช้องค์ประกอบ psuedo กับโหมดการผสมเพื่อเปลี่ยนสีไอคอนที่เป็นสีดำ 100% หรือสีขาว 100% (พื้นหลังยังคงโปร่งใส) ดูคำตอบของฉันที่นี่: stackoverflow.com/a/39796437/1472114
chrscblls

คำตอบ:


569

คุณสามารถใช้ตัวกรองด้วย-webkit-filterและfilter: ตัวกรองค่อนข้างใหม่สำหรับเบราว์เซอร์ แต่รองรับมากกว่า 90% ของเบราว์เซอร์ตามตาราง CanIUse ต่อไปนี้: https://caniuse.com/#feat=css-filters

คุณสามารถเปลี่ยนภาพเป็นสีเทา, ซีเปียและอื่น ๆ อีกมากมาย (ดูตัวอย่าง)

ดังนั้นตอนนี้คุณสามารถเปลี่ยนสีของไฟล์ PNG ด้วยตัวกรอง

body {
    background-color:#03030a;
    min-width: 800px;
    min-height: 400px
}
img {
    width:20%;
    float:left; 
     margin:0;
}
/*Filter styles*/
.saturate { filter: saturate(3); }
.grayscale { filter: grayscale(100%); }
.contrast { filter: contrast(160%); }
.brightness { filter: brightness(0.25); }
.blur { filter: blur(3px); }
.invert { filter: invert(100%); }
.sepia { filter: sepia(100%); }
.huerotate { filter: hue-rotate(180deg); }
.rss.opacity { filter: opacity(50%); }
<!--- img src http://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/Mona_Lisa%2C_by_Leonardo_da_Vinci%2C_from_C2RMF_retouched.jpg/500px-Mona_Lisa%2C_by_Leonardo_da_Vinci%2C_from_C2RMF_retouched.jpg -->
<img alt="Mona Lisa" src="https://www.pexels.com/photo/photo-of-a-green-leaf-2563743/?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="original">
<img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="saturate" class="saturate">
<img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="grayscale" class="grayscale">
<img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="contrast" class="contrast">
<img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="brightness" class="brightness">
<img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="blur" class="blur">
<img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="invert" class="invert">
<img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="sepia" class="sepia">
<img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="huerotate" class="huerotate">
<img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="opacity" class="rss opacity">

แหล่ง


12
ดังนั้นคำตอบสั้น ๆ ก็คือไม่มีวิธีแก้ปัญหาทั่วไปสำหรับเบราว์เซอร์ส่วนใหญ่
Trilarion

18
แต่ huerotate หรือ saturate จริง ๆ แล้วจะ anthing กับภาพสีขาว?
Keith

6
อัปเดต 2016: ตอนนี้ใช้ได้กับเบราว์เซอร์เกือบทั้งหมดยกเว้น IE: caniuse.com/#feat=css-filters
Stan

4
@datatype_void บางครั้งคุณไม่สามารถควบคุมภาพเริ่มต้นได้ด้วยตัวเอง ดังนั้นดูเหมือนว่าคุณยอมรับว่าจุดของฉันถูกต้องคุณไม่สามารถไปถึงสีใด ๆ ที่เริ่มต้นจากสีดำหรือสีขาว โอ้และฉันเล่นนานกว่า 5 นาทีเพื่อให้ได้ข้อสรุปนี้
AsGoodAsItGets

5
ระบุด้วยว่าคุณสามารถทำสิ่งนี้ได้: .gifcorrect{ filter: invert(28%) sepia(100%) hue-rotate(-180deg) saturate(3); }ซึ่งหมายความว่าคุณสามารถเปลี่ยนจากสีดำ & ใสหรือระดับสีเทาเป็นสีได้และใช้งานได้แม้ใน gif ที่เคลื่อนไหว
tatsu

140

ฉันพบตัวอย่างโค้ดโคเด็นที่ยอดเยี่ยมนี้ที่คุณแทรกค่าสีฐานสิบหกของคุณและส่งคืนตัวกรองที่ต้องการเพื่อใช้สีนี้กับ png

ตัวสร้างตัวกรอง CSS เพื่อแปลงจากสีดำเป็นสีฐานสิบหกเป้าหมาย

เช่นฉันต้องการ png ของฉันเพื่อให้มีสี# 1a9790ต่อไปนี้

จากนั้นคุณต้องใช้ตัวกรองต่อไปนี้กับคุณ png

filter: invert(48%) sepia(13%) saturate(3207%) hue-rotate(130deg) brightness(95%) contrast(80%);

12
<3 <3 <3 <3 <3 <3
dwjohnston

2
ฉันเปลี่ยนสีเป็นสีขาวจากสีน้ำเงินโดยใช้รหัสนี้:filter: invert(1%) sepia(1%) saturate(1%) hue-rotate(1deg) brightness(1000%) contrast(80%);
Anjan Biswas

มันเยี่ยมมาก !!
Thiago Pires

2
ผู้เขียนสมควรได้รับรูปปั้น! (หมายเหตุ: ความสว่าง (0) อิ่มตัว (100%) ตัวเลือกเสริมที่ฆ่าข้อสงสัยใด ๆ )
Jackie Degl'Innocenti

1
หากใครต้องการมันนี่คือการแปลง TS ของรหัสนี้gist.github.com/dwjohnston/7e60bf5d4b6c071cd869f9f346241c08
dwjohnston

56

คุณอาจต้องการดูแบบอักษรของไอคอน http://css-tricks.com/examples/IconFont/

แก้ไข: ฉันใช้Font-Awesomeในโครงการล่าสุดของฉัน คุณสามารถบูตได้แม้กระทั่ง ใส่สิ่งนี้ลงใน<head>:

<link href="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.min.css" rel="stylesheet">

<!-- And if you want to support IE7, add this aswell -->
<link href="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome-ie7.min.css" rel="stylesheet">

จากนั้นไปข้างหน้าและเพิ่มไอคอนลิงก์ในลักษณะนี้:

<a class="icon-thumbs-up"></a>

นี่คือสูตรโกงเต็ม

--edit--

Font-Awesome ใช้ชื่อคลาสที่ต่างกันในเวอร์ชันใหม่อาจเป็นเพราะทำให้ไฟล์ CSS มีขนาดเล็กลงอย่างมากและเพื่อหลีกเลี่ยงคลาส css ที่ไม่ชัดเจน ดังนั้นตอนนี้คุณควรใช้:

<a class="fa fa-thumbs-up"></a>

แก้ไข 2:

เพิ่งค้นพบ github ยังใช้แบบอักษรไอคอนของตัวเอง: Octicons ดาวน์โหลดได้ฟรี พวกเขายังมีเคล็ดลับบางอย่างเกี่ยวกับวิธีการสร้างตัวอักษรไอคอนของตัวเองมาก


Font Awesome มีชีวิตอยู่กับชื่อของมัน
HerrimanCoder

+1 เมื่อคิดนอกกรอบ และทุกวันนี้มีแอพออนไลน์ที่ใช้งานง่ายเพื่อช่วยคุณสร้าง webfont จากรูปภาพ (svg)
yvan vander sanden

หาก <a class="icon-thumbs-up"> </a> เป็นชื่อคลาสเก่าและ <a class="fa fa-thumbs-up"> </a> เป็นชื่อใหม่ที่ฉันไม่คิด ทำให้ CSS เล็กลงฉันสามารถเห็นช่องว่างเพิ่มเติมระหว่าง fa และ thumb-up เพิ่ม atleast 1 ไบต์เพิ่มเติมลงในไฟล์ CSS นั้นถ้าฉันไม่ผิด?
Brandito

Font Awesome นั้นยอดเยี่ยมในวันนี้ แต่น่าเสียดายที่การบล็อกการเรนเดอร์ทำให้ google และผู้ใช้ไม่มีความสุข ก่อนอื่นเราจัดการเรื่องนี้โดยการลบแบบอักษรที่ไม่ได้ใช้ออกจากทั้ง CSS และไฟล์แบบอักษรไบนารีลดข้อมูลประมาณครึ่งหนึ่ง ขณะนี้เรากำลังอยู่ในขั้นตอนการลบออกทั้งหมดและแทนที่ด้วยสไปรต์แบบธรรมดาซึ่งไม่สามารถทำการบล็อกได้ (กระบวนการ DOM และ CSSOM เร็วขึ้นทำให้องค์ประกอบบนหน้าเว็บปรากฏเร็วขึ้น) และจะลดข้อมูลอีก 75% ลงเหลือ 6KB FA อยู่ที่ประมาณ 100KB หน้ากาก CSS อาจช่วยในกรณีของเรา แต่อาจไม่จำเป็น
YK

25

ฉันสามารถทำได้โดยใช้ตัวกรอง SVG คุณสามารถเขียนตัวกรองที่ทวีคูณสีของภาพต้นฉบับด้วยสีที่คุณต้องการเปลี่ยน ในข้อมูลโค้ดด้านล่างสีที่ท่วมท้นเป็นสีที่เราต้องการเปลี่ยนสีของภาพเป็น (ซึ่งก็คือสีแดงในกรณีนี้) feComposite บอกตัวกรองว่าเราประมวลผลสีอย่างไร สูตรสำหรับ feComposite พร้อมเลขคณิตคือ (k1 * i1 * i2 + k2 * i1 + k3 * i2 + k4) โดยที่ i1 และ i2 เป็นสีอินพุตสำหรับใน / in2 ตามลำดับ ดังนั้นการระบุเพียง k1 = 1 หมายความว่ามันจะทำแค่ i1 * i2 ซึ่งหมายถึงการคูณสีทั้งสองเข้าด้วยกัน

หมายเหตุ: ใช้งานได้กับ HTML5 เท่านั้นเนื่องจากใช้ inline SVG แต่ฉันคิดว่าคุณอาจสามารถใช้งานเบราว์เซอร์รุ่นเก่าได้โดยใส่ SVG ไว้ในไฟล์แยกต่างหาก ฉันยังไม่ได้ลองวิธีการนั้น

นี่คือตัวอย่าง:

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="60" height="90" style="float:left">
  <defs>
    <filter id="colorMask1">
      <feFlood flood-color="#ff0000" result="flood" />
      <feComposite in="SourceGraphic" in2="flood" operator="arithmetic" k1="1" k2="0" k3="0" k4="0" />
    </filter>
  </defs>
  <image width="100%" height="100%" xlink:href="http://i.stack.imgur.com/OyP0g.jpg" filter="url(#colorMask1)" />
</svg>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="60" height="90" style="float:left">
  <defs>
    <filter id="colorMask2">
      <feFlood flood-color="#00ff00" result="flood" />
      <feComposite in="SourceGraphic" in2="flood" operator="arithmetic" k1="1" k2="0" k3="0" k4="0" />
    </filter>
  </defs>
  <image width="100%" height="100%" xlink:href="http://i.stack.imgur.com/OyP0g.jpg" filter="url(#colorMask2)" />
</svg>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="60" height="90" style="float:left">
  <defs>
    <filter id="colorMask3">
      <feFlood flood-color="#0000ff" result="flood" />
      <feComposite in="SourceGraphic" in2="flood" operator="arithmetic" k1="1" k2="0" k3="0" k4="0" />
    </filter>
  </defs>
  <image width="100%" height="100%" xlink:href="http://i.stack.imgur.com/OyP0g.jpg" filter="url(#colorMask3)" />
</svg>


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

23

แท็ก img มีคุณสมบัติพื้นหลังเหมือนกัน หากคุณมี PNG สีขาวที่มีรูปร่างโปร่งใสเช่นเดียวกับ stencil คุณสามารถทำสิ่งนี้ได้:

<img src= 'stencil.png' style= 'background-color: red'>

147
ฉันต้องการให้ส่วนสีขาวแตกต่างกันไม่ใช่ส่วนที่โปร่งใส
Wesley

2
ทางออกที่ดีที่สุดที่ฉันพบ น่าเสียดายที่มันจะใช้งานได้หากคุณใช้สีพื้นหลังทึบบนเว็บไซต์ของคุณ
Jules Colle

8
@Wesley คุณต้องสลับภาพแล้ว (ดังนั้นบิตสีขาวจะกลายเป็นโปร่งใสและสีขาวที่เหลือ) ซึ่งคุณสามารถทำได้โดยใช้โปรแกรมแก้ไขภาพและหน้ากากที่คุณชื่นชอบ
Charles Goodwin

5
@CharlesGoodwin ใช้งานได้แล้วภาพจะถูกวางในพื้นหลังสีขาว
Alex

21

ใช่แล้ว

Surfin 'Safari - คลังบทความของบล็อก»มาสก์ CSS

ตอนนี้ WebKit รองรับ alpha masks ใน CSS มาสก์อนุญาตให้คุณซ้อนทับเนื้อหาของกล่องด้วยรูปแบบที่สามารถใช้ในการทำให้บางส่วนของกล่องนั้นล้มลงในการแสดงผลสุดท้าย กล่าวอีกนัยหนึ่งคุณสามารถคลิปเป็นรูปร่างที่ซับซ้อนโดยยึดตามอัลฟาของรูปภาพ
[... ]
เราได้แนะนำคุณสมบัติใหม่เพื่อให้นักออกแบบเว็บไซต์สามารถควบคุมมาสก์เหล่านี้ได้เป็นอย่างดีและวิธีการใช้งาน คุณสมบัติใหม่นั้นคล้ายคลึงกับคุณสมบัติพื้นหลังและภาพเส้นขอบที่มีอยู่แล้ว

-webkit-mask (background)
-webkit-mask-attachment (background-attachment)
-webkit-mask-clip (background-clip)
-webkit-mask-origin (background-origin)
-webkit-mask-image (background-image)
-webkit-mask-repeat (background-repeat)
-webkit-mask-composite (background-composite)
-webkit-mask-box-image (border-image)

1
เป็นส่วนหนึ่งของมาตรฐาน (ยังมาไม่ถึง) ที่ฉันไม่พบข้อมูลใด ๆ ที่ไม่เกี่ยวข้องกับ Webkit หรือเป็นเพียงรสชาติของ Apple? ดูเหมือนว่า W3 จะแนะนำ SVG สำหรับ usecases ดังกล่าว: w3.org/TR/SVG/masking.html
feeela

3
น่าเศร้าที่ดูเหมือนว่าจะเป็นเว็บคิทเท่านั้นและกลโกงของบล็อกโดยใช้รูปภาพแบบผสมมากกว่าตัวอย่างจริง คำตอบนี้เป็นปลาเฮอริ่งแดงนิดหน่อย
Charles Goodwin

17

ในเบราว์เซอร์ส่วนใหญ่คุณสามารถใช้ตัวกรอง:

  • ทั้ง<img>องค์ประกอบและภาพพื้นหลังขององค์ประกอบอื่น ๆ

  • และตั้งค่าแบบคงที่ใน CSS ของคุณหรือใช้ JavaScript แบบไดนามิก

ดูตัวอย่างด้านล่าง


<img> องค์ประกอบ

คุณสามารถใช้เทคนิคนี้กับ<img>องค์ประกอบ:

#original, #changed {
    width: 45%;
    padding: 2.5%;
    float: left;
}

#changed {
    -webkit-filter : hue-rotate(180deg);
    filter : hue-rotate(180deg);
}
<img id="original" src="http://i.stack.imgur.com/rfar2.jpg" />

<img id="changed" src="http://i.stack.imgur.com/rfar2.jpg" />

ภาพพื้นหลัง

คุณสามารถใช้เทคนิคนี้กับภาพพื้นหลัง:

#original, #changed {
    background: url('http://i.stack.imgur.com/kaKzj.jpg');
    background-size: cover;
    width: 30%;
    margin: 0 10% 0 10%;
    padding-bottom: 28%;
    float: left;
}

#changed {
    -webkit-filter : hue-rotate(180deg);
    filter : hue-rotate(180deg);
}
<div id="original"></div>

<div id="changed"></div>

JavaScript

คุณสามารถใช้ JavaScript เพื่อตั้งค่าตัวกรองตอนรันไทม์:

var element = document.getElementById("changed");
var filter = 'hue-rotate(120deg) saturate(2.4)';
element.style['-webkit-filter'] = filter;
element.style['filter'] = filter;
#original, #changed {
    margin: 0 10%;
    width: 30%;
    float: left;
    background: url('http://i.stack.imgur.com/856IQ.png');
    background-size: cover;
    padding-bottom: 25%;
}
<div id="original"></div>

<div id="changed"></div>


6
คำถามเกี่ยวกับการทำให้สีขาวเป็นภาพพื้นหลังโปร่งใส hue-rotateไม่ทำงานบนพื้นสีขาว
Synetech

17

คิดว่าฉันมีทางออกสำหรับสิ่งนี้นั่นคือ) สิ่งที่คุณกำลังมองหาเมื่อ 5 ปีที่แล้วและ b) นั้นง่ายกว่าตัวเลือกรหัสอื่น ๆ เล็กน้อยที่นี่

ด้วย png สีขาว (เช่นไอคอนสีขาวบนพื้นหลังโปร่งใส) คุณสามารถเพิ่ม :: หลังจากตัวเลือกเพื่อเปลี่ยนสี

.icon {
    background: url(img/icon.png); /* Your icon */
    position: relative; /* Allows an absolute positioned psuedo element */
}

.icon::after{
    position: absolute; /* Positions psuedo element relative to .icon */
    width: 100%; /* Same dimensions as .icon */
    height: 100%;
    content: ""; /* Allows psuedo element to show */
    background: #EC008C; /* The color you want the icon to change to */
    mix-blend-mode: multiply; /* Only apply color on top of white, use screen if icon is black */
}

ดู codepen นี้ (ใช้การสลับสีกับโฮเวอร์): http://codepen.io/chrscblls/pen/bwAXZO


ฉันโฮสต์ภาพจาก imgur อีกครั้งมีปัญหาในการโหลด
chrscblls

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

1
@chrscblls ลิงก์เสียไป
Steven Lu

15

บรรทัดเดียวที่ง่ายที่สุดที่เหมาะกับฉัน:

filter: opacity(0.5) drop-shadow(0 0 0 blue);

คุณสามารถปรับความทึบแสงได้ตั้งแต่ 0 ถึง 1 เพื่อให้สีอ่อนลงหรือเข้มขึ้น


ดี นี่เป็นการหลีกเลี่ยงข้อ จำกัด ทั้งหมดของโซลูชันอื่น ๆ ที่นี่
cdonner

3
ทำซ้ำเงา 2-3 ครั้งเพื่อให้แข็งแกร่งขึ้น
djdance

1
GENIUS SOLUTION, ดูยุ่งเล็กน้อยใน CSS, แต่ด้วยความเห็น, มันเข้าใจได้อย่างสมบูรณ์. ขอบคุณ!
Richard KeMiKaL GeNeRaL Denton

จะไม่ทำงานเพื่อให้ได้สีที่แน่นอนมันเป็นการผสมผสานระหว่างสีดั้งเดิมและสีใหม่เสมอ
swisswiss

วิธีการนี้จะบิดเบือนภาพเล็กน้อยและแย่ลงทุกครั้งที่มีการนำเงามาใช้ เช่นเดียวกับการทำสำเนาสำเนาผลลัพธ์จะแตกต่างจากต้นฉบับ
SMAG

8

ฉันพบสิ่งนี้ในขณะที่ Google ฉันพบว่าทำงานได้ดีที่สุดสำหรับฉัน ...

HTML

<div class="img"></div>

CSS

.img {
  background-color: red;
  width: 60px;
  height: 60px;
   -webkit-mask-image: url('http://i.stack.imgur.com/gZvK4.png');
}

http://jsfiddle.net/a63b0exm/


งานนี้ฉันโหวตขึ้น แต่สำหรับบันทึกแล้วมันมีปัญหาบางอย่างเช่นไม่สามารถปรับขนาดภาพพื้นหลังไม่สามารถจัดตำแหน่งภาพและทำซ้ำได้
แดเนียล

โอ้ฉันไม่ลองเลย ... ลองลิงค์ด้านล่าง developer.mozilla.org/en-US/docs/Web/CSS/-webkit-mask-box-imageขอบคุณ Daniel
Muthukumar Anbalagan

7

ฉันต้องการสีที่เฉพาะเจาะจงดังนั้นตัวกรองจึงใช้งานไม่ได้

แต่ฉันสร้าง div โดยใช้ประโยชน์จาก CSS ภาพพื้นหลังหลายภาพและฟังก์ชั่นการไล่ระดับสีเชิงเส้น (ซึ่งสร้างภาพเอง) หากคุณใช้โหมดการผสมผสานภาพซ้อนทับภาพที่แท้จริงของคุณจะถูกผสมกับภาพ "ไล่ระดับสี" ที่สร้างขึ้นซึ่งมีสีที่คุณต้องการ (ที่นี่ # BADA55)

.colored-image {
        background-image: linear-gradient(to right, #BADA55, #BADA55), url("https://i.imgur.com/lYXT8R6.png");
        background-blend-mode: overlay;
        background-size: contain;
        width: 200px;
        height: 200px;        
    }
<div class="colored-image"></div>


ไม่ได้ผลสำหรับฉัน ฉันไม่สามารถบอกได้ว่าทำไมฉันคัดลอกวางอย่างแน่นอน
Vic Seedoubleyew

@VicSeedoubleyty snippet ทำงานได้ดี ตรวจสอบ div ของคุณโดยใช้เครื่องมือ dev เพื่อให้แน่ใจว่า CSS ของคุณถูกนำไปใช้จริง นอกจากนี้ตรวจสอบให้แน่ใจว่า URL ของภาพของคุณถูกต้องหากคุณไม่ได้ใช้ที่ฉันให้ไว้ แก้ไข: หากตัวอย่างข้อมูลไม่ได้ผลสำหรับคุณคุณอาจใช้เบราว์เซอร์ที่ล้าสมัยหรือไม่รองรับฟังก์ชันการไล่ระดับสีเชิงเส้น
rolznz

5

ตอบเพราะฉันกำลังมองหาทางออกสำหรับเรื่องนี้

ปากกาใน @chrscblls ตอบสนองได้ดีถ้าคุณมีพื้นหลังสีขาวหรือสีดำ แต่ของฉันไม่ได้ นอกจากนี้ภาพเหล่านี้ถูกสร้างขึ้นมาด้วย ng-repeat ดังนั้นฉันจึงไม่มี url ของพวกเขาใน css ของฉันและคุณไม่สามารถใช้ :: หลังจากบนแท็ก img

ดังนั้นฉันคิดหาวิธีแก้ไขและคิดว่ามันอาจช่วยคนได้หากพวกเขาสะดุดเกินไป

ดังนั้นสิ่งที่ฉันทำค่อนข้างเหมือนกันกับความแตกต่างหลัก ๆ สามประการ:

  • URL ที่อยู่ในแท็ก img ของฉันฉันใส่ (และป้ายกำกับ) ในอีกส่วนหนึ่งซึ่ง :: หลังจากจะใช้งานได้
  • 'ผสมโหมดผสม' ตั้งไว้ที่ 'ความแตกต่าง' แทน 'ทวีคูณ' หรือ 'หน้าจอ'
  • ฉันเพิ่ม :: มาก่อนด้วยค่าเดียวกันดังนั้น :: หลังจากจะทำ 'ความแตกต่าง' ของ 'ความแตกต่าง' ที่ทำโดย :: มาก่อนและยกเลิกด้วยตนเอง

หากต้องการเปลี่ยนจากสีดำเป็นสีขาวหรือสีขาวเป็นสีดำสีพื้นหลังจะต้องเป็นสีขาว จากสีดำเป็นสีคุณสามารถเลือกสีอะไรก็ได้ จากสีขาวเป็นสีคุณจะต้องเลือกสีที่ตรงกันข้ามของสีที่คุณต้องการ

.divClass{
   position: relative;
   width: 100%;
   height: 100%;
   text-align: left;
}
.divClass:hover::after, .divClass:hover::before{
   position: absolute;
   width: 100%;
   height: 100%;
   background: #FFF;
   mix-blend-mode: difference;
   content: "";
}

https://codepen.io/spaceplant/pen/oZyMYG


3

ไม่จำเป็นต้องตั้งค่าแบบอักษรทั้งหมดหากคุณต้องการเพียงไอคอนเดียวรวมถึงฉันรู้สึกว่า "สะอาด" เป็นองค์ประกอบส่วนบุคคล ดังนั้นเพื่อจุดประสงค์นี้ใน HTML5 คุณสามารถวาง SVG ไว้ในผังเอกสารโดยตรง จากนั้นคุณสามารถกำหนดคลาสในสไตล์ชีต. CSS ของคุณและเข้าถึงสีพื้นหลังด้วยfillคุณสมบัติ:

ซอทำงาน: http://jsfiddle.net/qmsj0ez1/

โปรดทราบว่าในตัวอย่างฉันใช้:hoverเพื่ออธิบายพฤติกรรม; หากคุณต้องการเปลี่ยนสีสำหรับสถานะ "ปกติ" คุณควรลบ pseudoclass


1

หากต้องการเปลี่ยนสีอย่างแท้จริงคุณสามารถรวมการเปลี่ยน CSS กับ -webkit-filter ซึ่งเมื่อเกิดอะไรขึ้นคุณจะเรียกใช้ -webkit-filter ที่คุณเลือก ตัวอย่างเช่น:

img {
    -webkit-filter:grayscale(0%);
    transition: -webkit-filter .3s linear;
    }
img:hover 
    {
    -webkit-filter:grayscale(75%);
    }

1

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

.img1 { filter: invert(100%); }


0

body{
  background: #333 url(/images/classy_fabric.png);
  width: 430px;
  margin: 0 auto;
  padding: 30px;
}
.preview{
  background: #ccc;
  width: 415px;
  height: 430px;
  border: solid 10px #fff;
}

input[type='radio'] {
  -webkit-appearance: none;
  -moz-appearance: none;
  width: 25px;
  height: 25px;
  margin: 5px 0 5px 5px;
  background-size: 225px 70px;
  position: relative;
  float: left;
  display: inline;
  top: 0;
  border-radius: 3px;
  z-index: 99999;
  cursor: pointer;
  box-shadow: 1px 1px 1px #000;
}

input[type='radio']:hover{
  -webkit-filter: opacity(.4);
  filter: opacity(.4);    
}

.red{
  background: red;
}

.red:checked{
  background: linear-gradient(brown, red)
}

.green{
  background: green;
}

.green:checked{
  background: linear-gradient(green, lime);
}

.yellow{
  background: yellow;
}

.yellow:checked{
  background: linear-gradient(orange, yellow);
}

.purple{
  background: purple;
}

.pink{
  background: pink;
}

.purple:checked{
  background: linear-gradient(purple, violet);
}

.red:checked ~ img{
  -webkit-filter: opacity(.5) drop-shadow(0 0 0 red);
  filter: opacity(.5) drop-shadow(0 0 0 red);
}

.green:checked ~ img{
  -webkit-filter: opacity(.5) drop-shadow(0 0 0 green);
  filter: opacity(.5) drop-shadow(0 0 0 green);
}

.yellow:checked ~ img{
  -webkit-filter: opacity(.5) drop-shadow(0 0 0 yellow);
  filter: opacity(.5) drop-shadow(0 0 0 yellow);
}

.purple:checked ~ img{
  -webkit-filter: opacity(.5) drop-shadow(0 0 0 purple);
  filter: opacity(.5) drop-shadow(0 0 0 purple);
}

.pink:checked ~ img{
  -webkit-filter: opacity(.5) drop-shadow(0 0 0 pink);
  filter: opacity(.5) drop-shadow(0 0 0 pink);
}


img{
  width: 394px;
  height: 375px;
  position: relative;
}

.label{
  width: 150px;
  height: 75px;
  position: absolute;
  top: 170px;
  margin-left: 130px;
}

::selection{
  background: #000;
}
<div class="preview">
  <input class='red' name='color' type='radio' />
  <input class='green' name='color' type='radio' />
    <input class='pink' name='color' type='radio' />
  <input checked class='yellow' name='color' type='radio' />
  <input class='purple' name='color' type='radio' />  
  <img src="https://i.stack.imgur.com/bd7VJ.png"/>
</div>

ที่มา: https://codepen.io/taryaoui/pen/EKkcu

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.