Повторяющееся изображение на холсте с адаптивной высотой

Я пытаюсь создать холст, на котором у меня есть изображение в качестве фона, которое повторяется по горизонтали и автоматически адаптируется по высоте.

Мне удалось повторить фоновое изображение по оси X, но я не могу настроить высоту.

Это мой код до сих пор:

const cvs = document.getElementById("canvas");
const ctx = cvs.getContext("2d");

const bg = new Image();
bg.src = "http://lorempixel.com/100/100";

const draw = () => {
  const ptrn = ctx.createPattern(bg, "repeat-x");
  ctx.fillStyle = ptrn;
  ctx.fillRect(0, 0, canvas.width, canvas.height);

  requestAnimationFrame(draw);
};

draw();
<!DOCTYPE html>
<html>

<head>
  <title>Test</title>
</head>

<body>
  <canvas id = "canvas" width = "1000" height = "200"></canvas>
  <script src = "index.js"></script>
</body>

</html>

TLDR: I would like to be able to have an image within my canvas that repeats horizontally and its height is responsive.

Заранее спасибо.

это смущает. вы говорите о повторении изображения, а заголовок - о повторении изображения, но вопрос, похоже, заключается в том, чтобы сделать высоту самого холста «отзывчивой». что это? и что вы подразумеваете под «отзывчивым», поскольку это слово обычно относится к ширине устройства, а не к его высоте.

I wrestled a bear once. 17.06.2019 22:38

Допустим, у меня есть отзывчивый холст, который адаптируется к браузеру пользователя (высота! 00% и ширина 100%). Внутри холста у меня есть изображение, которое повторяется по горизонтали. Чего я пытаюсь добиться, так это иметь это изображение с отзывчивой высотой (например, холст), а также повторять по горизонтали... Надеюсь, это имеет больше смысла.

Jose A. Ayllón 17.06.2019 22:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
287
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

попробуйте настроить размер изображения так, чтобы он соответствовал размеру холста:

bg.src = "http://lorempixel.com/200/200";

Ваше здоровье! :)

Ответ принят как подходящий

Надеюсь, объяснение в комментариях ответит на ваш вопрос. Не стесняйтесь обращаться за разъяснениями.

const cvs = document.getElementById("canvas");
const ctx = cvs.getContext("2d");

// First stretch the canvas so we can get 
// the full size of teh browser window
cvs.style.height = '100vh';
cvs.style.width = '100vw';

// Now adjust actual canvas size to match
const {width, height} = cvs.getBoundingClientRect();
cvs.height = height;
cvs.width = width;

const bg = new Image();

// Should always wait for onload 
// before drawing to prevent race condition.
bg.onload = ()=>{

  var x=0;
  while(x < cvs.width){
    ctx.drawImage(bg, x, 0, 100, cvs.height);
    x += bg.width;
  }

  // draw the image a bunch of times
  // var x=0, y=0;
  // while(x < cvs.width && y < cvs.height){
  //   ctx.drawImage(bg, x, y);
  //   x += bg.width;
  //   if (x > cvs.width){
  //     x = 0;
  //     y += bg.height;
  //   }
  // }

};
bg.src = "http://lorempixel.com/100/100";
<canvas id = "canvas"></canvas>
<script src = "index.js"></script>

Это был ужин близко к тому, что мне нужно. Удаление оператора if внутри while и замена текущего drawImage на ctx.drawImage(bg, x, y, 100, cvs.height); заставит его работать! Попробуйте и скажите, что вы думаете :)

Jose A. Ayllón 18.06.2019 12:50

как это? если это правильный ответ, пожалуйста, отметьте его как таковой.

I wrestled a bear once. 19.06.2019 14:22

Действительно :) Я ждал вашего редактирования, чтобы отметить его как правильное: D Спасибо за помощь @ Однажды я боролся с медведем

Jose A. Ayllón 19.06.2019 14:30

Если я правильно понял, вы хотите заполнить высоту и повторить по горизонтали, это правильно?

const cvs = document.getElementById("canvas");
const ctx = cvs.getContext("2d");

var bg = new Image();
bg.src = "http://lorempixel.com/100/100";

var tempCanvas = document.createElement("canvas"),
    tCtx = tempCanvas.getContext("2d");

var imgWidth = 200;
var imgHeight = 200;

const draw = () => {
  tempCanvas.width = imgWidth;
  tempCanvas.height = imgHeight;
  tCtx.drawImage(bg, 0, 0, 100, 100, 0, 0, imgWidth, imgHeight);
  const ptrn = ctx.createPattern(tempCanvas , "repeat-x");
  ctx.fillStyle = ptrn;
  ctx.fillRect(0, 0, canvas.width, canvas.height);

  requestAnimationFrame(draw);
};
bg.onload = () => {
  draw();
}
<!DOCTYPE html>
<html>

<head>
  <title>Test</title>
</head>

<body>
  <canvas id = "canvas" width = "1000" height = "200"></canvas>
  <script src = "index.js"></script>
</body>

</html>

Другие вопросы по теме