Показывать элемент флажка только один раз и ниже объектов в цикле - PullRequest
0 голосов
/ 31 декабря 2018

Мне удалось сделать все изображения в цикле, кроме первых 4, скрытых в раскрывающемся элементе с кодом, который я разместил, но я изо всех сил стараюсь, чтобы раскрывающееся сообщение отображалось только один раз и НИЖЕ все элементы.Вот как это выглядит, прежде чем щелкнуть на раскрывающемся сообщении: enter image description here

Вот как это выглядит после нажатия на любой из них: enter image description here

Я попытался поместить <label for="hd-2">Show remaining images</label> ниже цикла, но тогда стили CSS перестали работать.К сожалению, мне не хватает знаний CSS, чтобы поддерживать стиль CSS, если я переместу label ниже цикла (если это вообще возможно).

### Twig ###

{% block imagelist_field %}
    <div class="imagelist columns">
        {% for image in value %}
        {% if loop.index0 is divisibleby(4) %}
            <input class="hide" id="hd-2" type="checkbox">
            <label for="hd-2">Show remaining images</label>
            <div class="section-imagelist">
        {% endif %}
        {% if value|length < 4 %}
            <div class="below4">
        {% endif %}         
        <div>
            {{ popup(image.filename, 320, 240) }}
        </div>
        {% if loop.index is divisibleby(4) or loop.last %}
            </div>
        {% endif %}
        {% if value|length < 4 %}
            </div>
        {% endif %}
    {% endfor %}
</div>
{% endblock %}

### CSS ###

.hide, .section-imagelist:nth-child(n+4)  {
  display: none;
}

.hide + label {
    margin: 0;
    padding: 0;
    color: green;
    cursor: pointer;
    display: inline-block;
    }

.hide:checked + label {
    color: red;
    border-bottom: 0;
}

.hide:checked + label ~ * {
    display: flex !important;
}

.hide + label:before {
    background-color: #1e90ff;
    color: #fff;
    content: "\002B";
    display: block;
    float: left;
    font-size: 14px; 
    font-weight: bold;
    height: 16px;
    line-height: 16px;
    margin: 3px 5px;
    text-align: center;
    width: 16px;
    -webkit-border-radius: 50%;
    -moz-border-radius: 50%;
    border-radius: 50%;
}
.hide:checked + label:before {
    content: "\2212";
}

1 Ответ

0 голосов
/ 31 декабря 2018

Вы должны переместить флажок перед циклом и метку после.Затем вы настраиваете CSS, чтобы он не зависел от метки и флажка рядом друг с другом (на самом деле вам не нужен селектор отношений + в случае метки).

Затем вы можете использоватькласс .section-imagelist, чтобы показать / скрыть группы из четырех изображений, как вам нужно.

Скрыть все .section-imagelist по умолчанию

.section-imagelist {
  display: none;
}

Показать первый по умолчанию

.section-imagelist:first-of-type {
  display: inherit !important;
}

Показать все .section-imagelist, если перед ними стоит отмеченный элемент с классом .hide

.hide:checked~.section-imagelist {
  display: inherit;
}

Дайте мне знать, если это не то, что вы хотели.


Веточка

{% block imagelist_field %}

    <div class="imagelist columns">

      {# The checkbox can be placed as the first child. It does not need to be adjacent to the label (the for= parameter lets it know which one to change #}
      <input class="hide" id="hd-2" type="checkbox">

      {% for image in value %}

          ...
          ...
          ...

      {% endfor %}

      {# The label should be last, so it is always after the images #}
      <label for="hd-2">Show remaining images</label>

  </div>

{% endblock %}

img {
  float: left;
  width: 25%;
}

.hide {
  display: none;
}

.hide:checked~label {
  color: red;
  border-bottom: 0;
}

.section-imagelist {
  display: none;
  width: 100%;
}

.section-imagelist:first-of-type {
    display: inline-block;
}

.hide:checked~.section-imagelist {
    display: inline-block;
}

label:before {
  background-color: #1e90ff;
  color: #fff;
  content: "\002B";
  display: block;
  float: left;
  font-size: 14px;
  font-weight: bold;
  height: 16px;
  line-height: 16px;
  margin: 3px 5px;
  text-align: center;
  width: 16px;
  -webkit-border-radius: 50%;
  -moz-border-radius: 50%;
  border-radius: 50%;
}

.hide:checked~label:before {
  content: "\2212";
  background: red;
}

label[for='hd-2'] {
  cursor: pointer;
}
<div class="imagelist columns">

  <input class="hide" id="hd-2" type="checkbox">

  <div class="section-imagelist">

    <div>
      <a>
        <img src="https://via.placeholder.com/240/09f">
      </a>
    </div>

    <div>
      <a>
        <img src="https://via.placeholder.com/240/09f">
      </a>
    </div>

    <div>
      <a>
        <img src="https://via.placeholder.com/240/09f">
      </a>
    </div>

    <div>
      <a>
        <img src="https://via.placeholder.com/240/09f">
      </a>
    </div>

  </div>


  <div class="section-imagelist below4">

    <div>
      <a>
        <img src="https://via.placeholder.com/240">
      </a>
    </div>

    <div>
      <a>
        <img src="https://via.placeholder.com/240">
      </a>
    </div>

    <div>
      <a>
        <img src="https://via.placeholder.com/240">
      </a>
    </div>


  </div>

  <label for="hd-2">Show remaining images</label>



</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...