6
respostas

Duvidas sobre a Responsividade do Bootstrap no Vue

Pessoal estou fazendo o curso de vue e decidi fazer o curso de bootstrap 4 aqui da Alura também, aprendi a fazer um site todo responsivo e decidi usar Vue, importei o bootstrap do jeito que o professor explicou só que a unica aplicacao do bootstrap que não estão funcionando é o grid, sabe aquele col-12 e etc? Quando eu uso esse mesmo site com bootstrap fora do Vue ele funciona responsivo normalmente... Alguém sabe como me ajudar?

6 respostas

Bom dia, Matheus! Tudo bom?

Como você fez a importação do Bootstrap? Está usando o Bootstrap normal ou o Bootstrap-Vue?

Pode me mandar o trecho do código de importação e o que não está funcionando?

Abraços

Oi Juliana, Bom dia!

Estou importando apenas o Bootstrap mesmo, o que não está funcionando é a responsividade do site. Vou mandar o código:

Main.js =

import Vue from 'vue'
import App from './App.vue'

import 'bootstrap';
import 'bootstrap/dist/css/bootstrap.css';

new Vue({
  el: '#app',
  render: h => h(App)
})

Eu dividi o site em componentes:

Home.vue =

<template>
    <div>
        <header>
          <home-navbar></home-navbar>
        </header>
        <main>
          <home-carousel></home-carousel>
          <cards></cards>
        </main>
        <home-modal></home-modal>
        <home-footer></home-footer>
    </div>
</template>




<script>
import Navbar from '../shared/navbar/Navbar.vue';
import Carousel from '../shared/carousel/Carousel.vue';
import Cards from '../shared/cards/Cards.vue';
import Modal from '../shared/modal/Modal.vue';
import Footer from '../shared/footer/Footer.vue';

export default {

  components: {

    'home-navbar': Navbar,
    'home-carousel': Carousel,
    'cards': Cards,
    'home-modal': Modal,
    'home-footer': Footer
  },

  name: 'app'
}
</script>




<style>

.fonte-titulo{

    font-family: 'Pacifico', cursive;
}
.cor-especial{

    color: darkred;
}

.botao-cor-especial{

    color: white;
    background-color: darkred;
}

.texto-cor-especial{

    color: darkred
}

.borda-cor-especial{

    border-color: darkred;
}
</style>

App.vue =

<template>
  <div id="app">
    <LoadingScreen :isLoading="isLoading" />
    <div v-if="!isLoading">
      <home></home>
    </div>
  </div>
</template>




<script>
import Home from './components/home/Home.vue';
import LoadingScreen from "./components/LoadingScreen.vue";

export default {

  components: {
    'home': Home,
    LoadingScreen
  },

  name: 'app',

  data() {
    return { isLoading: true };
  },

  mounted() {
    setTimeout(() => {
      this.isLoading = false;
    }, 5000);
  }

}
</script>




<style>
</style>

webpack.config.js =

var path = require('path')
var webpack = require('webpack')

module.exports = {
  entry: './src/main.js',
  output: {
    path: path.resolve(__dirname, './dist'),
    publicPath: '/dist/',
    filename: 'build.js'
  },
  module: {
    rules: [
            {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: {
          loaders: {
          }
        }
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/
      },
      {
        test: /\.(png|jpg|gif|svg)$/,
        loader: 'file-loader',
        options: {
          name: '[name].[ext]?[hash]'
        }
      },
      {
        test: /\.css$/, loader: 'style-loader!css-loader'
      },
      { test: /\.(woff|woff2)(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?limit=10000&mimetype=application/font-woff' },
      { test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?limit=10000&mimetype=application/octet-stream' },
      { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: 'file-loader' },
      { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?limit=10000&mimetype=image/svg+xml' }
    ]
  },
  resolve: {
    alias: {
      'vue$': 'vue/dist/vue.esm.js'
    },
    extensions: ['*', '.js', '.vue', '.json']
  },
  devServer: {
    historyApiFallback: true,
    noInfo: true,
    overlay: true
  },
  performance: {
    hints: false
  },
  devtool: '#eval-source-map'
}

if (process.env.NODE_ENV === 'production') {
  module.exports.devtool = '#source-map'
  // http://vue-loader.vuejs.org/en/workflow/production.html
  module.exports.plugins = (module.exports.plugins || []).concat([
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: '"production"'
      }
    }),
    new webpack.optimize.UglifyJsPlugin({
      sourceMap: true,
      compress: {
        warnings: false
      }
    }),
    new webpack.LoaderOptionsPlugin({
      minimize: true
    })
  ])
}

Oque deveria funcionar e que não está funcionando é a responsividade, todos os meus componentes tem grids para responsividade do bootstrap mas quando junto tudo no vue ele não funciona. Se você puder me ajudar agradeço de coração!

Segue os outros componentes:

Cards.vue =

<template>
<div>
    <section class="titulo">
        <h2 class="text-center fonte-titulo cor-especial pt-4">Receitas para economizar e ganhar saúde</h2>
        <p class="text-center text-secondary pb-4">Nossas receitas ajudam você a aproveitar melhor os alimentos, economizar, ganhar tempo e praticidade</p>
    </section>
    <section class="container-fluid bg-light">
        <div class="row justify-content-center">

            <article class="card borda-cor-especial card-largura p-0 m-4 col-sm-12 col-xs-12 col-md-4">
            <img src="../../../static/receita-abacate.jpg" class="card-img-top card-posicao-imagem" alt="tigela com salada de abacate, vista superior">
            <div class="card-body">
                <h5 class="card-title">Tigela de Abacate</h5>
                <p class="card-text">Receita refrescante e cheia de vitaminas para o seu café da manhã!</p>
                <a href="#" class="btn botao-cor-especial">Veja a receita</a>
            </div>
            </article>

            <article class="card borda-cor-especial card-largura p-0 m-4 col-sm-12 col-xs-12 col-md-4">
            <img src="../../../static/receita-kiwi.jpg" alt="tigela de mingau com kiwi, vista superior" class="card-img-top card-posicao-imagem">
            <div class="card-body">
                <h5 class="card-title">Salada de kiwi</h5>
                <p class="card-text">Receita refrescante e cheia de vitaminas para o seu café da manhã!</p>
                <a href="#" class="btn botao-cor-especial">Veja a receita</a>
            </div>
            </article>

            <article class="card borda-cor-especial card-largura p-0 m-4 col-sm-12 col-xs-12 col-md-4">
            <img src="../../../static/receita-mix.jpg" alt="prato com mix de vegetais e mão de pessoa adicionando azeite, vista superior" class="card-img-top card-posicao-imagem">
            <div class="card-body">
                <h5 class="card-title">Mix de vegetais</h5>
                <p class="card-text">Receita refrescante e cheia de vitaminas para o seu café da manhã!</p>
                <a href="#" class="btn botao-cor-especial">Veja a receita</a>
            </div>
            </article>

            <article class="card borda-cor-especial card-largura p-0 m-4 col-sm-12 col-xs-12 col-md-4">
            <img src="../../../static/receita-pimentoes.jpg" alt="prato de salada de pimentões com alguns ingredientes ao lado, vista superior"
                class="card-img-top card-posicao-imagem">
            <div class="card-body">
                <h5 class="card-title">Pimentões à Juliana</h5>
                <p class="card-text">Receita refrescante e cheia de vitaminas para o seu café da manhã!</p>
                <a href="#" class="btn botao-cor-especial">Veja a receita</a>
            </div>
            </article>
        </div>
    </section>
    </div>
    </template>

    <style>
    .card-posicao-imagem{

    object-fit: cover;
    height: 12.5em;
    }

    .card-largura{

    max-width: 18rem;
    }
    </style>

Carousel.vue =

<template>
<section class="carrossel">
      <div id="carouselExampleCaptions" class="carousel slide" data-interval="3000" data-ride="carousel">
        <ol class="carousel-indicators">
          <li data-target="#carouselExampleCaptions" data-slide-to="0" class="active"></li>
          <li data-target="#carouselExampleCaptions" data-slide-to="1"></li>
        </ol>
        <div class="carousel-inner">
          <div class="carousel-item active">
            <img src="../../../static/carrossel-img1.jpg" class="d-block w-100 imagem-carrossel-1" alt="...">
            <div class="carousel-caption d-none d-md-block h-50">
              <h1 class="fonte-titulo display-4">Reaproveite melhor os alimentos!</h1>
            </div>
          </div>
          <div class="carousel-item">
            <img src="../../../static/carrossel-img2.jpg" class="d-block w-100 imagem-carrossel-2" alt="...">
            <div class="carousel-caption d-none d-md-block h-50">
              <h1 class="fonte-titulo display-4">Economize e ganhe em saúde!</h1>
            </div>
          </div>
        </div>
        <a class="carousel-control-prev" href="#carouselExampleCaptions" role="button" data-slide="prev">
          <span class="carousel-control-prev-icon" aria-hidden="true"></span>
          <span class="sr-only">Previous</span>
        </a>
        <a class="carousel-control-next" href="#carouselExampleCaptions" role="button" data-slide="next">
          <span class="carousel-control-next-icon" aria-hidden="true"></span>
          <span class="sr-only">Next</span>
        </a>
      </div>
</section>
</template>

<style>
.imagem-carrossel-1, .imagem-carrossel-2{

    object-fit: cover;
    height: 25em;
}

.imagem-carrossel-1{

    object-position: 0 80%;
}
</style>

Footer.vue

<template>
<footer class = "bg-secondary p-3">
    <p class = "text-light m-0 text-center">Contato: 
      <a href="mailto:email@frutafruto.com.br" class = "text-light">email@frutafruto.com.br</a>
    </p>
</footer>
</template>

Modal.vue =

<template>
<div class="modal fade" id="modalContato" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
    <div class="modal-dialog" role="document">
      <dialog class="modal-content">
        <header class="modal-header">
          <h5 class="modal-title" id="exampleModalLabel">Entre em contato</h5>
          <button type="button" class="close" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true">&times;</span>
          </button>
        </header>
        <main class="modal-body">
          <form>
            <div class="form-group">
              <label for="formGroupExampleInput">Nome</label>
              <input type="text" class="form-control" placeholder="Insira seu nome completo" id="formGroupExampleInput">
            </div>
            <div class="form-group">
              <label for="exampleFormControlInput1">Endereço de Email</label>
              <input type="email" class="form-control" id="exampleFormControlInput1" placeholder="nome@exemplo.com">
            </div>
            <div class="form-group">
              <label for="exampleFormControlTextarea1">Deixe seu comentário</label>
              <textarea class="form-control" id="exampleFormControlTextarea1" rows="3" placeholder="Insira seu comentário"></textarea>
            </div>
          </form>
        </main>
        <footer class="modal-footer">
          <button type="button" class="btn btn-secondary" data-dismiss="modal">Fechar</button>
          <button type="button" class="btn botao-cor-especial borda-cor-especial">Enviar</button>
        </footer>
      </dialog>
      </div>
    </div>
</template>

Navbar.vue =

<template>
<nav class="navbar navbar-expand-lg navbar-light bg-light fixed-top">
      <a class="navbar-brand fonte-titulo texto-cor-especial" id="cor-titulo" href="#">Fruta & Fruto</a>
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false"
        aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
      </button>
      <div class="collapse navbar-collapse justify-content-end" id="navbarNav">
        <ul class="navbar-nav">
          <li class="nav-item active">
            <a class="nav-link" href="#">
              <span class="sr-only">Início</span>
            </a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#">Receitas</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#">Quem somos</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" data-toggle="modal" data-target="#modalContato" href="#">Contato</a>
          </li>
        </ul>
      </div>
</nav>
</template>
<style>
#cor-titulo {
    color: #8D0606;
  }
</style>

LoadingScreen.vue =

<template>
  <div :class="{ loader: true, fadeout: !isLoading }">
    <div class="spinner-border" role="status">
        <span class="sr-only">Loading...</span>
    </div>
  </div>
</template>

<script>
export default {
  name: "LoadingScreen",
  props: ["isLoading"]
};
</script>

<style>
.loader {
  background-color: #63ab97;
  bottom: 0;
  color: white;
  display: block;
  font-size: 32px;
  left: 0;
  overflow: hidden;
  padding-top: 10vh;
  position: fixed;
  right: 0;
  text-align: center;
  top: 0;
}

.fadeout {
  animation: fadeout 2s forwards;
}

@keyframes fadeout {
  to {
    opacity: 0;
    visibility: hidden;
  }
}
</style>

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software