Изменение размера div на основе братьев и сестер определенного класса - PullRequest
4 голосов
/ 27 мая 2019

Я обнаружил, что есть простой способ подсчитать братьев и сестер из тега <li> и вернуть стиль CSS, подходящий для того, сколько существует <li> братьев и сестер:

ul{
	list-style-type: none;
    display: block;
}

#container{
	width: 100%;
	float: left;
	height: 100%;
	margin-left: 0;
	margin-top: 0;
}


li:first-child:nth-last-child(1) {
	height: 100%;
	background-color: red;
	width: 100%;
}

li:first-child:nth-last-child(2),
li:first-child:nth-last-child(2) ~ li {
	height: 100%;
	background-color: blue;
	float: left;
	width: 49%;
  margin-left: 1%;
}

li:first-child:nth-last-child(3),
li:first-child:nth-last-child(3) ~ li {
	height: 100%;
	float: left;
	background-color: red;
	width: 33.333%;
}


li:first-child:nth-last-child(4),
li:first-child:nth-last-child(4) ~ li {
	height: 100%;
	background-color: blue;
	float: left;
	width: 24%;
  margin-left: 1%;
}
<div id="container">
<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
</ul>
</div>

Я хочу скрыть <li> теги с class="hidden"

Я пробовал:

ul {
list-style: none;
}



li.hidden:first-child:nth-last-child(2),
li.hidden:first-child:nth-last-child(2) ~ li {
	display: none;
}

li.hidden:first-child:nth-last-child(3),
li.hidden:first-child:nth-last-child(3) ~ li {
	background-color: blue;
}
<ul>
<li class="hidden">1</li>
<li>2</li>
<li class="hidden">3</li>
<li>4</li>
</ul>

Существует ли способ выборочного обнаружения и изменения стиля CSS тега <li> с помощью класса «hidden», основанного на количестве <li> теги с классом «скрытый» без влияния на теги <li> без класса «скрытый»?

Ответы [ 3 ]

0 голосов
/ 05 июня 2019

Я немного побаловался с этим. Кажется, я не могу заставить классы работать над этим, может быть, кто-то, кто знает CSS лучше, чем я, может заставить его работать, но кажется, что у nth-of-type и last-child есть свои нюансы с тем, что вы пытаетесь сделать.

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

Когда вы удаляете элемент списка, чтобы было только 3, фоновый цвет будет синим для всех 3. Когда вы уменьшите до 2 литов, они исчезнут. 1, 4 или более экземпляров li, и они будут отображаться как обычно.

Так как nth-last-child ожидает, что аргумент будет last child , тогда, указав nth-last-child(2) или nth-last-child(3), вы ожидаете в точности 2 или 3 экземпляра элемент, так как это считает детей сзади вперед.

При объединении с: first-child мы ищем любой элемент, который является и вторым (или третьим) элементом с конца и первым элементом.

Если это условие выполнено, то это означает, что существует ровно 2 (или 3) экземпляра этого элемента.

Чтобы захватить все элементы между вами, используйте общий комбинатор (~)

Чтобы узнать больше информации об этом, вы можете посетить этот сайт [https://alistapart.com/article/quantity-queries-for-css/], который объясняет это немного глубже, но я привел основной пример этого ниже.

Надеюсь, это поможет!

<!doctype html>
<html>
    <head>
    <meta charset="utf-8">
    <title>Untitled Document</title>
    <style type="text/css">

        li:nth-last-child(2):first-child, 
        li:nth-last-child(2):first-child ~ li {
            display: none;
        }

        li:nth-last-child(3):first-child, 
        li:nth-last-child(3):first-child ~ li {
            background-color: blue;
        }

    </style>
</head>

<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
    </ul>
</body>

0 голосов
/ 16 июня 2019

Решение этого вопроса «Можно ли изменить размер div (s) на основе их братьев и сестер с помощью CSS») к сожалению, все еще ожидает рассмотрения, но из-за количества (#) просмотров в этом посте я чувствую, что нужно ответить на вопрос, лежащий в основе вопроса «Можно ли изменить размеры div (s) на основе их братьев и сестер».

используя jQuery ответ, на который я пришел:

$(document).ready(function(){

     var classinquestion = (".resizable");
     
     var LeftHeight = $("#left").height();
     
     var NavID = (".resizable");

     var element_count = $(classinquestion).length;
     
             if (element_count === 11) 
             {
                $(NavID).css({"line-height": (LeftHeight / element_count) + "px", "background-color": "red" }); 
             }
             if (element_count === 10) 
             {
                $(NavID).css({"line-height": (LeftHeight / element_count) + "px", "background-color": "blue" }); 
             }
             if (element_count === 9) 
             {
                $(NavID).css({"line-height": (LeftHeight / element_count) + "px", "background-color": "green" }); 
             }
             if (element_count === 8) 
             {
                $(NavID).css({"line-height": (LeftHeight / element_count) + "px", "background-color": "yellow" }); 
             }
             if (element_count === 7) 
             {
                $(NavID).css({"line-height": (LeftHeight / element_count) + "px", "background-color": "pink" }); 
             }
             if (element_count === 6) 
             {
                $(NavID).css({"line-height": (LeftHeight / element_count) + "px", "background-color": "orange" }); 
             }
             if (element_count === 5)
             {
                $(NavID).css({"line-height": (LeftHeight / element_count) + "px", "background-color": "white" }); 
             }
             if (element_count === 4)
             {
                $(NavID).css({"line-height": (LeftHeight / element_count) + "px", "background-color": "black" }); 
             }
             if (element_count === 3)
             {
                $(NavID).css({"line-height": (LeftHeight / element_count) + "px", "background-color": "grey" }); 
             }
             if (element_count === 2)
             {
                $(NavID).css({"line-height": (LeftHeight / element_count) + "px", "background-color": "brown" }); 
             }
             if (element_count === 1)
             {
               alert("1"); 
             };

         });
#left {
  background-color: #363636;
  height: fit-content;
 }

.resizable{
	margin-left: 10%;
  margin-right: 10%;
  margin-top: 1%;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<div id="left">
     <div class="resizable">1</div>
     <div class="resizable">2</div>
     <div class="resizable">3</div>
     <div class="resizable">4</div>
     <div class="resizable">5</div>
     <div class="resizable">6</div>
     <div class="resizable">7</div>
     <div class="resizable">8</div>
     <div class="resizable">9</div>
     <div class="resizable">10</div>
     <div class="resizable">11</div>
</div>

Чтобы увидеть реальные эффекты скрипта, код должен быть запущен с помощью других средств, чем «Выполнить фрагмент кода» в Stackoverflow, потому что размер HTML-элемента в разделе «Результат» изменяется.

0 голосов
/ 31 мая 2019
  1. Я украсил / реорганизовал ваш код (думаю, так понятнее) - я не понял, почему вы хотите использовать "first-child" в сочетании с "nth-last-child".Как это должно работать, я не очень понимаю.

  2. Вот быстрый ответ на эту же тему: почему вы не можете достичь того, чего хотите, только с помощью CSS. Как заставить селектор n-го ребенка пропустить скрытые div

  3. Итак, мой ответ не завершен / не работает, как вы ожидаете.На мой взгляд, вам придется использовать JQuery для этого.

ul{
	list-style-type: none;
    display: block;
}

#container{
	width: 100%;
	float: left;
	height: 100%;
	margin-left: 0;
	margin-top: 0;
}

li {
  color: yellow;
  float: left;
  height: 100%;
  line-height: 50px;
  margin-left: 1%;
  text-align: center;
  width: 20%;
}

li.hidden{
  display: none;
}


li:nth-child(1) {
	background-color: green;
}

li:not(.hidden):nth-child(2){
	background-color: silver;
}

li:not(.hidden):nth-child(3){
	background-color: red;
}

li:not(.hidden):nth-child(4){
	background-color: blue;
}
<div id="container">
  <ul>
      <li>1</li>
      <li class="hidden">2</li>
      <li>3</li>
      <li class="hidden">4</li>
  </ul>
</div>
Я также добавил версию с nth-of-type - здесь ничего нового.Вы должны рассмотреть возможность использования jQuery.

ul{
  background: #eee;
  cursor: pointer;
  display: table;
	list-style-type: none;
  padding: 10px;
  width: 80%;
}

#container{
	width: 100%;
	float: left;
	height: 100%;
	margin-left: 0;
	margin-top: 0;
}

li {
  border: 1px solid #333;
  border-radius: 4px;
  color: #333;
  float: left;
  font-weight: bold;
  height: 100%;
  line-height: 50px;
  margin-left: 1%;
  text-align: center;
  width: 20%;
}

li.hidden{
  display: none;
}

ul:hover li.hidden {display: block;}


li:nth-of-type(1):not(.hidden) {
	background-color: green;
}

li:nth-of-type(2):not(.hidden){
	background-color: silver;
}

li:nth-of-type(3):not(.hidden){
	background-color: red;
}

li:nth-of-type(4):not(.hidden){
	background-color: blue;
}
<div id="container">
  <ul>
      <li>1</li>
      <li class="hidden">2</li>
      <li>3</li>
      <li class="hidden">4</li>
  </ul>
</div>
...