у вас разные проблемы: использование абсолютной позиции для скрытых элементов всегда вызовет проблемы с отображением. Я предлагаю использовать родительский div с глобальным размером (и цветом), и каждая вкладка внутри находится в одной и той же абсолютной позиции внутри.
Ваш вопрос неясен, и я полагаю, вы ожидаете ожидания окончания постепенного исчезновения, прежде чем начинать постепенное появление на следующей вкладке. поэтому вам нужно использовать событие transitionend для обнаружения финиша затухания sh
Я также предлагаю использовать делегирование событий для всех кнопок вкладок с помощью атрибута информации о данных, что делает код html больше надежный и менее JS код
, поэтому этот код: (с переходом = одна секунда для тестирования)
const tabButtons = document.querySelector('div.tab')
, buttonTabs = document.querySelectorAll('div.tab > button.tablink')
, tabData = [...document.querySelectorAll('div.svc')].reduce((res,eTab)=>
{
res.push( { id:eTab.id, disp:eTab.classList.contains('display-yes'), elm: eTab} )
return res
},[])
tabButtons.onclick =e=>
{
if (!e.target.matches('button.tablink')) return // ignore others clicks outsides
let currentTab = tabData.find(tb=>tb.disp)
, newTab = tabData.find(tb=>tb.id===e.target.dataset.tabId)
if (newTab.id != currentTab.id )
{
currentTab.elm.addEventListener('transitionend',setNewTab)
currentTab.elm.classList.remove('display-yes')
currentTab.disp = false
buttonTabs.forEach(bt=>bt.classList.remove('active'))
e.target.classList.add('active')
}
function setNewTab()
{
currentTab.elm.removeEventListener('transitionend',setNewTab)
newTab.elm.classList.add('display-yes')
newTab.disp = true
}
}
#all-svc {
position:relative;
width:500px;
height:200px;
background-color:#00488ab5;
margin-top: 1em;
}
.svc{
opacity:0;
transition: opacity 1s;
position:absolute;
top: 0;
left:0;
padding: 0 0.5em;
}
.display-yes{
opacity:1;
}
.tablink{
background-color:#0000ffb5;
}
.active{
background-color:#ff0000b5;
}
<div class="tab">
<button class="tablink active" data-tab-id="dev"> Desenvolvimento de software </button>
<button class="tablink" data-tab-id="it"> Infraestruturas IT </button>
<button class="tablink" data-tab-id="design"> UX / UI Design </button>
<button class="tablink" data-tab-id="consult"> Consultoria </button>
</div>
<div id="all-svc">
<div id="dev" class="svc display-yes">
<p>lorem ipsum 1</p>
</div>
<div id="it" class="svc">
<p>lorem ipsum 2 lorem ipsum 2</p>
</div>
<div id="design" class="svc">
<p>lorem ipsum 3 ipsum 3 lorem 3</p>
</div>
<div id="consult" class="svc">
<p>lorem ipsum 4 lorem ipsum ipsum ipsum 4</p>
</div>
</div>
<div style="width:500px; height:200px; background-color:#c2c2c2;">
<p>
lorem ipsum lorem ipsum
</p>
</div>