Что ж, это можно сделать без JS - но в итоге у вас будет большой повторяющийся сложный неподдерживаемый файл CSS, и у вас не будет гибкости в количестве элементов / дней, которые вы захотите в конечном итоге заполнить этот родитель с.
- Создайте свой макет, используя CSS
flex
- Всегда используйте
type="button"
для ваших <button>
элементов, иначе они будут типа Submit по умолчанию - Создайте функцию
.each()
- чтобы вы могли иметь несколько Day Pickers на одной странице (или, точнее, изучить, как создать jQuery плагин ) - Вычислите количество дней, используя JS, и вычислите сколько видимых сделав некоторое деление ширины
- Создайте
c
( counter ) и используйте ее для анимации %
до отрицательного значения; например: скажем, c
равно 2
, поэтому: -(100/4) * 2
будет равно -50% левой анимации. - обязательно увеличивайте, уменьшайте эту
c
переменную, но также не забудьте сбросьте значение на 0
или на максимальное количество шагов. - Используйте CSS
transition
и tranform: translateX
для анимации элемента
Вот упрощенный быстрый пример с минимальная разметка, которую вы можете легко добавить в свой код с небольшими изменениями:
$(".day-picker").each(function() {
const $week = $(".day-picker-week", this);
const $days = $(".day-value", this);
const $prev = $(".prev", this);
const $next = $(".next", this);
const visible = Math.floor($week.width() / $days.outerWidth(true));
const perc = 100 / visible;
const tot = $days.length;
const steps = tot - visible;
let c = 0;
const anim = () => {
$week.css({transform: `translateX(${-perc*c}%)`});
}
$prev.on("click", function() {
c -= 1;
if (c < 0) c = steps;
anim();
});
$next.on("click", function() {
c += 1;
if (c > steps) c = 0;
anim();
});
});
/* QuickReset */
* {
margin: 0;
box-sizing: border-box;
}
body {
font: 14px/1.4 sans-serif;
}
/* DayPicker */
.day-picker {
--day-width: 70px;
--day-spacing: 5px;
--days-visible: 4;
display: inline-flex;
}
.day-picker-overflow {
overflow: hidden;
width: calc(var(--day-width) * var(--days-visible) + var(--day-spacing) * var(--days-visible) * 2 );
}
.day-picker-week {
list-style: none;
display: flex;
padding: 0;
transition: transform 0.4s;
}
[name="day-picker"] { /* Hide radio buttons */
position: absolute;
width: 1px;
height: 1px;
opacity: 0;
clip: rect(1px, 1px, 1px, 1px);
}
.day-value {
display: block;
color: #d85c54;
cursor: pointer;
user-select: none;
margin: 0 var(--day-spacing);
width: var(--day-width);
text-align: center;
padding: 20px 0;
box-shadow: inset 0 0 0 1px currentColor;
transition: 0.3s;
}
[name="day-picker"]:checked ~ .day-value {
color: #000;
font-weight: bold;
box-shadow: inset 0 0 0 2px currentColor;
}
.day-number {
display: block;
}
.day-picker-nav {
cursor: pointer;
display: block;
min-height: 100%;
border: 0;
background: transparent;
}
<div class="day-picker">
<button type="button" class="day-picker-nav prev">
<svg width="12" height="14" xmlns="http://www.w3.org/2000/svg" transform='rotate(180)'>
<path class="svg-stroke-container" stroke-linejoin="round" stroke-linecap="round" fill-rule="evenodd" fill="none" stroke="#D70F64" d="m3.5,1.5l5,5.5l-5,5.5"></path>
</svg>
</button>
<div class="day-picker-overflow">
<ul class="day-picker-week">
<li>
<label class="day-picker-day">
<input type="radio" value="" name="day-picker" />
<span class="day-value">SAT<span class="day-number">11</span></span>
</label>
</li>
<li>
<label class="day-picker-day">
<input type="radio" value="" name="day-picker" />
<span class="day-value">SUN<span class="day-number">12</span></span>
</label>
</li>
<li>
<label class="day-picker-day">
<input type="radio" value="" name="day-picker" />
<span class="day-value">MON<span class="day-number">13</span></span>
</label>
</li>
<li>
<label class="day-picker-day">
<input type="radio" value="" name="day-picker" />
<span class="day-value">TUE<span class="day-number">14</span></span>
</label>
</li>
<li>
<label class="day-picker-day">
<input type="radio" value="" name="day-picker" />
<span class="day-value">WED <span class="day-number">15</span></span>
</label>
</li>
<li>
<label class="day-picker-day">
<input type="radio" value="" name="day-picker" />
<span class="day-value">THU <span class="day-number">16</span></span>
</label>
</li>
<li>
<label class="day-picker-day">
<input type="radio" value="" name="day-picker" />
<span class="day-value">FRI <span class="day-number">17</span></span>
</label>
</li>
</ul>
</div>
<button type="button" class="day-picker-nav next">
<svg width="12" height="14" xmlns="http://www.w3.org/2000/svg" transform='rotate(0)'>
<path class="svg-stroke-container" stroke-linejoin="round" stroke-linecap="round" fill-rule="evenodd" fill="none" stroke="#D70F64" d="m3.5,1.5l5,5.5l-5,5.5"></path>
</svg>
</button>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>