Заполнение div волнистой дорожкой SVG

233
03 февраля 2018, 23:26

Я хочу заполнить <div> цветом и добавить тень к границе, но мой код делает только вот так, как в коде сниппета.
Мне необходимо получить изображение, как показано на рисунке ниже.

<svg height="125" width="1349"> 
  <path d="M -35 100 s 35 50 75 0" stroke="rgb(255, 195, 56)" stroke-width="5" fill="none" /> 
  <path d="M 40 100 s 75 -125 150 0" stroke="rgb(255, 195, 56)" stroke-width="5" fill="rgb(255, 195, 56)" /> 
  <path d="M 190 100 s 35 50 75 0" stroke="rgb(255, 195, 56)" stroke-width="5" fill="none" /> 
  <path d="M 265 100 s 75 -125 150 0" stroke="rgb(255, 195, 56)" stroke-width="5" fill="rgb(255, 195, 56)" /> 
  <path d="M 415 100 s 35 50 75 0" stroke="rgb(255, 195, 56)" stroke-width="5" fill="none" /> 
  <path d="M 490 100 s 75 -125 150 0" stroke="rgb(255, 195, 56)" stroke-width="5" fill="rgb(255, 195, 56)" /> 
  <path d="M 640 100 s 35 50 75 0" stroke="rgb(255, 195, 56)" stroke-width="5" fill="none" /> 
  <path d="M 715 100 s 75 -125 150 0" stroke="rgb(255, 195, 56)" stroke-width="5" fill="rgb(255, 195, 56)" /> 
  <path d="M 865 100 s 35 50 75 0" stroke="rgb(255, 195, 56)" stroke-width="5" fill="none" /> 
  <path d="M 940 100 s 75 -125 150 0" stroke="rgb(255, 195, 56)" stroke-width="5" fill="rgb(255, 195, 56)" /> 
  <path d="M 1090 100 s 35 50 75 0" stroke="rgb(255, 195, 56)" stroke-width="5" fill="none" /> 
  <path d="M 1165 100 s 75 -125 150 0" stroke="rgb(255, 195, 56)" stroke-width="5" fill="rgb(255, 195, 56)" /> 
  <path d="M 1315 100 s 35 50 75 0" stroke="rgb(255, 195, 56)" stroke-width="5" fill="none" /> 
  Sorry, your browser does not support inline SVG. 
</svg>

Answer 1

Первый ответ:

В вашем коде вы создаете несколько элементов пути, в которых каждый элемент имеет один subpath c curveTo. Вместо этого вам нужен один элемент path с несколькими subpaths вместе с curveTo.

В вашем сценарии простейшая квадратичная кривая Безье будет работать хорошо.
После subpaths c curveTo вам понадобятся некоторые subpaths c lineTo для определения области под кривыми.

Например...

<svg height="150" width="880"> 
  <path d="M 0 100 q 40 -40 80 0 q 40 40 80 0 q 40 -40 80 0 q 40 40 80 0 q 40 -40 80 0 q 40 40 80 0 q 40 -40 80 0 q 40 40 80 0  q 40 -40 80 0 q 40 40 80 0 q 40 -40 80 0 l 0 50 l -880 0 z" stroke="rgb(255, 195, 56)" stroke-width="5" fill="rgb(255, 195, 56)"/> 
</svg>

Второй ответ:

Для такой формы вы можете использовать pattern svg и заполнить прямоугольник шириной pattern, как показано в следующем примере:

html,body{margin:0;padding:0;} 
div{ 
  background: url('http://i.imgur.com/qi5FGET.jpg'); 
  background-size:cover; 
  overflow:hidden; 
} 
svg{display:block;}
<div> 
  <h1>title</h1> 
  <p>whatever content<br/>with several lines</p> 
  <svg viewbox="0 0 60 10"> 
    <pattern x="-7.5" id="waves" patternUnits="userSpaceOnUse" width="10" height="10"> 
      <path d="M0 10 V5 Q2.5 2.5 5 5 T10 5 V10" fill="#FFC338" /> 
    </pattern> 
    <rect x="0" y="0" width="60" height="10" fill="url(#waves)"/> 
  </svg> 
</div>

Answer 2

При помощи svg ты конечно можешь частично добиться нужного результата, но как только у тебя увеличится область экрана твоя svg не будет заполнять всю область. В таких ситуациях, как твоя, лучше использовать canvas. К тому-же тебе не придется заморачиваться с прописыванием всех координат вручную.

let canvas = document.querySelector("canvas"); 
let ctx = canvas.getContext("2d"); 
 
function draw() { 
  let width = window.innerWidth; 
  let height = window.innerHeight; 
  canvas.width = width; 
  canvas.height = height; 
   
  ctx.clearRect(0, 0, width, height); 
 
  ctx.fillStyle = "#FFFF00"; 
   
  ctx.beginPath(); 
  ctx.moveTo(0, height / 2); 
   
  for (let x = 0, amplitude = 30; x < width; x++) { 
    let y = Math.sin(x / amplitude * Math.PI / 2) * amplitude; 
    ctx.lineTo(x, y + height / 2); 
  } 
   
  ctx.lineTo(width, height); 
  ctx.lineTo(0, height); 
  ctx.lineTo(0, height / 2); 
    
  ctx.fill(); 
} 
 
draw(); 
 
window.addEventListener("resize", draw);
html, body { 
  overflow: hidden; 
  width: 100vw; 
  height: 100vh; 
  margin: 0; 
  padding: 0; 
   
  background: red; 
}
<canvas></canvas>

READ ALSO
OxyPlot - выделение текущего значения на оси Y

OxyPlot - выделение текущего значения на оси Y

Здравствуйтеперерыл всю документацию

345
Сколько памяти занимают объекты?

Сколько памяти занимают объекты?

Провел несколько тестов, и был весьма удивлен

308
Как прочитать в сервисе значение из реестра?

Как прочитать в сервисе значение из реестра?

Столкнулся с проблемойЕсть WF, в ней есть часть кода по сохранению значения в реестре:

223
C# ищу библиотеки/классы для быстропроизводительного наложения фильтра

C# ищу библиотеки/классы для быстропроизводительного наложения фильтра

Накладываю фильтры на входящее с запросом изображение, а потом отправляю обратно Обрабатываю это всё сейчас с помощью Bitmap, очень удобно,...

242