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

Здравствуйте! У меня возникла проблема с позиционированием кнопок на изображении. Картинка занимает 100vh и 100vw, поэтому статическое позиционирование выглядит хорошо только на одном устройстве, для которого оно было изначально создано. 

Мне нужно, чтобы кнопки располагались пропорционально изменению размера изображения. Если картинка уменьшается в ширине, кнопки должны сдвигаться на соответствующее расстояние, а то же самое относится и к высоте. 

Можете привести примеры для устройства, под которое было сделано начальное позиционирование?
  • 25 октября 2024 г. 10:03
Ответы на вопрос 2
Для корректного позиционирования кнопок на изображении, которое адаптируется к различным размерам экранов, можно использовать несколько методов. Один из наиболее распространённых способов — использование CSS с относительными единицами измерения и CSS Grid или Flexbox.

Ниже приведены рекомендации и пример кода с использованием CSS и HTML.

### Использование CSS-процентного позиционирования

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

Пример:

```html
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style>
        body, html {
            margin: 0;
            padding: 0;
            overflow: hidden;
        }
        .container {
            position: relative;
            width: 100vw;
            height: 100vh;
            overflow: hidden;
        }
        .image {
            width: 100%;
            height: 100%;
            object-fit: cover; /* Сохраняем пропорции изображения */
        }
        .button {
            position: absolute;
            padding: 10px 20px;
            background-color: rgba(255, 255, 255, 0.8);
            border: none;
            cursor: pointer;
            font-size: 16px;
        }
        .button1 {
            left: 10%; /* 10% от ширины */
            top: 20%; /* 20% от высоты */
        }
        .button2 {
            right: 10%; /* 10% от ширины */
            bottom: 20%; /* 20% от высоты */
        }
    </style>
</head>
<body>

<div class="container">
    <img src="your-image.jpg" alt="Sample Image" class="image">
    <button class="button button1">Кнопка 1</button>
    <button class="button button2">Кнопка 2</button>
</div>

</body>
</html>
```

### Объяснение:

1. **Использование `position: absolute`:** Это позволяет кнопкам позиционироваться относительно родительского контейнера (в данном случае `.container`).
  
2. **Процентные значения:** Вместо фиксированных значений (например, пикселей) используем проценты. Это позволяет кнопкам перемещаться в зависимости от размера контейнера (изображения).

3. **`object-fit: cover`:** Это свойство гарантирует, что изображение сохраняет свои пропорции и заполняет весь контейнер, не искажая его.

### Альтернативный вариант: Использование CSS Grid

Если у вас больше кнопок или более сложное позиционирование, вы можете рассмотреть использование CSS Grid.

Пример с использованием Grid:

```html
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style>
        body, html {
            margin: 0;
            padding: 0;
            overflow: hidden;
        }
        .container {
            display: grid;
            grid-template-rows: repeat(3, 1fr);
            grid-template-columns: repeat(3, 1fr);
            width: 100vw;
            height: 100vh;
            position: relative;
        }
        .image {
            grid-row: 1 / -1; /* Занимает все строки */
            grid-column: 1 / -1; /* Занимает все колонки */
            width: 100%;
            height: 100%;
            object-fit: cover;
        }
        .button {
            padding: 10px 20px;
            background-color: rgba(255, 255, 255, 0.8);
            border: none;
            cursor: pointer;
            font-size: 16px;
        }
        .button1 {
            grid-row: 1;
            grid-column: 1;
        }
        .button2 {
            grid-row: 3;
            grid-column: 3;
        }
    </style>
</head>
<body>

<div class="container">
    <img src="your-image.jpg" alt="Sample Image" class="image">
    <button class="button button1">Кнопка 1</button>
    <button class="button button2">Кнопка 2</button>
</div>

</body>
</html>
```

### Заключение

Оба варианта позволяют адаптировать кнопки в зависимости от размера изображения. Вы можете подбирать значения
<div class="wrapper">
  <img src="">
  <button class="btn1"></button>
</div>

.wrapper { 
  position: relative;
}

.wrapper img {
  width: 100vw;
  height: 100vh;
  display: block;
}

.btn1 {
  position: absolute;
  top: подобрать значение в процентах;
  left: подобрать значение в процентах;
}
Похожие вопросы