tldr: мы собираемся добавить стрелки вправо и влево в модуль вкладок divi, чтобы придать ему функциональность типа ползунка.

Шаг 1

Создайте модуль разделяемых вкладок, как вы обычно это делаете, из Backend или Front end Visual Builder.

Заполните содержимое заполнителя, как показано выше.

Шаг 2

Добавьте класс, который будет специфичен для нашего настраиваемого слайдера вкладок, именно так мы собираемся применять пользовательские стили и функциональные возможности слайдера.

Добавьте имя класса «custom_tabs_slider» в модуль вкладок, как показано ниже.

Шаг 3

Добавьте пользовательский CSS для ползунка вкладок, скопируйте приведенный ниже код и вставьте его в
Divi-> Параметры темы -> Пользовательский CSS.

Примечание: используйте изображения, которые у вас есть, я использовал те, которые у меня есть локально, поэтому они будут отображаться как неработающие, поэтому обязательно поменяйте URL-адреса изображений.

/* Custom Tabs Slider*/
.custom_tabs_slider .et_pb_tab_content {
color : #fff !important
}
.avenir {
font-family:Avenir, Arial,Helvetica;
}
.custom_tabs_slider li.et_pb_tab_0:before {
background-image: url(http://sfsolutions.staging/wp-content/uploads/2022/10/Step-1_Expense_Review_LightBulb_Icon.png);
}
.custom_tabs_slider li.et_pb_tab_1:before {
background-image: url(http://sfsolutions.staging/wp-content/uploads/2022/10/Step-2_NegotiateProcess_SpeechBubble_Icon.png);
}
.custom_tabs_slider li.et_pb_tab_2:before {
background-image: url(http://sfsolutions.staging/wp-content/uploads/2022/10/Step-3_SavingsDelivered_Icon.png);
}
.custom_tabs_slider .et_pb_tabs_controls li.et_pb_tab_active:before {
opacity:1
}
.custom_tabs_slider .et_pb_tab_content {
max-width: 800px;
margin: 0 auto;
}
.custom_tabs_slider .et_pb_all_tabs{
margin-top:120px;
}
.custom_tabs_slider .et_pb_tabs_controls li:before {
content: "";
opacity:0.5;
position: absolute;
width: 50px;
height: 50px;
top: -55px;
left: 0;
z-index: 999999;
background-size: cover;
background-repeat: no-repeat;
background-position:center;
right: 0;
margin: 0 auto;
}
.custom_tabs_slider .et_pb_tabs_controls li {
border-right: none;
font-size: 30px;
font-family: Avenir,Arial,Helvetica;
border-bottom: 5px solid transparent;
padding-bottom: 10px;
}
.custom_tabs_slider .et_pb_tabs_controls li.et_pb_tab_active a {
color: #ffffff!important;
}
.custom_tabs_slider li.et_pb_tab_active {
border-bottom: 5px solid #79C5D7;
padding-bottom: 10px;
}
.custom_tabs_slider .et-pb-active-slide {
animation: fade 1s ease-in;
}
@keyframes fade {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.custom_tabs_slider .custom_tabs_slider .et_pb_tabs_controls li a {
color: #ffffff75;
}
.custom_tabs_slider .et_pb_tab_content * {
color:#fff !important;
}
.custom_tabs_slider .et_pb_tabs_controls {
max-width: 1050px;
margin: 0 auto;
background-color: transparent !important;
color: #fff !important;
display: flex;
align-items: center;
justify-content: center;
}
.w-full {
width:100%;
}
.howitworks_arrows {
z-index:9999 !important;
position: absolute;
width: 100%;
top: 50%;
max-width: 923px;
margin: 0 auto;
bottom:50%;
left: 0;
right: 0;
align-items: center;
color: #fff !important;
font-size: 20px;
display:flex !important;
justify-content:space-between;
}
.prev img , .next img {
width:20px;
cursor:pointer;
opacity:0.8;
}
.prev img:hover , .next img:hover {
opacity:1;
}
.prev img {
rotate: 180deg;
}

После вставки пользовательского css модуль вкладок должен выглядеть примерно так

Шаг 4

Теперь наступает фактический шаг функциональности слайдера, для того, чтобы этот шаг работал, нам нужно добавить некоторый код javascript в нашу тему, и я использовал плагин Custom Css and Js, установите плагин и добавьте через него приведенный ниже код js, вы можете использовать любой другой плагин, который вам нравится.

Примечание. Убедитесь, что вы добавляете код в нижний колонтитул страницы, а не в заголовок.

// adding arrow elements in tab content section
jQuery('.custom_tabs_slider .et_pb_all_tabs').append(`
<div class="howitworks_arrows et-pb-active-slide" style="z-index: 1; display: block; opacity: 1;">
<div class="prev"><img src="http://sfsolutions.staging/wp-content/uploads/2022/10/slider-arrow.svg"></div>
<div class="next"><img src="http://sfsolutions.staging/wp-content/uploads/2022/10/slider-arrow.svg"></div>
</div>`)
// adding arrow elements in tab content section
const tab = document.querySelectorAll(".custom_tabs_slider .et_pb_tabs_controls li");
const content = document.querySelectorAll(".custom_tabs_slider .et_pb_all_tabs > .et_pb_tab");
const forward = document.querySelector('.next');
const previous = document.querySelector('.prev');
const numOfTabs = tab.length-1;
// initialize tab items with index data
function seedIndexData(){
let i = 0
tab.forEach(item=> {
item.setAttribute('data-index',i)
i++
})
}
seedIndexData()
// initialize tab items with index data
// function to return current enabled tab item
function returnEnabledIndex() {
let index;
tab.forEach((item) => {
item.classList.contains("et_pb_tab_active") ? (index = item) : "";
});
return index;
}
// function to return current enabled tab item
// function for clicking next button in tab section
function nextItem(){
let moveTo = returnEnabledIndex().dataset.index;
let i = 0 ;
tab.forEach(item=> {
if(i==parseInt(moveTo)+1 && moveTo <numOfTabs){
item.classList.add('et_pb_tab_active')
}
else if(moveTo>=numOfTabs) {
return
}
else {
item.classList.remove('et_pb_tab_active')
}
i++
})
let j=0
content.forEach(item=> {
if(j==parseInt(moveTo)+1 && moveTo <numOfTabs) {
item.classList.add('et-pb-active-slide')
item.style.display="block"
item.style.opacity="1"
}
else if(moveTo>=numOfTabs) {
return
}
else {
item.classList.remove('et-pb-active-slide')
item.classList.remove('et_pb_active_content')
item.style.display="none"
item.style.opacity="0"
}
j++
})
}
// function for clicking previous button in tab section
function prevItem(){
let moveTo = returnEnabledIndex().dataset.index;
let i = 0;
tab.forEach(item=> {
if(i==parseInt(moveTo)-1){
item.classList.add('et_pb_tab_active')
}
else if(moveTo<=0) {
return
}
else {
item.classList.remove('et_pb_tab_active')
}
i += 1
})
let j=0
content.forEach(item=> {
if(j==parseInt(moveTo)-1) {
item.classList.add('et-pb-active-slide')
item.style.display="block"
item.style.opacity="1"
}
else if(moveTo<=0) {
return
}
else {
item.classList.remove('et-pb-active-slide')
item.style.display="none"
item.style.opacity="0"
}
j++
})
}
// add event listeners for previous and next buttons
forward.addEventListener('click',()=>nextItem())
previous.addEventListener('click',()=>prevItem())
// add event listeners for previous and next buttons
// selecting correct tab when user change tabs by clicking tab instead of arrows
let index=0
function returnClickedIndex(ind) {
index =  ind
return index
}
tab.forEach(item=>{
item.addEventListener('click',(e)=> {returnClickedIndex(item.dataset.index)
content.forEach(item=> {
item.classList.remove('et-pb-active-slide')
item.classList.remove('et_pb_active_content')
item.style.display="none"
item.style.opacity="0"
})
})
})
// selecting correct tab when user change tabs by clicking tab instead of arrows

Заключение

После выполнения всех шагов ваш слайдер должен выглядеть и функционировать, как показано ниже.

Я мог бы использовать плагин слайдера, но хотел бы попробовать сделать это без него, надеюсь, это поможет, если вы пытаетесь сделать что-то подобное.