HTML:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<div class="tabs3d"> <div class="tabs3d-control"></div> <div class="tabs3d-stage"> <div class="spinner spinner-left"> <div class="spinner-face" data-bg="#2b4356" data-menu="Заголовок"> <div class="content"> <div class="content-left" style="background-image: url(image-1.jpg);"> <div class="content-title"> <div>Заголовок</div> <p>Подзаголовок</p> </div> </div> <div class="content-right"> <div class="content-main"> <p>Текст</p> <p class="content-autor">Автор</p> </div> </div> </div> </div> <!-- Еще вкладки --> <div class="spinner-face" data-bg="#353f49" data-menu="Заголовок"> <div class="content"> <div class="content-left" style="background-image: url(image-n.jpg);"> <div class="content-title"> <div>Заголовок</div> <p>Подзаголовок</p> </div> </div> <div class="content-right"> <div class="content-main"> <p>Текст</p> <p class="content-autor">Автор</p> </div> </div> </div> </div> </div> </div> </div> <!-- Предзагрузка картинок --> <div style="height: 0; width: 0; overflow: hidden"> <img src="image-1.jpg"> <img src="image-n.jpg"> </div> |
CSS:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 |
.js-transitions-disabled * { transition: none !important; } .tabs3d { position: relative; height: 500px; perspective: 1500px; perspective-origin: 50% 50%; } .tabs3d-control { position: absolute; display: flex; flex-wrap: wrap; right: 38px; top: 38px; z-index: 1; box-shadow: 0 4px 12px rgba(0,0,0,0.2), 0 16px 20px rgba(0,0,0,0.2); } .tabs3d-control a { position: relative; font-family: Verdana, sans-serif; font-weight: bold; text-transform: uppercase; font-size: 18px; padding: 10px 14px; display: block; text-decoration: none; box-sizing: border-box; color: #FFF; transition: background 0.4s; } .tabs3d-control a:hover { background-color: #000!important; } .tabs3d-control a.active, .tabs3d-control a.active:hover { background-color: #FFF!important; color: #000; } .tabs3d-stage { position: absolute; top: 20px; bottom: 20px; left: 20px; right: 20px; margin: auto; transform-style: preserve-3d; transform: translateZ(-230px); } .spinner { position: absolute; width: 50%; height: 460px; top: 0; left: 0; right: auto; bottom: 0; margin: auto; transform-style: preserve-3d; transition: transform 1s; backface-visibility: hidden; transform-origin: 50% 50%; transform: rotateX(0); } .js-spin-fwd .spinner { transform: rotateX(-90deg); } .js-spin-bwd .spinner { transform: rotateX(90deg); } .js-spin-fwd .spinner-right { transform: rotateX(90deg); } .js-spin-bwd .spinner-right { transform: rotateX(-90deg); } .spinner-right { right: 0; left: auto; } .spinner-face { display: none; position: absolute; width: 100%; height: 100%; overflow: hidden; } .spinner-face.js-next { display: block; transform: rotateX(90deg) translateZ(230px); } .spinner-right .spinner-face.js-next { transform: rotateX(270deg) translateZ(230px); } .js-spin-bwd .spinner-face.js-next { transform: rotateX(-90deg) translateZ(230px); } .js-spin-bwd .spinner-right .spinner-face.js-next { transform: rotateX(-270deg) translateZ(230px); } .js-active { display: block; transform: translateZ(230px); } .content { position: absolute; width: 200%; height: 100%; left: 0; } .spinner-right .content { left: -100%; } .content-left, .content-right { position: absolute; left: 0; top: 0; width: 50%; height: 100%; } .content-right { right: 0; left: auto; } .content-left { background-repeat: no-repeat; background-size: cover; background-position: 50% 50%; } .content-left .content-title { position: absolute; bottom: 20px; right: 40px; text-shadow: 0 0 12px rgba(0,0,0,0.5), 0 2px 6px rgba(0,0,0,0.7); text-align: right; color: #FFF; font-family: Verdana, sans-serif; font-weight: bold; } .content-left .content-title div { font-size: 36px; text-transform: uppercase; } .content-left .content-title p { font-size: 22px; margin-top: 10px; } .content-right { display: flex; align-items: center; justify-content: center; padding-top: 50px; } .content-right .content-main { position: absolute; max-height: 320px; overflow-x: auto; margin: 20px; padding: 0 20px; } .content-right .content-main p { margin: 0 0 14px 0; color: #FFF; font-family: Verdana, sans-serif; text-align: left; font-size: 16px; line-height: 1.35; } .content-right .content-main .content-autor { text-transform: uppercase; font-size: 13px; float: right; padding: 6px 6px 0 6px; display: inline-block; border-top: 1px solid #FFF; margin: 0; } @media screen and (max-width:991px) { .tabs3d { height: auto; margin: 20px 0; } .tabs3d-control { position: relative; box-shadow: none; top: 0; left: 0; margin-bottom: 10px; justify-content: center; } .spinner { position: static; width: 100%; height: 260px; } .tabs3d-stage { position: static; transform-style: flat; transform: translateZ(0); } .content-right { padding-top: 0; } .content-right .content-main { max-height: 220px; } .content-right .content-main p { font-size: 13px; } .spinner-face.js-next { display: block; transform: rotateX(90deg) translateZ(130px); } .spinner-right .spinner-face.js-next { transform: rotateX(270deg) translateZ(130px); } .js-spin-bwd .spinner-face.js-next { transform: rotateX(-90deg) translateZ(130px); } .js-spin-bwd .spinner-right .spinner-face.js-next { transform: rotateX(-270deg) translateZ(130px); } .js-active { transform: translateZ(130px); } } |
JS:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
let activeIndex = 0 let limit = 0 let disabled = false let $stage let $controls let canvas = false const SPIN_FORWARD_CLASS = 'js-spin-fwd' const SPIN_BACKWARD_CLASS = 'js-spin-bwd' const DISABLE_TRANSITIONS_CLASS = 'js-transitions-disabled' const SPIN_DUR = 1000 const appendControls = () => { $controls = $('.tabs3d-control').children() $controls.eq(activeIndex).addClass('active') } const setIndexes = () => { $('.spinner').children().each((i, el) => { if (i == 0) { $(el).addClass('js-active'); } $(el).attr('data-index', i) $('.tabs3d-control').append('<a style="background-color: ' + $(el).attr('data-bg') + '" href="#tab" data-index="' +i+ '">' + $(el).attr('data-menu') + '</a>'); limit++ }) } const duplicateSpinner = () => { const $el = $('.spinner').parent() const html = $('.spinner').parent().html() $el.append(html) $('.spinner').last().addClass('spinner-right') $('.spinner-right').removeClass('spinner-left') } const paintFaces = () => { $('.spinner-face').each((i, el) => { $(el).children().css('background', $(el).attr('data-bg')) }) } const prepareDom = () => { setIndexes() paintFaces() duplicateSpinner() appendControls() } const spin = (inc = 1) => { if (disabled) return if (!inc) return activeIndex += inc disabled = true if (activeIndex >= limit) { activeIndex = 0 } if (activeIndex < 0) { activeIndex = (limit - 1) } const $activeEls = $('.spinner-face.js-active') const $nextEls = $('.spinner-face[data-index=' + activeIndex + ']') $nextEls.addClass('js-next') if (inc > 0) { $stage.addClass(SPIN_FORWARD_CLASS) } else { $stage.addClass(SPIN_BACKWARD_CLASS) } $controls.removeClass('active') $controls.eq(activeIndex).addClass('active') setTimeout(() => { spinCallback(inc) }, SPIN_DUR, inc) } const spinCallback = (inc) => { $('.js-active').removeClass('js-active') $('.js-next').removeClass('js-next').addClass('js-active') $stage .addClass(DISABLE_TRANSITIONS_CLASS) .removeClass(SPIN_FORWARD_CLASS) .removeClass(SPIN_BACKWARD_CLASS) $('.js-active').each((i, el) => { const $el = $(el) $el.prependTo($el.parent()) }) setTimeout(() => { $stage.removeClass(DISABLE_TRANSITIONS_CLASS) disabled = false }, 100) } const attachListeners = () => { document.onkeyup = (e) => { switch (e.keyCode) { case 38: spin(-1) break case 40: spin(1) break } } $controls.on('click', (e) => { e.preventDefault() if (disabled) return const $el = $(e.target) const toIndex = parseInt($el.attr('data-index'), 10) spin(toIndex - activeIndex) }) } const assignEls = () => { $stage = $('.tabs3d-stage') } const init = () => { assignEls() prepareDom() attachListeners() } $(() => { init(); }); |
Где:
- Атрибут
data-bg- цвет фона вкладки и ее пункта меню. - Атрибут
data-menu- заголовок пункта меню - Предзагрузка картинок нужна для того, чтобы при смене вкладок, следующая фотография поворачивалась, а не появлялась после того, как будет загружена.
За основу взято решение, найденное на codepen.io у пользователя Paul Noble

Здравствуйте, скажите пожалуйста, а все слайдеры на вашей странице можно использовать на сайтах бесплатно, или нужно покупать лицензию?
С уважением,
Ольга
Если брать конкретно этот, то я ниже указал, где я взял идею, потом ее немного переделал и выложил.
Если речь идет, например, о [i]swiper[/i], то тут его варианты оформления, а сам плагин идет по их лицензии
Если возникнет необходимость вызова модального окна в правой части с текстом, то можно столкнуться с проблемой возникновения неиндефицированных кнопок навигации по табам. Это может быть вызвано наличием кнопки или ссылки с решеткой (#) для открытия модалок. Проблема решается в скрипте. Нужно изменить кусок кода с const setIndexes. Замените на это:
[code]
const setIndexes = () => {
let index = 0;
$('.spinner-face').each((i, el) => {
const dataMenu = $(el).attr('data-menu');
if (dataMenu) {
if (index === 0) {
$(el).addClass('js-active');
}
$(el).attr('data-index', index);
$('.tabs3d-control').append(`<a style="background-color: ${$(el).attr('data-bg')}" href="#tab" data-index="${index}">${dataMenu}</a>`);
index++;
}
});
limit = index;
};
[/code]
Здравствуйте, я пытаюсь сделать высоту больше в .spinner с 480px до 600px, но при эффекте прокрутки появляются полосы, где еще что то изменить, что бы все было ровно?
[i]translateZ(230px) [/i]и [i]translateZ(-230px)[/i] меняли?
Нет, не менял, а на какое значение надо или как рассчитать правильно?
А. понял, половина от высоты блока?
Привет, точно по инструкции делаю и ни чего не выходит. Может дело в картинках?
Крутая конечно вещица. Начал сейчас еще раз ее подделывать под себя. Есть мысли по фоткам как правильно сделать, если есть поделитесь пожалуйста.
В плане того что они несколько подрезаются при изменении размеров экрана.
Картинка так и задумывалась, как фоновая (с обрезкой)
Попробуйте вставить ее в левый блок не фоном, а тегом.
И по месту уже выравнять ее.
Например:
[code]<div class="content-left">
<div class="content-img">
<img src="senua.jpg">
</div>
<div class="content-title">
<div>Senua</div>
<p>Hellblade</p>
</div>
</div>[/code]
[code].content-img {
height: 100%;
display: flex;
align-items: center;
}
.content-img img {
width: 100%;
object-fit: contain;
}[/code]
Да спасибо тоже хороший вариант. Маленько с media запросами поиграл и тоже получилось.
Хотя очевидно это решение проще и лучше чем я намудрил)
Я так понимаю несколько таких штуковин на одной странице разместить не получиться?
Дублируется меню
Ну да, это скрипт переписывать нужно, чтобы проходил по каждому контейнеру с табами.
Возможно данный слайдер реализовать на WP через шорткод в элементор? если да, то есть какая либо инструкция как
то сделать?
На WP так то можно все, но с элементором я не работал 🙁
А как найти примерную инструкцию как вставить его на сайт, есть информация?
Ну а какие тут инструкции? Это вот запись WP, а нее вставлены HTML, JS и CSS коды. В итоге мы имеем такой статичный слайдер.
Если нужно вставить в шаблон, например, на главную, то вставляем эти коды в нужный шаблон.
Если нужна динамика, то тут уже на PHP выводим нужные данные и т.д.
Сложно ли обойтись без jQuery? Просто хочется тоже самое реализовать только без jQuery)
Глупый вопрос, однако при просмотре на мобильнике, или при попытки уменьшить размер браузера (или посмотреть через инспектора в любом другом разрешение, планшетное или телефонное), текст в правой колонке у меня переносится не по словам как положено, а побуквенно. как это можно исправить?
Попробуйте [url="http://shpargalkablog.ru/2013/02/word-wrap.html"]свойства переносов[/url]
Шикарно смотрится!! А насколько кроссбраузерно?
Do you have a youtube channel to teach
No, there are no video channels