моя проблема в том, что мне нужна точная ширина (динамически) моего элемента слайд-группы. я пробую много способов, но каждый раз получаю 0px.
const slideGroupWidth = document.querySelector('.slide-group');
console.info(getComputedStyle(slideGroupWidth).width);body {
display: flex;
align-items: center;
justify-content: start;
height: 100vh;
}
.slider {
display: flex;
position: relative;
width: 1100px;
margin-inline: auto;
overflow: hidden;
border: 1px solid red;
}
.btn {
background-color: #dcdcdc;
border-radius: 50%;
border: none;
align-self: start;
padding: .3rem;
font-size: 1rem;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
position: absolute;
}
.left-btn {
top: 50%;
left: 1%;
transform: translate(30%, -50%);
}
.right-btn {
top: 50%;
right: 1%;
transform: translate(-30%, -50%);
}
.slide {
transition: all .5s ease;
}
.slide-group {
display: flex;
transition: all .5s ease;
}
.slide-img {
display: block;
}<div class = "slider">
<div class = "slide-group">
<div class = "slide">
<img class = "slide-img" src = "https://picsum.photos/350/200?image=1084" alt = "image" />
</div>
<div class = "slide">
<img class = "slide-img" src = "https://picsum.photos/350/200?image=1004" alt = "image" />
</div>
<div class = "slide">
<img class = "slide-img" src = "https://picsum.photos/350/200?image=1044" alt = "image" />
</div>
</div>
<div class = "slide-group">
<div class = "slide">
<img class = "slide-img" src = "https://picsum.photos/350/200?image=1084" alt = "image" />
</div>
<div class = "slide">
<img class = "slide-img" src = "https://picsum.photos/350/200?image=1004" alt = "image" />
</div>
</div>
<button class = "btn right-btn">➡</button>
<button class = "btn left-btn">⬅</button>
</div>другой способ, которым я получил 0px:
let box = document.querySelector('.slide-group');
let width = box.offsetWidth;
console.info(width);
Зачем мне ширина? я хочу установить ширину элемента .slide динамически из
.slide-group container.
примечание: проверка этого элемента дает мне ширину 1050 пикселей в хроме.
Я получаю 1050 пикселей из вашего кода. Куда вы поместили свой тег <script>? Переместите его в тег заголовка вашего html и добавьте к нему отсрочку. вот так: <script defer src = "./main.js"></script>
@ Седрик, да, проблема решена. но что за кулисами проблемы? это только для того, что я загрузил изображение из picsum api?
Все еще предположение, но загрузка изображения до запуска скрипта может занять слишком много времени, поэтому ваши div не имеют ширины.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Пытаться:
Сохранение идентификатора для slidegroup, например:
<div class = "slide-group" id = "slide-group">
js-код:
console.info(document.getElementById("slide-group").offsetWidth)
Это напечатает точную ширину div
нет, я получил 0 из этого кода
Проблема в том, что вы не ждете загрузки изображения, прежде чем запрашивать у системы его ширину.
Этот фрагмент демонстрирует довольно простую функцию загрузки.
function allloaded() {
const slideGroupWidth = document.querySelector('.slide-group');
console.info(getComputedStyle(slideGroupWidth).width);
}
window.onload = allloaded;body {
display: flex;
align-items: center;
justify-content: start;
height: 100vh;
}
.slider {
display: flex;
position: relative;
width: 1100px;
margin-inline: auto;
overflow: hidden;
border: 1px solid red;
}
.btn {
background-color: #dcdcdc;
border-radius: 50%;
border: none;
align-self: start;
padding: .3rem;
font-size: 1rem;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
position: absolute;
}
.left-btn {
top: 50%;
left: 1%;
transform: translate(30%, -50%);
}
.right-btn {
top: 50%;
right: 1%;
transform: translate(-30%, -50%);
}
.slide {
transition: all .5s ease;
}
.slide-group {
display: flex;
transition: all .5s ease;
}
.slide-img {
display: block;
}<div class = "slider">
<div class = "slide-group">
<div class = "slide">
<img class = "slide-img" src = "https://picsum.photos/350/200?image=1084" alt = "image" />
</div>
<div class = "slide">
<img class = "slide-img" src = "https://picsum.photos/350/200?image=1004" alt = "image" />
</div>
<div class = "slide">
<img class = "slide-img" src = "https://picsum.photos/350/200?image=1044" alt = "image" />
</div>
</div>
<div class = "slide-group">
<div class = "slide">
<img class = "slide-img" src = "https://picsum.photos/350/200?image=1084" alt = "image" />
</div>
<div class = "slide">
<img class = "slide-img" src = "https://picsum.photos/350/200?image=1004" alt = "image" />
</div>
</div>
<button class = "btn right-btn">➡</button>
<button class = "btn left-btn">⬅</button>
</div>каждый раз, когда я должен использовать этот фрагмент для этой проблемы?
Я предполагаю, что это связано со временем загрузки изображения, но я не уверен. Я думаю, это причина, потому что кажется, что если вы ждете с
setTimeout(() => { [...] },1000), результат будет 1050. Это просто подсказка для следующих ответов, не используйтеsetTimeOutдля этого