<div class="skills-container">
<div class="skills-demo">
<div class="skills-header">
<h2>Habilidades Profesionales</h2>
<p>Mi experiencia y conocimientos</p>
</div>
<div class="skills-list">
<div class="skill-item">
<div class="skill-info">
<span class="skill-name">Desarrollo Web</span>
<span class="skill-percent" data-percent="95">95%</span>
</div>
<div class="skill-bar">
<div class="skill-progress" data-percent="95"></div>
</div>
</div>
<div class="skill-item">
<div class="skill-info">
<span class="skill-name">Diseño UI/UX</span>
<span class="skill-percent" data-percent="85">85%</span>
</div>
<div class="skill-bar">
<div class="skill-progress" data-percent="85"></div>
</div>
</div>
<div class="skill-item">
<div class="skill-info">
<span class="skill-name">JavaScript</span>
<span class="skill-percent" data-percent="90">90%</span>
</div>
<div class="skill-bar">
<div class="skill-progress" data-percent="90"></div>
</div>
</div>
<div class="skill-item">
<div class="skill-info">
<span class="skill-name">React</span>
<span class="skill-percent" data-percent="80">80%</span>
</div>
<div class="skill-bar">
<div class="skill-progress" data-percent="80"></div>
</div>
</div>
<div class="skill-item">
<div class="skill-info">
<span class="skill-name">Node.js</span>
<span class="skill-percent" data-percent="75">75%</span>
</div>
<div class="skill-bar">
<div class="skill-progress" data-percent="75"></div>
</div>
</div>
</div>
</div>
</div>
.skills-container {
background: linear-gradient(135deg, #f8f9ff 0%, #ffffff 100%);
padding: 40px 20px;
border-radius: 20px;
max-width: 700px;
margin: 0 auto;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.05);
}
.skills-demo {
background: white;
border-radius: 15px;
padding: 30px;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.03);
}
.skills-header {
text-align: center;
margin-bottom: 30px;
}
.skills-header h2 {
margin: 0 0 10px 0;
color: #333;
font-size: 2rem;
font-weight: 700;
}
.skills-header p {
color: #666;
font-size: 1.1rem;
margin: 0;
}
.skills-list {
display: flex;
flex-direction: column;
gap: 25px;
}
.skill-item {
animation: slideInUp 0.6s ease-out;
}
.skill-item:nth-child(1) { animation-delay: 0.1s; }
.skill-item:nth-child(2) { animation-delay: 0.2s; }
.skill-item:nth-child(3) { animation-delay: 0.3s; }
.skill-item:nth-child(4) { animation-delay: 0.4s; }
.skill-item:nth-child(5) { animation-delay: 0.5s; }
.skill-info {
display: flex;
justify-content: space-between;
margin-bottom: 10px;
}
.skill-name {
font-weight: 600;
color: #333;
font-size: 1.1rem;
}
.skill-percent {
font-weight: 700;
color: #667eea;
font-size: 1.1rem;
}
.skill-bar {
height: 12px;
background: #e2e8f0;
border-radius: 6px;
overflow: hidden;
position: relative;
}
.skill-progress {
height: 100%;
background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);
border-radius: 6px;
width: 0%;
transition: width 2s cubic-bezier(0.22, 0.61, 0.36, 1);
position: relative;
}
.skill-progress::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(
90deg,
transparent,
rgba(255, 255, 255, 0.3),
transparent
);
animation: shimmer 2s infinite;
}
/* Animaciones */
@keyframes slideInUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes shimmer {
0% {
transform: translateX(-100%);
}
100% {
transform: translateX(100%);
}
}
/* Responsivo */
@media (max-width: 768px) {
.skills-container {
padding: 30px 15px;
}
.skills-demo {
padding: 20px;
}
.skills-header h2 {
font-size: 1.7rem;
}
.skill-info {
flex-direction: column;
gap: 5px;
}
.skill-percent {
text-align: right;
}
}
document.addEventListener('DOMContentLoaded', function() {
// Obtener todos los elementos de progreso de habilidades
const skillProgresses = document.querySelectorAll('.skill-progress');
// Función para animar las barras de habilidades
function animateSkillBars() {
skillProgresses.forEach(progress => {
const percent = progress.getAttribute('data-percent');
progress.style.width = `${percent}%`;
});
}
// Función para animar los números de porcentaje
function animatePercentages() {
const percentElements = document.querySelectorAll('.skill-percent');
percentElements.forEach(element => {
const targetPercent = parseInt(element.getAttribute('data-percent'));
let currentPercent = 0;
const duration = 2000; // 2 segundos
const increment = targetPercent / (duration / 16);
const interval = setInterval(() => {
currentPercent += increment;
if (currentPercent >= targetPercent) {
currentPercent = targetPercent;
clearInterval(interval);
}
element.textContent = Math.round(currentPercent) + '%';
}, 16);
});
}
// Inicializar animaciones
animateSkillBars();
animatePercentages();
// Reanimar cuando el elemento entra en la vista
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
// Restablecer anchos
skillProgresses.forEach(progress => {
progress.style.width = '0%';
});
// Reanimar
setTimeout(() => {
animateSkillBars();
animatePercentages();
}, 100);
// Dejar de observar después de la primera animación
observer.unobserve(entry.target);
}
});
}, { threshold: 0.5 });
// Observar el contenedor de habilidades
const skillsContainer = document.querySelector('.skills-container');
if (skillsContainer) {
observer.observe(skillsContainer);
}
});