Создайте адаптивную таблицу, содержащую круги

#javascript #html #css #responsive-design

#javascript #HTML #css #адаптивный дизайн

Вопрос:

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

Действительно, в зависимости от размера моего окна я бы хотел, чтобы моя таблица всегда была «квадратной». То есть расстояние между каждым кругом должно быть равным, как по горизонтали, так и по вертикали. Мои круги не имеют фиксированного размера, они должны меняться в зависимости от размера таблицы.

В моем решении есть несколько проблем :

  • Я должен использовать скрипт для принудительной адаптации моей таблицы при загрузке страницы и при каждом изменении размера моей страницы.
  • Таблица неправильно центрирована на моей странице

Интересно, нельзя ли оптимизировать мое решение, избегая использования JS, чтобы сделать мою доску адаптивной. Любое предложение приветствуется. Заранее спасибо.

 $(document).ready(function() {
    resizeTab();

    window.onresize = function(){
        resizeTab();
    };
});

function resizeTab() {
    var mainHeight = $('#main-panel').height();
    var mainWidth = $('#main-panel').width();
    if (mainWidth > mainHeight) {
        $('#my-tab').width($('#main-panel').height());
    } else {
        $('#my-tab').width($('#main-panel').width());
    }
}  
 #viewport{
    height: 100vh;
    display: flex;
}

#left-panel, #right-panel {
    height: 100%;
    width: 300px;
    background-color: #000;
}

#main-panel {
    height: 100%;
    padding: 50px;
    flex-grow: 2;
}

#my-tab {
    margin: auto;
    text-align: center;
}

#my-tab td {
    border: 0;
}

#my-tab td .number {
    width: 100%;
    padding-bottom: 100%;
    position: relative;
}

#my-tab td .number span {
    color: rgb(44, 68, 84);
    position: absolute;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: 100%;
    left: 0%;
    font-family: "RobotCondensed";
    font-weight: 100;
    font-size: 3vh;
    font-weight: 500;
    border: 2px solid rgba(96, 139, 168, .4);
    background-color: rgba(96, 139, 168, .2);
    border-radius: 5px;
    border-radius: 50%;
}  
 <!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <!-- Styles -->
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" />
        <link rel="stylesheet" href="./style.css" />
        <title>Test</title>
    </head>
    <body>
        <div id="viewport">
            <div id="left-panel"></div>
            <div id="main-panel">
                <table id="my-tab" class="table">
                    <tbody>
                        <tr>
                            <td><div class="number"><span>1</span></div></td>
                            <td><div class="number"><span>2</span></div></td>
                            <td><div class="number"><span>3</span></div></td>
                            <td><div class="number"><span>4</span></div></td>
                            <td><div class="number"><span>5</span></div></td>
                            <td><div class="number"><span>6</span></div></td>
                            <td><div class="number"><span>7</span></div></td>
                            <td><div class="number"><span>8</span></div></td>
                            <td><div class="number"><span>9</span></div></td>
                            <td><div class="number"><span>10</span></div></td>
                        </tr>
                        <tr>
                            <td><div class="number"><span>11</span></div></td>
                            <td><div class="number"><span>12</span></div></td>
                            <td><div class="number"><span>13</span></div></td>
                            <td><div class="number"><span>14</span></div></td>
                            <td><div class="number"><span>15</span></div></td>
                            <td><div class="number"><span>16</span></div></td>
                            <td><div class="number"><span>17</span></div></td>
                            <td><div class="number"><span>18</span></div></td>
                            <td><div class="number"><span>19</span></div></td>
                            <td><div class="number"><span>20</span></div></td>
                        </tr>
                        <tr>
                            <td><div class="number"><span>21</span></div></td>
                            <td><div class="number"><span>22</span></div></td>
                            <td><div class="number"><span>23</span></div></td>
                            <td><div class="number"><span>24</span></div></td>
                            <td><div class="number"><span>25</span></div></td>
                            <td><div class="number"><span>26</span></div></td>
                            <td><div class="number"><span>27</span></div></td>
                            <td><div class="number"><span>28</span></div></td>
                            <td><div class="number"><span>29</span></div></td>
                            <td><div class="number"><span>30</span></div></td>
                        </tr>
                        <tr>
                            <td><div class="number"><span>31</span></div></td>
                            <td><div class="number"><span>32</span></div></td>
                            <td><div class="number"><span>33</span></div></td>
                            <td><div class="number"><span>34</span></div></td>
                            <td><div class="number"><span>35</span></div></td>
                            <td><div class="number"><span>36</span></div></td>
                            <td><div class="number"><span>37</span></div></td>
                            <td><div class="number"><span>38</span></div></td>
                            <td><div class="number"><span>39</span></div></td>
                            <td><div class="number"><span>40</span></div></td>
                        </tr>
                        <tr>
                            <td><div class="number"><span>41</span></div></td>
                            <td><div class="number"><span>42</span></div></td>
                            <td><div class="number"><span>43</span></div></td>
                            <td><div class="number"><span>44</span></div></td>
                            <td><div class="number"><span>45</span></div></td>
                            <td><div class="number"><span>46</span></div></td>
                            <td><div class="number"><span>47</span></div></td>
                            <td><div class="number"><span>48</span></div></td>
                            <td><div class="number"><span>49</span></div></td>
                            <td><div class="number"><span>50</span></div></td>
                        </tr>
                        <tr>
                            <td><div class="number"><span>51</span></div></td>
                            <td><div class="number"><span>52</span></div></td>
                            <td><div class="number"><span>53</span></div></td>
                            <td><div class="number"><span>54</span></div></td>
                            <td><div class="number"><span>55</span></div></td>
                            <td><div class="number"><span>56</span></div></td>
                            <td><div class="number"><span>57</span></div></td>
                            <td><div class="number"><span>58</span></div></td>
                            <td><div class="number"><span>59</span></div></td>
                            <td><div class="number"><span>60</span></div></td>
                        </tr>
                        <tr>
                            <td><div class="number"><span>61</span></div></td>
                            <td><div class="number"><span>62</span></div></td>
                            <td><div class="number"><span>63</span></div></td>
                            <td><div class="number"><span>64</span></div></td>
                            <td><div class="number"><span>65</span></div></td>
                            <td><div class="number"><span>66</span></div></td>
                            <td><div class="number"><span>67</span></div></td>
                            <td><div class="number"><span>68</span></div></td>
                            <td><div class="number"><span>69</span></div></td>
                            <td><div class="number"><span>70</span></div></td>
                        </tr>
                        <tr>
                            <td><div class="number"><span>71</span></div></td>
                            <td><div class="number"><span>72</span></div></td>
                            <td><div class="number"><span>73</span></div></td>
                            <td><div class="number"><span>74</span></div></td>
                            <td><div class="number"><span>75</span></div></td>
                            <td><div class="number"><span>76</span></div></td>
                            <td><div class="number"><span>77</span></div></td>
                            <td><div class="number"><span>78</span></div></td>
                            <td><div class="number"><span>79</span></div></td>
                            <td><div class="number"><span>80</span></div></td>
                        </tr>
                        <tr>
                            <td><div class="number"><span>81</span></div></td>
                            <td><div class="number"><span>82</span></div></td>
                            <td><div class="number"><span>83</span></div></td>
                            <td><div class="number"><span>84</span></div></td>
                            <td><div class="number"><span>85</span></div></td>
                            <td><div class="number"><span>86</span></div></td>
                            <td><div class="number"><span>87</span></div></td>
                            <td><div class="number"><span>88</span></div></td>
                            <td><div class="number"><span>89</span></div></td>
                            <td><div class="number"><span>90</span></div></td>
                        </tr>
                    </tbody>
                </table>
            </div>
            <div id="right-panel"></div>
        </div>
    </body>
    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha256-4 XzXVhsDmqanXGHaHvgh1gMQKX40OUvDEBTu8JcmNs=" crossorigin="anonymous"></script>
    <script type="text/javascript" src="./app.js"></script>
</html>  

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

1. Вы абсолютно привержены идее использования таблицы?

2. @RichardHunter Не обязательно. Это казалось наиболее логичной структурой, но я готов измениться, если мои условия будут выполнены.

Ответ №1:

Вот мое решение с таблицей.

 body {
  min-height: 100vh;
  display: flex;
}

table {
  table-layout: fixed;
  margin: auto;
  width: 50vw;
  font-size: 10vw;
}

td {
  padding: 0 !important;
}

.number {
  padding-bottom: 100%;
  position: relative;
  width: 100%;
}

.number span {
  display: inline-block;
  color: rgb(44, 68, 84);
  position: absolute;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 80%;
  height: 80%;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  font-family: "RobotCondensed";
  font-size: 10%;
  font-weight: 500;
  border: 2px solid rgba(96, 139, 168, .4);
  background-color: rgba(96, 139, 168, .2);
  border-radius: 50%;
}  
 <head>
  <meta charset="UTF-8">
  <!-- Styles -->
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" />
  <link rel="stylesheet" href="./style.css" />
  <title>Test</title>
</head>

<body>

  <table>
    <tbody>
      <tr>
        <td>
          <div class="number"><span>1</span></div>
        </td>
        <td>
          <div class="number"><span>2</span></div>
        </td>
        <td>
          <div class="number"><span>3</span></div>
        </td>
        <td>
          <div class="number"><span>4</span></div>
        </td>
        <td>
          <div class="number"><span>5</span></div>
        </td>
        <td>
          <div class="number"><span>6</span></div>
        </td>
        <td>
          <div class="number"><span>7</span></div>
        </td>
        <td>
          <div class="number"><span>8</span></div>
        </td>
        <td>
          <div class="number"><span>9</span></div>
        </td>
        <td>
          <div class="number"><span>10</span></div>
        </td>
      </tr>
      <tr>
        <td>
          <div class="number"><span>11</span></div>
        </td>
        <td>
          <div class="number"><span>12</span></div>
        </td>
        <td>
          <div class="number"><span>13</span></div>
        </td>
        <td>
          <div class="number"><span>14</span></div>
        </td>
        <td>
          <div class="number"><span>15</span></div>
        </td>
        <td>
          <div class="number"><span>16</span></div>
        </td>
        <td>
          <div class="number"><span>17</span></div>
        </td>
        <td>
          <div class="number"><span>18</span></div>
        </td>
        <td>
          <div class="number"><span>19</span></div>
        </td>
        <td>
          <div class="number"><span>20</span></div>
        </td>
      </tr>
      <tr>
        <td>
          <div class="number"><span>21</span></div>
        </td>
        <td>
          <div class="number"><span>22</span></div>
        </td>
        <td>
          <div class="number"><span>23</span></div>
        </td>
        <td>
          <div class="number"><span>24</span></div>
        </td>
        <td>
          <div class="number"><span>25</span></div>
        </td>
        <td>
          <div class="number"><span>26</span></div>
        </td>
        <td>
          <div class="number"><span>27</span></div>
        </td>
        <td>
          <div class="number"><span>28</span></div>
        </td>
        <td>
          <div class="number"><span>29</span></div>
        </td>
        <td>
          <div class="number"><span>30</span></div>
        </td>
      </tr>
      <tr>
        <td>
          <div class="number"><span>31</span></div>
        </td>
        <td>
          <div class="number"><span>32</span></div>
        </td>
        <td>
          <div class="number"><span>33</span></div>
        </td>
        <td>
          <div class="number"><span>34</span></div>
        </td>
        <td>
          <div class="number"><span>35</span></div>
        </td>
        <td>
          <div class="number"><span>36</span></div>
        </td>
        <td>
          <div class="number"><span>37</span></div>
        </td>
        <td>
          <div class="number"><span>38</span></div>
        </td>
        <td>
          <div class="number"><span>39</span></div>
        </td>
        <td>
          <div class="number"><span>40</span></div>
        </td>
      </tr>
      <tr>
        <td>
          <div class="number"><span>41</span></div>
        </td>
        <td>
          <div class="number"><span>42</span></div>
        </td>
        <td>
          <div class="number"><span>43</span></div>
        </td>
        <td>
          <div class="number"><span>44</span></div>
        </td>
        <td>
          <div class="number"><span>45</span></div>
        </td>
        <td>
          <div class="number"><span>46</span></div>
        </td>
        <td>
          <div class="number"><span>47</span></div>
        </td>
        <td>
          <div class="number"><span>48</span></div>
        </td>
        <td>
          <div class="number"><span>49</span></div>
        </td>
        <td>
          <div class="number"><span>50</span></div>
        </td>
      </tr>
      <tr>
        <td>
          <div class="number"><span>51</span></div>
        </td>
        <td>
          <div class="number"><span>52</span></div>
        </td>
        <td>
          <div class="number"><span>53</span></div>
        </td>
        <td>
          <div class="number"><span>54</span></div>
        </td>
        <td>
          <div class="number"><span>55</span></div>
        </td>
        <td>
          <div class="number"><span>56</span></div>
        </td>
        <td>
          <div class="number"><span>57</span></div>
        </td>
        <td>
          <div class="number"><span>58</span></div>
        </td>
        <td>
          <div class="number"><span>59</span></div>
        </td>
        <td>
          <div class="number"><span>60</span></div>
        </td>
      </tr>
      <tr>
        <td>
          <div class="number"><span>61</span></div>
        </td>
        <td>
          <div class="number"><span>62</span></div>
        </td>
        <td>
          <div class="number"><span>63</span></div>
        </td>
        <td>
          <div class="number"><span>64</span></div>
        </td>
        <td>
          <div class="number"><span>65</span></div>
        </td>
        <td>
          <div class="number"><span>66</span></div>
        </td>
        <td>
          <div class="number"><span>67</span></div>
        </td>
        <td>
          <div class="number"><span>68</span></div>
        </td>
        <td>
          <div class="number"><span>69</span></div>
        </td>
        <td>
          <div class="number"><span>70</span></div>
        </td>
      </tr>
      <tr>
        <td>
          <div class="number"><span>71</span></div>
        </td>
        <td>
          <div class="number"><span>72</span></div>
        </td>
        <td>
          <div class="number"><span>73</span></div>
        </td>
        <td>
          <div class="number"><span>74</span></div>
        </td>
        <td>
          <div class="number"><span>75</span></div>
        </td>
        <td>
          <div class="number"><span>76</span></div>
        </td>
        <td>
          <div class="number"><span>77</span></div>
        </td>
        <td>
          <div class="number"><span>78</span></div>
        </td>
        <td>
          <div class="number"><span>79</span></div>
        </td>
        <td>
          <div class="number"><span>80</span></div>
        </td>
      </tr>
      <tr>
        <td>
          <div class="number"><span>81</span></div>
        </td>
        <td>
          <div class="number"><span>82</span></div>
        </td>
        <td>
          <div class="number"><span>83</span></div>
        </td>
        <td>
          <div class="number"><span>84</span></div>
        </td>
        <td>
          <div class="number"><span>85</span></div>
        </td>
        <td>
          <div class="number"><span>86</span></div>
        </td>
        <td>
          <div class="number"><span>87</span></div>
        </td>
        <td>
          <div class="number"><span>88</span></div>
        </td>
        <td>
          <div class="number"><span>89</span></div>
        </td>
        <td>
          <div class="number"><span>90</span></div>
        </td>
      </tr>
    </tbody>
  </table>

</body>  

Но я бы, вероятно, предпочел не использовать таблицу, главным образом потому, что иногда их может быть немного сложно стилизовать, и потому, что организация последовательности чисел в группы по десять кажется мне неправильной семантически (я думаю, это должна быть просто одна непрерывная последовательность). Итак, вот мое решение, просто использующее divs. Кроме того, я использовал счетчик CSS для генерации чисел.

 html {
  box-sizing: border-box;
}

*,
*:before,
*:after {
  box-sizing: inherit;
}

body {
  min-height: 100vh;
  display: flex;
}

.table {
  margin: auto;
  counter-reset: tableCounter;
  width: 50vw;
  font-size: 1vw;
  display: grid;
  grid-template-columns: repeat(10, 1fr);
}

.table>div {
  counter-increment: tableCounter;
  position: relative;
  padding: 0;
  padding-bottom: 100%;
}

.table>div:before,
.table>div:after {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}

.table>div:before {
  content: '';
  padding: 30%;
  border-radius: 50%;
  background: rgba(96, 139, 168, .2);
  box-shadow: 0 0 0px 0.3vw rgba(96, 139, 168, .4);
}

.table>div:after {
  position: absolute;
  display: inline-block;
  color: rgb(44, 68, 84);
  content: counter(tableCounter);
}  
 <div class="table">
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</div>  

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

1. Идеально именно то, что я хотел. Большое спасибо.