เมื่อกำหนด PNG แบบโปร่งใสที่แสดงรูปทรงที่เรียบง่ายในสีขาวเป็นไปได้หรือไม่ที่จะเปลี่ยนสีของสิ่งนี้ผ่าน CSS การซ้อนทับบางอย่างหรือไม่?
เมื่อกำหนด PNG แบบโปร่งใสที่แสดงรูปทรงที่เรียบง่ายในสีขาวเป็นไปได้หรือไม่ที่จะเปลี่ยนสีของสิ่งนี้ผ่าน CSS การซ้อนทับบางอย่างหรือไม่?
คำตอบ:
คุณสามารถใช้ตัวกรองด้วย-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">
.gifcorrect{ filter: invert(28%) sepia(100%) hue-rotate(-180deg) saturate(3); }
ซึ่งหมายความว่าคุณสามารถเปลี่ยนจากสีดำ & ใสหรือระดับสีเทาเป็นสีได้และใช้งานได้แม้ใน gif ที่เคลื่อนไหว
ฉันพบตัวอย่างโค้ดโคเด็นที่ยอดเยี่ยมนี้ที่คุณแทรกค่าสีฐานสิบหกของคุณและส่งคืนตัวกรองที่ต้องการเพื่อใช้สีนี้กับ png
ตัวสร้างตัวกรอง CSS เพื่อแปลงจากสีดำเป็นสีฐานสิบหกเป้าหมาย
เช่นฉันต้องการ png ของฉันเพื่อให้มีสี# 1a9790ต่อไปนี้
จากนั้นคุณต้องใช้ตัวกรองต่อไปนี้กับคุณ png
filter: invert(48%) sepia(13%) saturate(3207%) hue-rotate(130deg) brightness(95%) contrast(80%);
filter: invert(1%) sepia(1%) saturate(1%) hue-rotate(1deg) brightness(1000%) contrast(80%);
คุณอาจต้องการดูแบบอักษรของไอคอน 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 ดาวน์โหลดได้ฟรี พวกเขายังมีเคล็ดลับบางอย่างเกี่ยวกับวิธีการสร้างตัวอักษรไอคอนของตัวเองมาก
ฉันสามารถทำได้โดยใช้ตัวกรอง 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>
แท็ก img มีคุณสมบัติพื้นหลังเหมือนกัน หากคุณมี PNG สีขาวที่มีรูปร่างโปร่งใสเช่นเดียวกับ stencil คุณสามารถทำสิ่งนี้ได้:
<img src= 'stencil.png' style= 'background-color: red'>
ใช่แล้ว
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)
ในเบราว์เซอร์ส่วนใหญ่คุณสามารถใช้ตัวกรอง:
ทั้ง<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 เพื่อตั้งค่าตัวกรองตอนรันไทม์:
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>
hue-rotate
ไม่ทำงานบนพื้นสีขาว
คิดว่าฉันมีทางออกสำหรับสิ่งนี้นั่นคือ) สิ่งที่คุณกำลังมองหาเมื่อ 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
บรรทัดเดียวที่ง่ายที่สุดที่เหมาะกับฉัน:
filter: opacity(0.5) drop-shadow(0 0 0 blue);
คุณสามารถปรับความทึบแสงได้ตั้งแต่ 0 ถึง 1 เพื่อให้สีอ่อนลงหรือเข้มขึ้น
ฉันพบสิ่งนี้ในขณะที่ 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');
}
ฉันต้องการสีที่เฉพาะเจาะจงดังนั้นตัวกรองจึงใช้งานไม่ได้
แต่ฉันสร้าง 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>
ตอบเพราะฉันกำลังมองหาทางออกสำหรับเรื่องนี้
ปากกาใน @chrscblls ตอบสนองได้ดีถ้าคุณมีพื้นหลังสีขาวหรือสีดำ แต่ของฉันไม่ได้ นอกจากนี้ภาพเหล่านี้ถูกสร้างขึ้นมาด้วย ng-repeat ดังนั้นฉันจึงไม่มี url ของพวกเขาใน css ของฉันและคุณไม่สามารถใช้ :: หลังจากบนแท็ก 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: "";
}
ไม่จำเป็นต้องตั้งค่าแบบอักษรทั้งหมดหากคุณต้องการเพียงไอคอนเดียวรวมถึงฉันรู้สึกว่า "สะอาด" เป็นองค์ประกอบส่วนบุคคล ดังนั้นเพื่อจุดประสงค์นี้ใน HTML5 คุณสามารถวาง SVG ไว้ในผังเอกสารโดยตรง จากนั้นคุณสามารถกำหนดคลาสในสไตล์ชีต. CSS ของคุณและเข้าถึงสีพื้นหลังด้วยfill
คุณสมบัติ:
ซอทำงาน: http://jsfiddle.net/qmsj0ez1/
โปรดทราบว่าในตัวอย่างฉันใช้:hover
เพื่ออธิบายพฤติกรรม; หากคุณต้องการเปลี่ยนสีสำหรับสถานะ "ปกติ" คุณควรลบ pseudoclass
หากต้องการเปลี่ยนสีอย่างแท้จริงคุณสามารถรวมการเปลี่ยน CSS กับ -webkit-filter ซึ่งเมื่อเกิดอะไรขึ้นคุณจะเรียกใช้ -webkit-filter ที่คุณเลือก ตัวอย่างเช่น:
img {
-webkit-filter:grayscale(0%);
transition: -webkit-filter .3s linear;
}
img:hover
{
-webkit-filter:grayscale(75%);
}
เมื่อเปลี่ยนรูปภาพจากสีดำเป็นสีขาวหรือสีขาวเป็นสีดำฟิลเตอร์หมุนสีฮิวไม่ทำงานเนื่องจากสีดำและสีขาวไม่ใช่สีในทางเทคนิค แต่เปลี่ยนสีดำและสีขาว (จากสีดำเป็นสีขาวหรือในทางกลับกัน) จะต้องทำกับคุณสมบัติตัวกรองกลับ
.img1 {
filter: invert(100%);
}
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>
background-color
คุณสมบัติ CSS คุณสามารถสร้างส่วนที่ไม่โปร่งใสซึ่งจะได้รับการแก้ไขและส่วนที่โปร่งใสของภาพซึ่งจะถูกเติมด้วยสีใด ๆ ที่คุณชอบผ่าน CSS นั่นคือสิ่งที่คุณต้องการบรรลุ