ฉันจะสร้างหยดน้ำตาใน HTML ได้อย่างไร


222

ฉันจะสร้างรูปร่างเช่นนี้เพื่อแสดงบนหน้าเว็บได้อย่างไร

ฉันไม่ต้องการใช้ภาพเพราะพวกเขาจะพร่ามัวเมื่อปรับขนาด

รูปทรงหยดน้ำฉันต้องใช้ HTML, CSS หรือ SVG

ฉันลองใช้CSS :

.tear {
  display: inline-block;
  transform: rotate(-30deg);
  border: 5px solid green;
  width: 50px;
  height: 100px;
  border-top-left-radius: 50%;
  border-bottom-left-radius: 50%;
  border-bottom-right-radius: 50%;
}
<div class="tear">
</div>

ที่กลายเป็นเมาจริงๆ

จากนั้นฉันก็ลองใช้ SVG:

<svg viewBox="0 100 100">
  <polygon points="50,0 100,70 50,100 0,70"/>
</svg>

มันมีรูปร่าง แต่ส่วนล่างไม่โค้ง

มีวิธีสร้างรูปร่างนี้เพื่อให้สามารถใช้ในหน้า HTML ได้หรือไม่


12
"ฉันไม่ต้องการใช้ภาพเพราะพวกเขาจะเบลอในการปรับขนาด" ทำไมคุณถึงขยายภาพ? พวกเขาจะไม่พร่ามัวถ้าคุณใช้[srcset]หรือ<picture>องค์ประกอบ ยังดีกว่าเพียงเชื่อมโยงไปยังภาพ svg:<img src="tear.svg" alt="Teardrop"/>
zzzzBov

32
@zzzzBov: คุณแนะนำpictureองค์ประกอบจริงๆเหรอ? ไม่รองรับ IE, ไม่รองรับ Chrome เวอร์ชันก่อนหน้า, ไม่รองรับ Safari ฉันควรทำต่อหรือไม่
jbutler483

9
@zzzzBov why are you scaling the image?ภาพอาจปรากฏพร่ามัวโดยไม่ต้องปรับขนาด สิ่งที่คุณต้องการคือเบราว์เซอร์ที่กำลังซูมเข้าในกรณีของฉันฉันมีหน้าจอ HighDPI และรูปภาพที่พร่ามัวมากมาย ดังนั้นถ้าคุณสามารถหลีกเลี่ยงภาพโดยใช้ SVG ไปได้เลย
Nolonar

63
Unicode แก้ปัญหาได้ทั้งหมด ... U + 1F4A7 💧
Thomas Weller

21
@Thomas ฉันเห็นรูปสี่เหลี่ยม: / i.stack.imgur.com/8fXMf.png
user000001

คำตอบ:


327

วิธี SVG:

คุณสามารถบรรลุเส้นโค้งคู่ได้อย่างง่ายดายด้วยinline SVGและ<path/>องค์ประกอบแทน<polygon/>องค์ประกอบที่ไม่อนุญาตให้มีรูปร่างโค้ง

ตัวอย่างต่อไปนี้ใช้<path/>องค์ประกอบที่มี:

<svg width="30%" viewbox="0 0 30 42">
  <path fill="transparent" stroke="#000" stroke-width="1.5"
        d="M15 3
           Q16.5 6.8 25 18
           A12.8 12.8 0 1 1 5 18
           Q13.5 6.8 15 3z" />
</svg>

SVG เป็นเครื่องมือที่ยอดเยี่ยมในการสร้างรูปร่างชนิดนี้ด้วยเส้นโค้งคู่ คุณสามารถตรวจสอบโพสต์นี้เกี่ยวกับเส้นโค้งคู่ด้วยการเปรียบเทียบ SVG / CSS ข้อดีของการใช้ SVG ในกรณีนี้คือ:

  • การควบคุมส่วนโค้ง
  • เติมการควบคุม (ความทึบแสงสี)
  • การควบคุมจังหวะ (ความกว้างความทึบสี)
  • จำนวนรหัส
  • ใช้เวลาในการสร้างและรักษารูปร่าง
  • สามารถปรับขนาดได้
  • ไม่มีการร้องขอ HTTP (หากใช้แบบอินไลน์เหมือนในตัวอย่าง)

การสนับสนุนเบราว์เซอร์สำหรับ inline SVG กลับไปที่ Internet Explorer 9 ดูที่canIuseสำหรับข้อมูลเพิ่มเติม


มันสามารถลดเป็น: <svg width="100%" height="100%" viewBox="0 0 8 8" /> <path d="M4 1L3 4A1.2 2 0 1 0 5 4"/> </svg> ... สิ่งนี้จะเติมเต็มพื้นที่ที่คุณให้ดังนั้นจึงอาจทำให้เม็ดฝน "อ้วน" หรือ "ผอม" ... เปลี่ยนเป็นความสูง / ความกว้างคงที่หากจำเป็น
technosaurus

1
@technosaurus ปัญหาเกี่ยวกับการลดจำนวนคำสั่งในแอd="..."ททริบิวต์คือคุณไม่มีเส้นโค้งคู่ที่ด้านบนของการดรอปอีกต่อไป
web-tiki

10
+1 เพราะคุณควรใช้ SVG สำหรับสิ่งนี้ไม่ใช่ CSS คุณสมบัติ CSS ที่คุณต้องการเพื่อให้บรรลุนั้นมีการสนับสนุนเบราว์เซอร์เดียวกันกับ SVG ดังนั้นจึงไม่มีข้อได้เปรียบสำหรับ CSS ในคะแนนนั้น CSS สามารถทำรูปร่างได้ แต่นั่นไม่ใช่สิ่งที่ออกแบบมา อย่าพยายามตอกตะปูด้วยไขควงเพียงเพื่อความฉลาดเมื่อคุณสามารถทำได้ด้วยเครื่องมือที่ออกแบบมาสำหรับงาน
สิงโต

6
ยิ่งไปกว่านั้น: สร้างไฟล์ SVG และใช้<img />ในเอกสารไฮเปอร์เท็กซ์
Andreas Rejbrand

@AndreasRejbrand ที่สามารถเป็นความคิดที่ดีขึ้นอยู่กับโครงการ แต่จะเพิ่มคำขอ HTTP ซึ่ง OP ดูเหมือนจะต้องการหลีกเลี่ยง
web-tiki

135

รัศมีชายแดนพื้นฐาน

คุณสามารถทำได้ภายใน CSS ได้อย่างง่ายดายโดยใช้รัศมีเส้นขอบและการแปลง CSS ของคุณออกมาเล็กน้อย

.tear {
  width: 50px;
  height: 50px;
  border-radius: 0 50% 50% 50%;
  border: 3px solid black;
  transform: rotate(45deg);
  margin-top: 20px;
}
<div class="tear"></div>

Advanced Border-Radius

สิ่งนี้จะคล้ายกันกับด้านบน แต่ให้รูปร่างที่มากกว่าเล็กน้อย

.tear {
  width: 50px;
  height: 50px;
  border-radius: 80% 0 55% 50% / 55% 0 80% 50%;
  border: 3px solid black;
  transform: rotate(-45deg);
  margin-top: 20px;
}
<div class="tear"></div>


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

12
@zzzzBov การใช้ CSS สำหรับรูปภาพและสไปรต์เป็นการใช้งานทั่วไป มันเป็นรหัสที่น้อยที่สุดในการสร้าง "รูปภาพ" ทั่วไป ฉันเชื่อว่ามันเหมาะสมเพราะสามารถใช้งานได้ภายในคำถามที่ระบุว่าสามารถใช้งานได้บนหน้าเว็บ
Stewartside

13
@zzzzBov: CSS นั้นสมบูรณ์แบบสำหรับรูปร่าง ใครจะพูดในสิ่งที่รูปร่างดังกล่าวใช้สำหรับ? รูปภาพมีความหมาย - OP ได้ระบุไว้อย่างชัดเจนว่าพวกเขาไม่ต้องการใช้ภาพไม่เช่นนั้นทำไมคำถามเช่นนี้จึงถูกถาม
jbutler483

46
@ jbutler483 "CSS นั้นสมบูรณ์แบบสำหรับรูปร่าง" ไม่มันแย่มาก เพียงเพราะคุณสามารถไม่ได้หมายความว่าคุณควร มันแนะนำขยะทุกประเภทในมาร์กอัปและเป็นระเบียบที่น่าเบื่อในการบำรุงรักษา รักษาภาพได้ง่ายกว่ามากเนื่องจากแยกออกเป็นไฟล์ที่มีอยู่ในตัวเองได้อย่างง่ายดาย
zzzzBov

19
'ขยะในมาร์กอัป' เกิดขึ้นเมื่อคุณใช้ bootstrap หรือไอคอนตัวอักษรที่ยอดเยี่ยม อย่างจริงจังฉันคิดว่าคุณกำลังจะขึ้นไปด้านบนสำหรับสิ่งนี้เมื่อ (เห็นได้ชัดว่า) สิ่งนี้สามารถทำได้โดยใช้การประกาศรัศมีชายแดน แต่ผู้ที่จะบอกคุณว่าอย่าใช้ภาพ?
jbutler483

88

ปัญหาหลักของคุณกับรหัส CSS ของคุณคือ:

  1. คุณใช้ความสูงที่แตกต่างจากความกว้าง
  2. คุณยังไม่ได้หมุนขนาดมุมที่ถูกต้อง

ดังนั้นโดย 'แก้ไข' ปัญหาเหล่านี้คุณจะสร้าง:

.tear {
  display: inline-block;
  transform: rotate(-45deg);
  border: 5px solid green;
  width: 100px;
  height: 100px;
  border-top-left-radius: 50%;
  border-bottom-left-radius: 50%;
  border-bottom-right-radius: 50%;
}
/***for demo only***/

.tear {
  margin: 50px;
}
<div class="tear">
</div>

โปรดทราบว่าเพื่อบันทึกความยาว CSS คุณสามารถเขียนคุณสมบัติเส้นขอบรัศมีของคุณอีกครั้งเพื่อ:

border-radius: 50% 0 50% 50%;

สิ่งนี้สามารถปรับปรุงได้ด้วยองค์ประกอบปลอมตามที่แสดงในซอนี้

ทางเลือก

ฉันพบสิ่งนี้โดยVinay Challuruบน codepen

โปรดทราบว่าด้วยเหตุผลที่นี่ฉันสามารถสร้างSVGเพื่อสร้างรูปร่าง / เกือบทุกอย่างที่เป็นไปได้ ตัวอย่างเช่นการส่งออกอย่างรวดเร็วคือ:

ใช้ SVG และช่วยให้คุณสามารถเปลี่ยนรูปร่างได้หลายวิธีโดยมีความสามารถในการเปลี่ยนรูปร่างเป็นผลลัพธ์ที่ต้องการ:

ข้อจำกัดความรับผิดชอบฉันไม่ได้เขียนปากกาด้านบนเพียงแค่มีที่มาเท่านั้น


เวอร์ชั่น CSS

แม้ว่าสิ่งนี้จะยังไม่เสร็จสมบูรณ์คุณอาจสร้างรูปร่างนี้ได้โดยใช้ CSS

เวอร์ชั่น SVG

ฉันควรรู้ว่า SVG ควรอยู่ที่ด้านบนสุดของคำตอบนี้อย่างไรก็ตามฉันชอบความท้าทายและนี่คือความพยายามของ SVG

svg {
  height: 300px;
}
svg path {
  fill: tomato;
}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 100 100">

  <path d="M49.015,0.803
    c-0.133-1.071-1.896-1.071-2.029,0
    C42.57,36.344,20,43.666,20,68.367   
    C20,83.627,32.816,96,48,96
    s28-12.373,28-27.633
    C76,43.666,53.43,36.344,49.015,0.803z 
    M44.751,40.09   
    c-0.297,1.095-0.615,2.223-0.942,3.386
    c-2.007,7.123-4.281,15.195-4.281,24.537
    c0,5.055-2.988,6.854-5.784,6.854   
    c-3.189,0-5.782-2.616-5.782-5.831
    c0-11.034,5.315-18.243,10.005-24.604
    c1.469-1.991,2.855-3.873,3.983-5.749   
    c0.516-0.856,1.903-0.82,2.533,0.029
    C44.781,39.116,44.879,39.619,44.751,40.09z"/>


</svg>

เมื่อเปลี่ยนpathค่าแล้วคุณจะสามารถเปลี่ยนรูปร่างของหยดน้ำตาได้


10
สิ่งเหล่านี้ดูเหมือนจะเป็น ... verbose โซลูชัน js ไร้สาระโดยเฉพาะ
egid

4
@egid: ฉันได้ระบุไว้ในคำตอบของฉันว่าฉันไม่ได้สร้างเวอร์ชัน js นอกจากนี้โปรดทราบว่าเวอร์ชัน js ช่วยให้คุณสามารถปรับเปลี่ยนรูปร่างในขณะใช้งานได้
jbutler483

55

IMO รูปทรงนี้ต้องการเส้นโค้งเบซิเยร์ที่ราบรื่น

คำถาม Drop:

สำหรับคำถามที่ลดลง

  • ไม่สามารถใช้เส้นโค้งเรียบเนื่องจากจุดควบคุมจะไม่มีความยาวเท่ากัน แต่เรายังคงต้องทำให้จุดควบคุมอยู่ตรงข้ามกัน (180 องศา) กับจุดควบคุมก่อนหน้าเพื่อให้แน่ใจว่าเส้นโค้งจะต่อเนื่องเต็มรูปแบบภาพด้านล่างแสดงจุดนี้:

ป้อนคำอธิบายรูปภาพที่นี่
หมายเหตุ : เส้นโค้งสีแดงและสีน้ำเงินเป็นเส้นโค้งกำลังสองที่แตกต่างกัน

  • stroke-linejoin="miter"สำหรับส่วนปลายแหลม

  • เนื่องจากรูปร่างนี้ใช้cคำสั่งที่ต่อเนื่องกันเท่านั้นเราจึงสามารถละเว้นได้

นี่คือตัวอย่างสุดท้าย:

<svg height="300px" width="300px" viewBox="0 0 12 16">
  <path fill="#FFF" stroke="black" stroke-width="0.5" stroke-linejoin="miter" 
        d="M 6 1 c -2 3 -5 5 -5 9
           0 7 10 7 10 0 
           0 -4 -3 -6 -5 -9z" />
</svg>

TBH แม้ว่าเส้นโค้งของคำตอบที่ได้รับการยอมรับนั้นค่อนข้างไม่ต่อเนื่อง


สำหรับ IE 5-8 (VML)

ใช้งานได้กับ IE 5-8 เท่านั้น VMLใช้คำสั่งที่แตกต่างกว่าSVG เช่น. มันใช้v สำหรับญาติลูกบาศก์เบซิเยร์

หมายเหตุ:ตัวอย่างนี้จะไม่ทำงานใน IE 5-8 ด้วย คุณต้องสร้างไฟล์ html และเรียกใช้มันโดยตรงในเบราว์เซอร์

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html xmlns:v="urn:schemas-microsoft-com:vml">
<head>
    <style> v\:* { behavior: url(#default#VML); }

    </style >
</head>
<body>
    <div style="width:240; height:320;">
        <v:shape coordorigin="0 0" coordsize="12 16" fillcolor="white" strokecolor="black" strokewidth="1"
            strokeweight="5" style="width:240; height:320" 
            path="M 6 1 v -2 3 -5 5 -5 9
           0 7 10 7 10 0 
           0 -4 -3 -6 -5 -9 x e">
        </v:shape>
    </div>
</body>
</html>

"ไม่สามารถใช้เส้นโค้งเรียบเนื่องจากจุดควบคุมจะไม่ยาวเท่ากัน" "ราบรื่น" ไม่ได้หมายความว่าจับแทนเจนต์ (จุดควบคุม) นั่งเป็นเส้นตรงหรือไม่? ทำไมพวกเขาถึงต้องมีความยาวเท่ากัน?
Niccolo M.

2
@NiccoloM ใน SVG เรียบโค้ง (T และ S คำสั่ง) หมายความว่าจับเป็นสมมาตรตรงข้ามเช่นเดียวกับเท่ากับความยาวจับก่อนหน้านี้ ในภาษาปกติเส้นโค้งที่ราบรื่นอาจหมายถึงความยาวของด้ามจับที่แตกต่างกัน แต่ใน svg ความยาวก็เท่ากับเส้นโค้งก่อนหน้าที่จับด้วย :)
Max Payne

42

หรือหากฟอนต์ของผู้ชมสนับสนุนให้ใช้อักขระ Unicode

DROPLET: 💧 ( &#128167;)

หรือ

BLACK DROPLET: 🌢 ( &#127778;)

ปรับขนาดให้เหมาะสม!


คุณสามารถใช้สิ่งนี้กับ @ font-face แต่จากนั้นคุณมีไฟล์ตัวอักษรเพื่อให้ถูกที่และเช่นนั้น
1934286

3
SVG และสัญลักษณ์ Unicode เฉพาะเช่นนี้ถือว่าดี CSS สำหรับสิ่งนี้ไม่ดี PNG ไม่เป็นไร แต่ไม่สมบูรณ์แบบเนื่องจากเป็นกราฟิกแรสเตอร์ JPG แย่มาก ๆ แย่มากที่ฉันจะได้ฝันร้ายถ้าฉันเห็นมัน
Andreas Rejbrand

@AndreasRejbrand PNG ขนาด 20x20 จะลดขนาดเลวร้ายที่สุดกว่า JPG ขนาด 200x200 และด้วยขนาดที่เท่ากัน JPG ที่ไม่มีการบีบอัดจะเทียบเท่ากับ PNG พวกเขาทั้งแรสเตอร์และพวกเขาประสบปัญหาเดียวกัน
โก้

@nico: ตามทฤษฎีแล้วคุณสามารถใช้ JPG โดยไม่มีการบีบอัดได้ แต่อินเทอร์เน็ตเต็มไปด้วยภัยพิบัติเช่นนี้: en.wikipedia.org/wiki/Atomic_number#/media/…
Andreas Rejbrand

28

ฉันจะใช้ SVG เป็นการส่วนตัวสำหรับเรื่องนี้ คุณสามารถสร้าง SVG ได้ในซอฟต์แวร์กราฟิกแบบเวกเตอร์ส่วนใหญ่ ฉันอยากจะแนะนำ:

ฉันได้ทำสิ่งหนึ่งไว้ด้านล่างนี้เพื่อติดตามรูปร่างของคุณใน Illustrator

<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="223.14px" height="319.008px" viewBox="0 0 223.14 319.008" enable-background="new 0 0 223.14 319.008" xml:space="preserve">
  <path fill="none" stroke="#000000" stroke-width="12" stroke-miterlimit="10" d="M111.57,13.291c0,0,57.179,86.984,72.719,108.819
    	c30.359,42.66,41.005,114.694,1.626,154.074c-20.464,20.463-47.533,30.293-74.344,29.488h-0.002
    	c-26.811,0.805-53.88-9.025-74.344-29.488C-2.154,236.804,8.492,164.77,38.851,122.11C54.391,100.275,111.57,13.291,111.57,13.291z" />
</svg>


27

ผ้าใบ HTML

นี่คือตัวเลือกที่ยังไม่ได้เปิดในชุดข้อความนี้ คำสั่งที่ใช้สำหรับภาพวาด Canvas นั้นคล้ายกับ SVG มาก (และ web-tiki สมควรได้รับเครดิตสำหรับแนวคิดพื้นฐานที่ใช้ในคำตอบนี้)

รูปร่างที่เป็นปัญหาสามารถสร้างได้โดยใช้คำสั่งเส้นโค้งของ Canvas (Quadratic หรือ Bezier) หรือ Path API คำตอบมีตัวอย่างสำหรับทั้งสามวิธี

สนับสนุนเบราว์เซอร์สำหรับผ้าใบค่อนข้างดี


ใช้เส้นโค้งกำลังสอง

window.onload = function() {
  var canvas = document.getElementById('canvas');
  if (canvas.getContext) {
    var ctx = canvas.getContext('2d');

    ctx.beginPath();
    ctx.lineJoin = 'miter';
    ctx.moveTo(120, 20);
    ctx.quadraticCurveTo(117.5, 30, 148, 68);
    ctx.arc(120, 88, 34.5, 5.75, 3.66, false);
    ctx.quadraticCurveTo(117.5, 35, 120, 20);
    ctx.closePath();
    ctx.strokeStyle = '#000';
    ctx.lineWidth = 2;
    ctx.fillStyle = '#77CCEE'
    ctx.stroke();
    ctx.fill();
  }
}
canvas {
  margin: 50px;
  height: 100px;
  width: 200px;
  transform: scale(1.5);
}

body{
  background-image: radial-gradient(circle, #3F9CBA 0%, #153346 100%);
}
<canvas id='canvas'></canvas>

ด้านล่างเป็นรุ่นขั้นสูงที่มีการเติมไล่ระดับสีและเงา ฉันได้รวมเอhoverฟเฟกต์กับรูปร่างเพื่อแสดงข้อเสียเปรียบของ Canvas เมื่อเปรียบเทียบกับ SVG Canvas ใช้ raster (พิกเซล) และด้วยเหตุนี้จึงดูเบลอ / พิกเซลเมื่อปรับสัดส่วนเกินจุดที่กำหนด ทางออกเดียวที่จะทาสีรูปร่างในเบราว์เซอร์ทุกขนาดที่ปรับซึ่งเป็นค่าใช้จ่าย


ใช้ Bezier Curves

ใช้ Path API

หมายเหตุ:ดังที่ได้กล่าวไว้ในคำตอบของฉันที่นี่ Path API ยังไม่รองรับโดย IE และ Safari


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


ฉันไม่เห็นว่า svg เป็นตัวเลือกที่ดีกว่าเสมอ มันเป็นตัวเลือกที่ดีกว่าอย่างแน่นอนในหลาย ๆ กรณีเช่นนี้ แต่ผ้าใบมีข้อดีของตัวเอง คำตอบที่ดี จากคำตอบของคุณฉันสามารถทำสิ่งนั้นได้อย่างแน่นอนมันง่ายกว่ามากที่จะใช้ SVG!
Max Payne

ใช่ @TimKrul ง่ายต่อการเขียน / ใช้ SVG Canvas มีข้อดีของตัวเอง แต่จากสิ่งที่ฉันอ่านมันก็ไม่ได้ประโยชน์อะไรมากนักเมื่อใช้โลโก้ที่เรียบง่ายเช่นรูปร่างเป็นหลักเพราะมันเป็นแบบแรสเตอร์ซึ่งแตกต่างจาก SVG
Harry

25

ฉันยังพบสิ่งนี้ในCodepenทำโดยผู้ใช้Ana Tudorโดยใช้ CSS และbox-shadowสมการลักษณะและพารามิเตอร์ ง่ายมากรหัสน้อยมาก และเบราว์เซอร์จำนวนมากรองรับ CSS3 Box-shadow style:

body {
  background-color: black;
}
.tear {
  position: absolute;
  top: 50%;
  left: 50%;
  margin: -0.125em;
  width: 0.25em;
  height: 0.25em;
  border-radius: 50%;
  box-shadow: 0em -5em red, 0.00118em -4.97592em #ff1800, 0.00937em -4.90393em #ff3000, 0.03125em -4.7847em #ff4800, 0.07283em -4.6194em #ff6000, 0.13915em -4.40961em #ff7800, 0.23408em -4.15735em #ff8f00, 0.36em -3.86505em #ffa700, 0.51777em -3.53553em #ffbf00, 0.70654em -3.17197em gold, 0.92382em -2.77785em #ffef00, 1.16547em -2.35698em #f7ff00, 1.42582em -1.91342em #dfff00, 1.69789em -1.45142em #c7ff00, 1.97361em -0.97545em #afff00, 2.2441em -0.49009em #97ff00, 2.5em 0.0em #80ff00, 2.73182em 0.49009em #68ff00, 2.93032em 0.97545em #50ff00, 3.08681em 1.45142em #38ff00, 3.19358em 1.91342em #20ff00, 3.24414em 2.35698em #08ff00, 3.23352em 2.77785em #00ff10, 3.15851em 3.17197em #00ff28, 3.01777em 3.53553em #00ff40, 2.81196em 3.86505em #00ff58, 2.54377em 4.15735em #00ff70, 2.21783em 4.40961em #00ff87, 1.84059em 4.6194em #00ff9f, 1.42017em 4.7847em #00ffb7, 0.96608em 4.90393em #00ffcf, 0.48891em 4.97592em #00ffe7, 0.0em 5em cyan, -0.48891em 4.97592em #00e7ff, -0.96608em 4.90393em #00cfff, -1.42017em 4.7847em #00b7ff, -1.84059em 4.6194em #009fff, -2.21783em 4.40961em #0087ff, -2.54377em 4.15735em #0070ff, -2.81196em 3.86505em #0058ff, -3.01777em 3.53553em #0040ff, -3.15851em 3.17197em #0028ff, -3.23352em 2.77785em #0010ff, -3.24414em 2.35698em #0800ff, -3.19358em 1.91342em #2000ff, -3.08681em 1.45142em #3800ff, -2.93032em 0.97545em #5000ff, -2.73182em 0.49009em #6800ff, -2.5em 0.0em #7f00ff, -2.2441em -0.49009em #9700ff, -1.97361em -0.97545em #af00ff, -1.69789em -1.45142em #c700ff, -1.42582em -1.91342em #df00ff, -1.16547em -2.35698em #f700ff, -0.92382em -2.77785em #ff00ef, -0.70654em -3.17197em #ff00d7, -0.51777em -3.53553em #ff00bf, -0.36em -3.86505em #ff00a7, -0.23408em -4.15735em #ff008f, -0.13915em -4.40961em #ff0078, -0.07283em -4.6194em #ff0060, -0.03125em -4.7847em #ff0048, -0.00937em -4.90393em #ff0030, -0.00118em -4.97592em #ff0018;
}
<div class="tear"></div>


7
สิ่งนี้ไม่เหมือนกับหยดน้ำตาที่ถูกถาม
doppelgreener

20

เวอร์ชั่น CSS

เนื่องจากมีคำตอบที่ยุติธรรมเล็กน้อยที่นี่ฉันคิดว่าทำไมไม่เพิ่มเข้าไปด้วยวิธีอื่น นี่ใช้ทั้งHTMLและCSSเพื่อสร้างน้ำตา

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

ใช้เพียงครั้งเดียวdivเราสามารถสร้างวงกลมด้วยและborder border-radiusจากนั้นใช้องค์ประกอบหลอก ( :before& :after) เราสร้างสามเหลี่ยม CSS เพิ่มเติมที่นี่สิ่งนี้จะทำหน้าที่เป็นปลายหยดน้ำตา ใช้:beforeเส้นขอบที่เราวาง:afterไว้ด้านบนด้วยขนาดที่เล็กกว่าและสีพื้นหลังที่ต้องการ

div {
  width: 100px;
  height: 100px;
  border-radius: 50%;
  border: 4px solid;
  margin: 80px auto;
  position: relative;
}
div:before,
div:after {
  content: "";
  display: block;
  position: absolute;
  width: 0;
  height: 0;
}
div:before {
  border-left: 50px solid transparent;
  border-right: 50px solid transparent;
  border-bottom: 104px solid black;
  top: -75px;
}
div:after {
  border-left: 46px solid transparent;
  border-right: 46px solid transparent;
  border-bottom: 96px solid #fff;
  top: -66px;
  left: 0;
  right: 0;
  margin: auto;
  z-index: 1;
}
<div></div>


นี่คือตัวอย่างของหยดน้ำที่มีสีพื้นหลัง

มันง่ายเหมือนการใส่สีพื้นหลังลงบนdivและเปลี่ยน:after bottom-borderสีให้เหมือนกัน ในการเปลี่ยนเส้นขอบคุณจะต้องเปลี่ยนdivสีเส้นขอบและ:beforeสีพื้นหลังด้วย


ปากกาเป็นสีแดงขาดค่าสีพื้นหลัง
Persijn

2
@Persijn Harry พูดอะไรบางอย่างในการแชทและฉันมองไปที่ปากกานั่นลืมว่ามันจะบันทึกอัตโนมัติทุกขณะนี้ ฮ่าฮ่าฉันจะนำมันกลับมาเหมือนเดิม เสร็จสิ้น
แดงก่ำ

17

มันค่อนข้างง่ายในการทำเช่นนี้กับ SVG เพียงแค่ใช้ทรัพยากรการแปลงภาพเช่นhttp://image.online-convert.com/convert-to-svgซึ่งใช้ในการสร้างสิ่งต่อไปนี้:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
 "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
 width="213.000000pt" height="300.000000pt" viewBox="0 0 213.000000 300.000000"
 preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.12, written by Peter Selinger 2001-2015
</metadata>
<g transform="translate(0.000000,300.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M1035 2944 c-143 -250 -231 -380 -508 -752 -347 -465 -432 -616 -493
-882 -91 -394 10 -753 285 -1013 508 -479 1334 -361 1677 240 126 221 165 494
105 726 -66 254 -178 452 -609 1076 -96 140 -226 335 -288 435 -155 249 -135
229 -169 170z m85 -212 c40 -69 192 -298 543 -818 268 -396 354 -593 364 -835
12 -281 -82 -509 -296 -714 -103 -99 -236 -173 -396 -221 -82 -25 -105 -27
-260 -28 -148 -1 -181 2 -255 22 -348 96 -611 357 -691 689 -41 167 -25 392
41 587 62 185 154 334 444 716 177 235 320 444 402 592 27 49 51 88 54 88 3 0
25 -35 50 -78z"/>
</g>
</svg>


9
@Persijn ทำไมคุณถึงถามคัดลอกมาจากบรรณาธิการบ้าง Svg คือ svg คุณสามารถใช้เครื่องมือใดก็ได้ที่คุณต้องการสร้าง
Abhinav Gauniyal

2
@AbhinavGauniyal: 'บรรณาธิการ' ตามที่คุณต้องการเรียกพวกเขาเพิ่ม 'ปุย' พิเศษเพื่อการประกาศ ตัวอย่างเช่น300.000000ptและข้อมูลเมตาที่ไม่จำเป็นจริงๆ
jbutler483

12
@Persijn คุณหมายถึงอะไรด้วยมือ / เขียนรหัส มีคนทำ / มือ / นักวาดภาพประกอบเพื่อให้ง่ายต่อการเขียนโค้ดและยังคงสร้างสิ่งเดียวกัน จากนั้นอีกครั้งเมื่อคุณใช้ svg ในเบราว์เซอร์ทำไมคุณไม่ส่งรหัสภาษาด้วยตัวเอง? และทำไมต้องหยุดที่แอสเซมบลีมือ / รหัสโดยใช้สายหรือเพียงแค่วาดเอง นี่ไม่ใช่เหตุผลที่ฉันคาดหวัง
Abhinav Gauniyal

2
@ jbutler483 ใช่และสามารถตัดออกได้ มีเครื่องมือมากมายที่ทำเพื่อคุณนี่คือเครื่องมือgithub.com/svg/svgo
Abhinav Gauniyal

6
@persijn คำตอบนี้ให้เส้นทาง svg ที่จำเป็น ฉันไม่รู้ว่าการคัดค้านของคุณคืออะไร
user428517

14

หากคุณเลือกที่จะใช้ SVG คุณควรอ่านบนเส้นทาง ฉันอยากจะแนะนำบรรณาธิการ SVG

<svg xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100%" height="100%" viewBox="-0.05 0 1195.1 703" preserveAspectRatio="xMidYMid meet" zoomAndPan="disable" transform="">
    <defs id="svgEditorDefs">
        <line id="svgEditorLineDefs" stroke="black" style="fill: none; vector-effect: non-scaling-stroke; stroke-width: 1px;"/>
    </defs>
    <rect id="svgEditorBackground" x="0" y="0" width="1195" height="703" style="fill: none; stroke: none;"/>
    <path stroke="black" id="e1_circleArc" style="fill: none; stroke-width: 1px; vector-effect: non-scaling-stroke;" d="M 198 207 a 117.969 117.969 0 1 0 213 8" transform=""/>
    <path stroke="black" id="e4_circleArc" style="fill: none; stroke-width: 1px; vector-effect: non-scaling-stroke;" transform="" d="M 411.348 215.696 a 349.677 349.677 0 0 0 -110.37 -131.718"/>
    <path stroke="black" style="fill: none; stroke-width: 1px; vector-effect: non-scaling-stroke;" transform="matrix(-0.182706 -0.983168 0.983168 -0.182706 157.664 417.408)" id="e6_circleArc" d="M 301.799 202.299 a 329.763 329.763 0 0 0 -102.951 -124.781"/>
</svg>


1
ทำไมคุณต้องใช้บรรทัดภายในแท็ก defs และคุณไม่สามารถทำรูปร่างนี้ในเส้นทางเดียวไม่ใช่ 3 + a rect
Persijn

6

ต่อไปนี้เป็นรูปทรงหยดน้ำ SVG สี่หยดที่ง่ายขึ้น

ป้อนคำอธิบายรูปภาพที่นี่

<svg viewbox="-20 -20 180 180">
  <g stroke="black" fill="none">
    
    <path transform="translate(0)"
     d="M   0  0
        C   0 10  10 17  10 27
        C  10 40 -10 40 -10 27
        C -10 17   0 10   0  0
        Z"/>

    <path transform="translate(40)"
     d="M   0  0
        C   0 16  15 25   5 34
        Q   0 38         -5 34
        C -15 25   0 16   0  0
        Z"/>
    
    <path transform="translate(80)"
     d="M   0  0
        C   0 10  18 36   0 36
        S          0 10   0  0
        Z"/>

    <path transform="translate(120)"
     d="M   0  0
        Q  18 36   0 36
        T          0  0
        Z"/>
    
    
    
    
    <g stroke-width="0.25" stroke="red">
      <g transform="translate(0)">
        <ellipse rx="1" ry="1" cx="0"   cy="0" />
        <ellipse rx="1" ry="1" cx="0"   cy="10"/>
        <ellipse rx="1" ry="1" cx="10"  cy="17"/>
        <ellipse rx="1" ry="1" cx="10"  cy="27"/>
        <ellipse rx="1" ry="1" cx="10"  cy="40"/>
        <ellipse rx="1" ry="1" cx="-10" cy="40"/>
        <ellipse rx="1" ry="1" cx="-10" cy="27"/>
        <ellipse rx="1" ry="1" cx="-10" cy="17"/>
        <line x1="0"   y1="0"  x2="0"   y2="10"/>
        <line x1="10"  y1="17" x2="10"  y2="40"/>
        <line x1="-10" y1="40" x2="-10" y2="17"/>
      </g>
      <g transform="translate(40)">
        <ellipse rx="1" ry="1" cx="0"   cy="0" />
        <ellipse rx="1" ry="1" cx="0"   cy="16"/>
        <ellipse rx="1" ry="1" cx="15"  cy="25"/>
        <ellipse rx="1" ry="1" cx="5"   cy="34"/>
        <ellipse rx="1" ry="1" cx="0"   cy="38"/>
        <ellipse rx="1" ry="1" cx="-5"  cy="34"/>
        <ellipse rx="1" ry="1" cx="-15" cy="25"/>
        <line x1="0"  y1="0"  x2="0"   y2="16"/>
        <line x1="15" y1="25" x2="0"   y2="38"/>
        <line x1="0"  y1="38" x2="-15" y2="25"/>
      </g>
      <g transform="translate(80)">
        <ellipse rx="1" ry="1" cx="0"   cy="0" />
        <ellipse rx="1" ry="1" cx="0"   cy="10"/>
        <ellipse rx="1" ry="1" cx="18"  cy="36"/>
        <ellipse rx="1" ry="1" cx="0"   cy="36"/>
        <ellipse rx="1" ry="1" cx="-18" cy="36" stroke="gray"/>
        <line x1="0"  y1="0"  x2="0"   y2="10"/>
        <line x1="18" y1="36" x2="0"   y2="36"/>
        <line x1="0"  y1="36" x2="-18" y2="36" stroke="gray" stroke-dasharray="0.5"/>
      </g>
      <g transform="translate(120)">
        <ellipse rx="1" ry="1" cx="0"   cy="0" />
        <ellipse rx="1" ry="1" cx="18"  cy="36"/>
        <ellipse rx="1" ry="1" cx="0"   cy="36"/>
        <ellipse rx="1" ry="1" cx="-18" cy="36" stroke="gray"/>
        <line x1="18" y1="36" x2="0"   y2="36"/>
        <line x1="0"  y1="36" x2="-18" y2="36" stroke="gray" stroke-dasharray="0.5"/>
      </g>
    </g>    
  </g>
  <g font-size="6" transform="translate(-1.5,-4)">
    <text x="-10" y="-8"># of unique points:</text>
    <text transform="translate(  0)">8</text>
    <text transform="translate( 40)">7</text>
    <text transform="translate( 80)">4</text>
    <text transform="translate(120)">3</text>
  </g>
</svg>

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