CSS сетка с элементами sqaure SVG

#html #css #svg #css-grid

#HTML #css #svg #css-сетка

Вопрос:

У меня возникла проблема с тем, чтобы ячейки сетки css всегда были квадратными, а внутри каждой — квадратный элемент SVG.

CSS сетка должна на 100% соответствовать родительскому контейнеру и сохранять прямоугольность при изменении размера браузера (до 60×60 пикселей).

Прямо сейчас у меня есть странное пустое пространство над и под элементами.

Это мой текущий стиль:

 <style>

        *{
            box-sizing: border-box;
        }

        .zubi{
            display: grid;
            grid-template: repeat(2, 1fr) / repeat(16, 1fr);
            gap: .6rem;
            margin: .6rem;
        }

        .zub{
            border-radius: .3vw;

            width: 100%;
            
            --boja-zuba-unutra: white;
            --boja-zuba-spolja: currentColor;
        } 

    </style>
  

Я подготовил пример с использованием кода ручкой:https://codepen.io/bojanv55/pen/JjXGLXO

Есть идея? Спасибо.

Обновить

Хорошо, мне удалось это сделать. Мне просто нужно было удалить свойства viewBox из элементов и переместить его в то место, где я фактически включаю элементы svg (в данном случае element). Я также обновил код-перо.

Ответ №1:

Я закомментировал эти 2 строки:

 gap: .6rem;
margin: .6rem;
  

Дает ли это ожидаемый результат?

Редактировать: я заменил 1fr ссылки на 60px здесь:

 grid-template: repeat(2, 60px) / repeat(16, 60px);
  

и также дала .zub высоту 100%:

 .zub {
      border-radius: .3vw;
      width: 100%;
      height: 100%;
      --boja-zuba-unutra: white;
      --boja-zuba-spolja: currentColor;
    }
  

Основным виновником был 1fr (единица дроби 1). Подробнее об этом смотрите здесь:
дробная единица

 <!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>ll</title>
  <style>
    * {
      box-sizing: border-box;
    }
    
    .zubi {
      display: grid;
      grid-template: repeat(2, 60px) / repeat(16, 60px);
      /*gap: .6rem;*/
      /*margin: .6rem;*/
    }
    
    .zub {
      border-radius: .3vw;
      width: 100%;
      height: 100%;
      --boja-zuba-unutra: white;
      --boja-zuba-spolja: currentColor;
    }
  </style>

  <svg xmlns="http://www.w3.org/2000/svg">
    <symbol id="zub-5-zona" viewBox="0 0 120 120" fill="white" style="fill: var(--boja-zuba-unutra, white)">
        <rect width="120" height="120" fill="black" style="fill: var(--boja-zuba-spolja, black)"/>
        <path class="gore" d="M 6.8,4 L 113.2,4 79.2,38 40.8,38"/>
        <path class="desno" d="M 116,6.8 L 116,113.2 82,79.2 82,40.8 116,6.8"/>
        <path class="dole" d="M 6.8,116 L 113.2,116 79.2,82 40.8,82 6.8,116"/>
        <path class="lijevo" d="M 4,6.8 L 38,40.8 38,79.2 4,113.2 4,6.8"/>
        <path class="centar" d="M 42,42 L 78,42 78,78 42,78 42,42"/>
    </symbol>
    <symbol id="zub-4-zone" viewBox="0 0 120 120" fill="white" style="fill: var(--boja-zuba-unutra, white)">
        <rect width="120" height="120" fill="black" style="fill: var(--boja-zuba-spolja, black)"/>
        <path class="gore" d="M 6.8,4 L 113.2,4 79.2,58 40.8,58" />
        <path class="desno" d="M 116,6.8 L 116,113.2 82.4,60 116,6.8" />
        <path class="dole" d="M 6.8,116 L 113.2,116 78.8,62 41.08,62 6.8,116" />
        <path class="lijevo" d="M 4,6.8 L 37.6,60 4,113.2 4,6.8" />
    </symbol>
</svg>
</head>

<body>

  <div class="zubi">
    <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
    <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
    <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
    <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
    <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>

    <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>
    <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>
    <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>
    <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>
    <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>
    <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>

    <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
    <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
    <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
    <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
    <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>

    <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
    <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
    <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
    <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
    <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>

    <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>
    <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>
    <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>
    <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>
    <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>
    <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>

    <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
    <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
    <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
    <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
    <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
  </div>

</body>

</html>  

Попробуйте эту «адаптивную» версию, чтобы убедиться, что мы на правильном пути. Возможно, потребуется немного больше работы:

 <!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>ll</title>
    <style>

        *{
            box-sizing: border-box;
        }

        .zubi{
            display: grid;
            grid-template: repeat(2, 50%) / repeat(16, 6.25%);
            /*gap: .6rem;
            margin: .6rem;*/
        }

        .zub{
            border-radius: .3vw;

            width: 100%;
            --boja-zuba-unutra: white;
            --boja-zuba-spolja: currentColor;
        } 

    </style>
    
    <svg xmlns="http://www.w3.org/2000/svg">
    <symbol id="zub-5-zona" viewBox="0 0 120 120" fill="white" style="fill: var(--boja-zuba-unutra, white)">
        <rect width="120" height="120" fill="black" style="fill: var(--boja-zuba-spolja, black)"/>
        <path class="gore" d="M 6.8,4 L 113.2,4 79.2,38 40.8,38"/>
        <path class="desno" d="M 116,6.8 L 116,113.2 82,79.2 82,40.8 116,6.8"/>
        <path class="dole" d="M 6.8,116 L 113.2,116 79.2,82 40.8,82 6.8,116"/>
        <path class="lijevo" d="M 4,6.8 L 38,40.8 38,79.2 4,113.2 4,6.8"/>
        <path class="centar" d="M 42,42 L 78,42 78,78 42,78 42,42"/>
    </symbol>
    <symbol id="zub-4-zone" viewBox="0 0 120 120" fill="white" style="fill: var(--boja-zuba-unutra, white)">
        <rect width="120" height="120" fill="black" style="fill: var(--boja-zuba-spolja, black)"/>
        <path class="gore" d="M 6.8,4 L 113.2,4 79.2,58 40.8,58" />
        <path class="desno" d="M 116,6.8 L 116,113.2 82.4,60 116,6.8" />
        <path class="dole" d="M 6.8,116 L 113.2,116 78.8,62 41.08,62 6.8,116" />
        <path class="lijevo" d="M 4,6.8 L 37.6,60 4,113.2 4,6.8" />
    </symbol>
</svg>
</head>
<body>

    <div class="zubi">
        <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
        <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
        <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
        <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
        <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>

        <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>
        <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>
        <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>
        <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>
        <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>
        <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>

        <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
        <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
        <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
        <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
        <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>

        <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
        <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
        <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
        <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
        <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>

        <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>
        <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>
        <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>
        <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>
        <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>
        <svg class="zub"><use xlink:href="#zub-4-zone"/></svg>

        <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
        <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
        <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
        <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
        <svg class="zub"><use xlink:href="#zub-5-zona"/></svg>
    </div>

</body>
</html>   

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

1. нет, ячейки сетки по-прежнему имеют высоту 150 пикселей. и не квадратная.

2. да, но теперь это исправлено с помощью родительского контейнера и не настраивается на 100%. Итак, мне нужно, чтобы ширина родительского элемента составляла 100%, а SVGS — для настройки на эту ширину высоту (в зависимости от того, что это) и сетка для сохранения квадратных пропорций.

3. @BojanVukasovic — Попробуйте второй фрагмент. Она отзывчива, поэтому я думаю, что мы приближаемся.

4. Спасибо. Мне только что удалось решить эту проблему. Мне нужно было переместить viewBox из элементов <symbol> в элементы <svg>. Теперь ее ширина и высота составляют 100%.