Implementación de Componentes Vue con Element UI

1.1 Cabecera del sitio

<template>
  <el-container>
    <el-header>
      <el-row>
        <el-col :span="4">
          <img src="/assets/logos/company_logo.png" alt="Logo de la empresa"/>
        </el-col>
        <el-col :span="20" class="menu-column">
          <el-menu
            :default-active="currentPath"
            class="navigation-menu"
            mode="horizontal"
            @select="onMenuSelect"
            router
          >
            <el-menu-item index="/soluciones">Soluciones</el-menu-item>
            <el-menu-item index="/industrias">Industrias</el-menu-item>
            <el-sub-menu index="casos">
              <template #title>Centro de Casos</template>
              <el-menu-item index="/casos/referencia">Casos de Referencia</el-menu-item>
              <el-menu-item index="/casos/videos">Videos de Casos</el-menu-item>
            </el-sub-menu>
            <el-menu-item index="/recursos">Recursos</el-menu-item>
            <el-menu-item index="/eventos">Eventos</el-menu-item>
            <el-menu-item index="/marketplace">Marketplace</el-menu-item>
            <el-menu-item index="/nosotros">Acerca de</el-menu-item>
            <el-menu-item index="/inversores">Relaciones con Inversores</el-menu-item>
            <el-icon class="search-icon"><Search /></el-icon>
          </el-menu>
        </el-col>
      </el-row>
    </el-header>
  </el-container>
</template>

<style scoped>
.menu-column {
  width: 900px;
}
.search-icon {
  margin-top: 20px;
  color: #aaa;
}
</style>

1.2 Contenido principle

<template>
  <el-container>
    <el-main>
      <div class="main-content">
        <div class="section-header">Nuestras Soluciones</div>
        <div class="section-description">
          Con un enfoque central en sistemas ERP y soluciones empresariales, ofrecemos una amplia gama de productos
          complementarios que crean un ecosistema integrado para empresas manufactureras y de distribución.
        </div>
      </div>

      <div class="feature-section">
        <el-row>
          <el-text class="section-title">Impulsando el Futuro Digital de las Empresas</el-text>
        </el-row>
        <el-row class="feature-grid">
          <el-col :span="8" v-for="(feature, index) in features" :key="index">
            <div class="feature-card">
              <img :src="feature.image" :alt="feature.title"/>
              <h4>{{ feature.title }}</h4>
              <p>{{ feature.description }}</p>
            </div>
          </el-col>
        </el-row>
      </div>

      <div class="industries-section">
        <el-row>
          <el-text class="section-title">Experiencia Especializada por Industria</el-text>
        </el-row>
        <el-row class="industry-grid">
          <el-col :span="4" v-for="(industry, index) in industries" :key="index">
            <div class="industry-item">
              <img :src="industry.icon" :alt="industry.name"/>
              <p>{{ industry.name }}</p>
            </div>
          </el-col>
        </el-row>
        <el-row justify="center">
          <el-button type="primary" text>Ver todas las industrias</el-button>
        </el-row>
      </div>
    </el-main>
  </el-container>
</template>

<script setup>
const features = [
  {
    image: '/assets/images/features/erp.png',
    title: 'Sistemas ERP',
    description: 'Solución integral para gestión empresarial'
  },
  // más características...
];

const industries = [
  { icon: '/assets/images/industries/manufacturing.png', name: 'Manufactura' },
  { icon: '/assets/images/industries/retail.png', name: 'Comercio Minorista' },
  // más industrias...
];
</script>

<style scoped>
.main-content {
  padding: 120px 20px 40px;
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  color: white;
}

.section-header {
  font-size: 2rem;
  font-weight: 600;
  margin-bottom: 20px;
}

.feature-section {
  padding: 60px 20px;
  background: #f8f9fa;
}

.industry-grid {
  max-width: 1200px;
  margin: 40px auto;
}

.industry-item {
  text-align: center;
  padding: 20px;
}

.industry-item img {
  width: 60px;
  height: 60px;
  margin-bottom: 10px;
}

.industry-item p {
  font-size: 14px;
  margin: 0;
}
</style>

1.3 Pie de página

<template>
  <el-footer class="site-footer">
    <div class="footer-actions">
      <div class="action-items">
        <div class="action-item">
          <img src="/assets/icons/solutions.svg" alt="Soluciones"/>
          <span>Soluciones</span>
        </div>
        <div class="action-item">
          <img src="/assets/icons/demo.svg" alt="Demostración"/>
          <span>Agendar Demo</span>
        </div>
        <div class="action-item">
          <img src="/assets/icons/pricing.svg" alt="Precios"/>
          <span>Consultar Precios</span>
        </div>
      </div>
    </div>

    <div class="footer-links">
      <div class="link-column" v-for="(column, index) in footerColumns" :key="index">
        <h4>{{ column.title }}</h4>
        <ul>
          <li v-for="(link, linkIndex) in column.links" :key="linkIndex">
            <a :href="link.url">{{ link.text }}</a>
          </li>
        </ul>
      </div>

      <div class="contact-section">
        <h4>Contáctenos</h4>
        <div class="social-media">
          <img src="/assets/social/wechat.png" alt="WeChat"/>
          <img src="/assets/social/weibo.png" alt="Weibo"/>
        </div>
        <div class="phone-info">
          <p>Línea de Atención</p>
          <strong>400-888-9999</strong>
          <a href="/contact" class="contact-button">Formulario de Contacto</a>
        </div>
      </div>
    </div>

    <div class="footer-bottom">
      <div class="social-icons">
        <img src="/assets/social/twitter.png" alt="Twitter"/>
        <img src="/assets/social/linkedin.png" alt="LinkedIn"/>
        <img src="/assets/social/facebook.png" alt="Facebook"/>
      </div>
      <div class="footer-nav">
        <ul>
          <li v-for="item in footerNavItems" :key="item">
            <a href="#">{{ item }}</a>
          </li>
        </ul>
        <el-select v-model="selectedLanguage" placeholder="Idioma" size="small">
          <el-option
            v-for="lang in languages"
            :key="lang.value"
            :label="lang.label"
            :value="lang.value"
          />
        </el-select>
      </div>
    </div>
  </el-footer>
</template>

<script setup>
import { ref } from 'vue';

const selectedLanguage = ref('es');

const languages = [
  { value: 'es', label: 'Español' },
  { value: 'en', label: 'English' },
  { value: 'zh', label: '中文' }
];

const footerColumns = [
  {
    title: 'Recursos',
    links: [
      { text: 'Guías', url: '/guides' },
      { text: 'Documentación', url: '/docs' },
      { text: 'Blog', url: '/blog' }
    ]
  },
  {
    title: 'Soporte',
    links: [
      { text: 'Centro de Ayuda', url: '/help' },
      { text: 'Foros', url: '/forums' },
      { text: 'Contacto', url: '/contact' }
    ]
  }
];

const footerNavItems = ['Privacidad', 'Términos', 'Mapa del Sitio', 'Accesibilidad'];
</script>

<style scoped>
.site-footer {
  background: #2c3e50;
  color: white;
  padding: 40px 20px;
}

.footer-actions {
  max-width: 800px;
  margin: 0 auto 40px;
}

.action-items {
  display: flex;
  justify-content: space-around;
}

.action-item {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
}

.footer-links {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 40px;
  max-width: 1200px;
  margin: 0 auto;
  padding: 40px 0;
  border-top: 1px solid rgba(255, 255, 255, 0.1);
  border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}

.contact-button {
  display: block;
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  color: white;
  padding: 10px 20px;
  border-radius: 4px;
  text-align: center;
  margin-top: 15px;
  text-decoration: none;
}

.footer-bottom {
  display: flex;
  justify-content: space-between;
  align-items: center;
  max-width: 1200px;
  margin: 20px auto 0;
}

.footer-nav ul {
  display: flex;
  gap: 20px;
  list-style: none;
  padding: 0;
  margin: 0;
}

.footer-nav a {
  color: rgba(255, 255, 255, 0.7);
  text-decoration: none;
}
</style>
  1. Referencia de propiedades CSS

2.1 Propiedades de borde

/* Estilos de borde */
.elemento {
  border-style: dashed;
  border-width: 3px;
  border-color: #3498db;
  border-radius: 10px;
  border-top: 2px solid #2ecc71;
  border-right: 4px dotted #e74c3c;
}

2.2 Propiedades de fondo

/* Fondos y gradientes */
.fondo-gradiente {
  background-color: #f1c40f;
  background-image: url('/assets/patterns/bg-pattern.png');
  background-repeat: repeat-x;
  background-position: center top;
  background-size: cover;
  background-attachment: fixed;
}

/* Propiedad abreviada */
.fondo-completo {
  background: #ecf0f1 url('/assets/images/bg.jpg') no-repeat center/contain;
}

2.3 Modelado de dimensiones

/* Dimensiones flexibles */
.contenedor {
  width: 80vw;
  height: 50vh;
  min-width: 300px;
  max-width: 1200px;
}

.columna {
  width: calc(50% - 20px);
  height: fit-content;
  padding: 15px;
}

/* Unidades relativas */
.item {
  width: 15rem;
  margin: 2em auto;
}

2.4 Espaciado y márgenes

/* Espaciado consistente */
.seccion {
  margin: 20px auto;
  padding: 30px 25px;
}

.tarjeta {
  margin-top: 15px;
  margin-right: 10px;
  margin-bottom: 15px;
  margin-left: 10px;
  padding: 20px;
}

2.5 Tipografía

/* Estilos de texto */
.titulo-principal {
  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
  font-size: 2.5rem;
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.02em;
  text-align: center;
  text-transform: uppercase;
}

.parrafo {
  color: #333;
  font-size: 1rem;
  line-height: 1.6;
  word-spacing: 0.1em;
}

.enlace {
  text-decoration: none;
  color: #2980b9;
  transition: color 0.3s ease;
}

2.6 Colores y valores

/* Diferentes formatos de color */
.elemento-rojo {
  color: #e74c3c;
  background-color: rgba(231, 76, 60, 0.2);
  border: 1px solid hsl(6, 78%, 57%);
}

.elemento-azul {
  color: rgb(41, 128, 185);
  background-color: hsla(204, 70%, 53%, 0.3);
}

Etiquetas: Vue3 element-ui CSS3 frontend-development web-development

Publicado el 6-22 19:20