Я пытаюсь сделать изображение "карусель" с горизонтальной прокруткой. Чистый HTML + CSS без JS.
Это мой HTML:
<div class = "slideshow">
<figure class = "slideshow__fig">
<img src = "img/hilti-png.png" alt = "" class = "slideshow__fig-img">
<figcaption>Fig.1 - Trulli, Puglia, Italy.</figcaption>
</figure>
<figure class = "slideshow__fig">
<img src = "img/hilti-png.png" alt = "" class = "slideshow__fig-img">
<figcaption>Fig.1 - Trulli, Puglia, Italy.</figcaption>
</figure>
<figure class = "slideshow__fig">
<img src = "img/hilti-png.png" alt = "p" class = "slideshow__fig-img">
<figcaption>Fig.1 - Trulli, Puglia, Italy.</figcaption>
</figure>
</div>
Это мой css:
.slideshow {
display: flex;
flex-wrap: nowrap;
overflow-y: hidden;
overflow-x: scroll;
//width: 80vw;
//margin: auto;
&::-webkit-scrollbar {
width: 350px;
height: 10px;
}
/* Track */
&::-webkit-scrollbar-track {
background: #f1f1f1;
}
/* Handle */
&::-webkit-scrollbar-thumb {
background: #888;
border-radius: 500px;
}
/* Handle on hover */
&::-webkit-scrollbar-thumb:hover {
background: #555;
}
&__fig {
flex: 0 0 auto;
height: 900px;
&-img{
height: 100%;
//width: 100%;
display: block;
}
}
}
1. Проблема заключается в том, что когда я устанавливаю ширину .slideshow на 80vw, полоса прокрутки, естественно, становится короче, но мои изображения обрезаются и не отображаются на всю ширину экрана. Когда я пытаюсь настроить ширину полосы прокрутки с помощью ::-webkit-scrollbar {width: 350px или 50vw или ...}, ничего не происходит.
Я хотел бы иметь полосу прокрутки, которая не является полной шириной div, который я прокручиваю, но почему-то не могу понять это.
2 - Другая проблема в том, что я хотел бы иметь figcaption в нижней левой части изображения. Но почему-то не отображается, когда есть горизонтальная прокрутка. Какие-либо предложения?
Вот пример того, как я хотел бы это иметь:
Пример изображения
Edit: Теперь мне наконец удалось это сделать, добавив:
&::-webkit-scrollbar-button:end:increment {
width: 50%;
display: block;
background: transparent;
}
Но теперь проблема в том, что полоса прокрутки находится не посередине, а с левой стороны. Margin:auto не помогает. Без понятия, как еще это сделать.
Также создание размера изображения 90% показало заголовок, который является не таким уж плохим решением.
Теперь вопрос только в том, как поставить полосу прокрутки в центр.
Вот что-то близкое к изображению, которое вы привели в качестве примера. Извините, но я действительно не знаю, как этого можно добиться с соблюдением критериев Pure HTML + CSS без критериев JS. Я думаю, что это вообще невозможно.
Итак, здесь используются jQuery и jQuery-ui, которые можно перетаскивать.
Он использует перетаскиваемый div, содержащийся внутри его родителя. Ondrag вычисляет процент «прокрутки», чтобы применить его к прокручиваемой ширине ползунка изображения.
Для мобильных... Я добавил патч для jQuery-ui. Подробнее об этом здесь. Я также поместил «код инициализации» в функцию, чтобы она могла работать при загрузке и изменении размера.
$(document).ready(function(){
function initDisplay(){
let slide_scrollWidth = $("#slide")[0].scrollWidth;
let customScrollbar_width = $("#sliderScroll_outer")[0].scrollWidth;
let percent = slide_scrollWidth/customScrollbar_width
$("#sliderScroll").css({"width":percent+"%", "left":0})
$("#slide")[0].scrollTo(0,0)
}
// On page load
initDisplay()
// Useful for mobile orientation change
window.onresize = initDisplay
$("#sliderScroll").draggable({
containment: "#sliderScroll_outer",
scroll: false,
drag: function(e){
let parentOffset = $(e.target).parent().offset().left
let offset = $(e.target).offset().left
let scrollableWidth = $(e.target).parent().width() - $(e.target).width()
let sliderPercent = (offset-parentOffset)/scrollableWidth
//console.info(sliderPercent)
let imageSliderWidth = $("#slide")[0].scrollWidth - $("#slide").width()
//console.info(imageSliderWidth)
$("#slide")[0].scrollTo(sliderPercent*imageSliderWidth,0)
}
});
});
#container{
margin: 1em;
}
#slide{
display: flex;
overflow: hidden;
}
#slide img{
margin: 0 0.5em;
}
#sliderScroll_outer{
width: 40vw;
background: lightgrey;
margin: 1em;
}
#sliderScroll{
width: 0vw;
height: 10px;
background: green;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jqueryui-touch-punch/0.2.2/jquery.ui.touch-punch.min.js"></script>
<div id = "container">
<div id = "slide">
<img src = "https://via.placeholder.com/800x600.png">
<img src = "https://via.placeholder.com/400x600.png">
<img src = "https://via.placeholder.com/1000x600.png">
</div>
<div id = "sliderScroll_outer">
<div id = "sliderScroll"></div>
</div>
</div>
Запускайте в полностраничном режиме или CodePen
Для мобильных устройств вам просто нужно добавить патч jQuery-ui под названием Touch Punch , как говорит этот другой ответ SO... ;) Я попробовал в своем codePen, и он отлично работает без каких-либо изменений в приведенном выше коде. ;)
Гна! Я все равно отредактировал, для размера абсолютно необходим обработчик onresize для мобильных устройств. ;)
Большое спасибо. Попробую обязательно попробую и постараюсь понять. Я бы проголосовал за вас, но не могу, так как мой рейтинг слишком низок. Уже пытался это сделать.
Вы можете нажать на зеленую галочку, чтобы принять ответ. ;)
Большое спасибо за ваш вклад, я очень ценю это. Вау, все намного сложнее, как я думал. Я думал о чем-то вроде маржи: автоматическое решение, ха-ха. Я попробовал этот код, и я думаю, что он отлично работает на рабочем столе, но я думаю, что он не работает на мобильных устройствах. Может быть, это просто нужно настроить, но, поскольку я новичок, я бы даже не пытался изменить этот код. Да, может быть, я пытался сделать слишком много, имея слишком мало знаний :)