Есть блок:
var $size = 155;
if ($('.review-cont').height() > $size) {
$('.review-cont').addClass('re-hide');
$('<span>', {
text: 'Подробнее',
class: 're-open'
}).appendTo('.review-bottom');
$(".re-open").click(function() {
$(this).siblings('.review-cont').toggleClass('re-hide').toggleClass('re-full');
var $button = $(this);
$button.text($button.text() == "Подробнее" ? "Закрыть" : "Подробнее");
});
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="review">
<div class="review-top">имг</div>
<div class="review-middle">
<p class="review-name">текст</p>
<p class="review-location">еще текст</p>
</div>
<div class="review-bottom">
<div class="review-cont">КОНТЕНТ</div>
</div>
</div>
Таких блоков много. Из задачи всё просто - если указанный блок превышает указанную в скрипте высоту, то добавляем класс и кнопку.
Но проблема в том, что если какой-то из множества блоков укладывается в высоту, указанную в скрипте, то скрипт не отрабатывает не только у данного блока, но и во всех остальных.
Как сделать, чтобы высота считалась в каждом отдельном случаи независимо? Предполагаю использование this
, но не понял, как его приладить.
Метод height возвращает значение высоты для первого элемента в коллекции
Description: Get the current computed height for the first element in the set of matched elements.
Для проверки всех нужно использовать each
Кроме того для вставки span, так же надо брать элемент относительно текущего. в данном случае подойдет метод parent()
Пример:
var $size = 155;
$('.review-cont').each(function() {
var $review = $(this);
if ($review.height() > $size) {
$review.addClass('re-hide');
$('<span>', {
text: 'Подробнее',
class: 're-open'
}).appendTo($review.parent())
.click(function() {
$(this).siblings('.review-cont').toggleClass('re-hide').toggleClass('re-full');
var $button = $(this);
$button.text($button.text() == "Подробнее" ? "Закрыть" : "Подробнее");
});
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="review">
<div class="review-top">имг</div>
<div class="review-middle">
<p class="review-name">текст</p>
<p class="review-location">еще текст</p>
</div>
<div class="review-bottom">
<div class="review-cont">КОНТЕНТ</div>
</div>
</div>
Я бы примерно так сделал -
let listItemAll = Array.from( document.body.querySelectorAll( '.autoresize-content-container' ) );
const LIST_ITEM_MAX_HEIGHT = 36;
function listItemSizeValid(element){
return element.scrollHeight > LIST_ITEM_MAX_HEIGHT;
}
function setElementSizeAllowedTask( element ){
element.dataset.state = "max-size"
}
listItemAll
.filter( listItemSizeValid )
.forEach( setElementSizeAllowedTask );
.list {
list-style: none;
display: inline-flex;
justify-content: center;
}
.list-item {
max-height: 80px;
width: 100px;
}
.autoresize-content-container[data-state="default-size"] > button {
display: none;
}
.autoresize-content-container[data-state="max-size"] {
background: pink;
}
<main>
<ul class="list">
<li class="list-item">
<div class="autoresize-content-container" data-state="default-size">
<span>
some text
some text
</span>
<button>развернуть</button>
</div>
</li>
<li class="list-item">
<div class="autoresize-content-container" data-state="default-size">
<span>
some text
some text
some text
some text
</span>
<button>развернуть</button>
</div>
</li>
<li class="list-item">
<div class="autoresize-content-container" data-state="default-size">
<span>
some text
some text
</span>
<button>развернуть</button>
</div>
</li>
<li class="list-item">
<div class="autoresize-content-container" data-state="default-size">
<span>
some text
some text
some text
some text
</span>
<button>развернуть</button>
</div>
</li>
<li class="list-item">
<div class="autoresize-content-container" data-state="default-size">
<span>
some text
some text
</span>
<button>развернуть</button>
</div>
</li>
<li class="list-item">
<div class="autoresize-content-container" data-state="default-size">
<span>
some text
some text
some text
some text
</span>
<button>развернуть</button>
</div>
</li>
</ul>
</main>
Из-за того что я не хочу писать css для для контейнера контента, который не входит в суть вопроса, я не стал уменьшать размеры, как в моем предыдущем примере, чтобы Вы увидели кнопки, которые есть только у контейнеров превысивших высоту.
Особое внимание на то как устанавливается кнопка. В js
для это нужно лишь изменить флаг с default-size
на max-size
и тогда к контейнеру применяются стили, которые прописаны для подсветки фона.
И хватит уже использовать позавчерашнюю jQ
, чистый js
уже давно превзошел её.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Нужно было сделать скосы у блоков, сделан через skew и минусовый topи после того как подвинул все 12 экранов, снизу под футером осталось место,...
Помогите пожалуйста, есть функция, суть ее - это сделать эффект текста, который набираетсяТо есть при переключении слайда она принимает 2 фразы:...
Добрый вечерНе могу несколько дней разобраться с одним кодом, работает но почему то через раз (на первом изображение работает, на втором нет,...