Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Responsive clip-path

#css #css3 #svg #адаптивная_верстка #clip_path


В следующем примере блок main (синезелёный градиент) обрезается при помощи clip-path
и принимает форму сердечка. Однако видно, что он обрезается в масштабе 1:1, а хотелось
бы, чтобы форма обрезки растягивалась по размеру блока (по аналогии с тем, как у background-size
работает cover, contain или 100% 100%).

https://jsfiddle.net/a5goLyds/



html, body, main {
  margin: 0;
  height: 100%;
}

svg {
  width: 10em;
  float: right;
  position: relative;
  z-index: 1;
}

main {
  background: linear-gradient(to bottom, green, blue);
  clip-path: url(#heart-clip);
}

  

  
    
  



Ответы

Ответ 1



К сожалению я не нашёл clip-path генераторов, которые позволяли бы рисовать кривыми линиями. Есть генераторы, которые рисуют прямыми линиями по узловым точкам: https://codepen.io/jh3y/pen/XqVQqa http://bennettfeely.com/clippy/ Для многоугольника получаю вот такие значения clip-path: polygon(50% 0%, 80% 10%, 100% 35%, 100% 70%, 80% 90%, 50% 100%, 20% 90%, 0% 70%, 0% 35%, 20% 10%); Преобразую для svg clip-path в доли от единицы: Чтобы получить масштабируемый clip-path, например при наведении курсора, нужно менять размер изображения в сторону увеличения, соответственно увеличится и clip-path, обрезая это изображение. svg {} main { width: 15%; height: 15%; background: linear-gradient(to bottom, green, blue); clip-path: url(#heart-clip); transition: 1s; } main:hover { width: 100%; height: 100%; }


Ответ 2



Ничего не меняя в авторском примере - ввожу туда: Итог: html, body, main { margin: 0; height: 100%; } svg { width: 10em; float: right; position: relative; z-index: 1; } main { background: linear-gradient(to bottom, green, blue); clip-path: url(#heart-clip); }
В результате можно добиться любой пропорции и положения патча, регулируя лишь transform="scale(what), translate(x y)" Однако это ещё не всё. Там, где было , добавим clipPathUnits="objectBoundingBox", но при этом не забудем подкорректировать scale(), чтобы результат от "d" всегда был меньше единицы, как у Александра в полигоне. - И вот оно, долгожданное счастье! Responsive clip-path!!! В песочнице будет легче менять размеры рабочей области, чтобы убедиться в искомой "респонсивности" элемента. Но пробуем описать его и здесь: html, body { margin: 0; background: repeating-linear-gradient(45deg, #666, #222, #666, #ea8, #666, #222, #666, #8ce, #666 4%) fixed; } svg { width: 10rem; float: right; position: relative; z-index: 1; } main { height: 100vw; clip-path: url(#heart-clip); background: linear-gradient(to bottom, blue, red, green, transparent 70%); }


Ответ 3



Я бы реализовал так, а градиент уже реализовал бы в самом SVG html, body { width: 100%; height: 100%; background: #242424; } main { width: 100%; height: 100%; background-image: url('data:image/svg+xml, );'); background-repeat: no-repeat; background-size: 100% 100%; }


Комментариев нет:

Отправить комментарий