【问题标题】:Place card container over other containers Vuetify VueJs将卡片容器放在其他容器上 Vuetify VueJs
【发布时间】:2018-12-24 22:07:30
【问题描述】:

我有这个codePen:https://codepen.io/anon/pen/KBzERJ

如果您向下滚动,您可以看到卡片。我需要这张卡片出现在红色容器上方。所以红色容器填满了屏幕,浮动卡片在红色容器上方的屏幕中间。

new Vue({
  el: '#app',
  data: () => ({
    drawer: null
  }),

  props: {
    source: String
  }
})
<link rel="stylesheet prefetch" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Material+Icons">
<link rel="stylesheet prefetch" href="https://unpkg.com/vuetify/dist/vuetify.min.css">
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vuetify/dist/vuetify.min.js"></script>
<div id="app">
  <v-app id="inspire">
    <v-content>
      <v-container style="background:red" fill-height> </v-container>
      <v-container fluid fill-height>
        <v-layout align-center justify-center>
          <v-flex xs12 sm8 md4>
            <v-card class="elevation-12">
              <v-toolbar dark color="primary">
                <v-toolbar-title>Login form</v-toolbar-title>
                <v-spacer></v-spacer>
                <v-tooltip bottom>
                  <v-btn icon large :href="source" target="_blank" slot="activator">
                    <v-icon large>code</v-icon>
                  </v-btn>
                  <span>Source</span>
                </v-tooltip>
              </v-toolbar>
              <v-card-text>
                <v-form>
                  <v-text-field prepend-icon="person" name="login" label="Login" type="text"></v-text-field>
                  <v-text-field prepend-icon="lock" name="password" label="Password" id="password" type="password"></v-text-field>
                </v-form>
              </v-card-text>
              <v-card-actions>
                <v-spacer></v-spacer>
                <v-btn color="primary">Login</v-btn>
              </v-card-actions>
            </v-card>
          </v-flex>
        </v-layout>
      </v-container>

    </v-content>
  </v-app>
</div>

【问题讨论】:

    标签: vuetify.js


    【解决方案1】:

    https://codepen.io/anon/pen/pZymrW

    使用单个容器并仅设置该容器的样式:

    <v-container fill-height class="red">
        <v-layout align-center justify-center>
            <v-flex xs12 sm8 md4>
                 //Centered content i.e. card
            </v-flex>
        </v-layout>
    </v-container>
    

    另外请注意,您可以使用class="red" 代替style="background:red",这样您就可以得到Vuetifys 颜色,这很可能是您最初想要的。

    另见v-containerAPI(在搜索框中输入v-container)。

    【讨论】:

    • 我的问题是,我有自定义组件。一个是卡片,一个是 svg,它应该填满工具栏下方的所有空间。当我展示卡片时,我需要它在 SVG 上方。我设法解决了这个问题:codepen.io/anon/pen/ejZaQL不确定这是否是最佳方式
    • @thatOneGuy 嗯,你没有在问题中提到它,哈哈。您仍然可以在容器上使用background-image: ,以便保留层次结构,但我不确定哪种方法更适合 svg 背景。
    【解决方案2】:

    查看更新的codepen

    保持这种结构。基本保持&lt;v-container fluid fill-height&gt;&lt;v-container style="background:red" fill-height&gt;里面

    <div id="app">
      <v-app id="inspire">
        <v-content>
         <v-container style="background:red" fill-height>  
          <v-container fluid fill-height>
            <v-layout align-center justify-center>
              <v-flex xs12 sm8 md4>
                <v-card class="elevation-12">
                  <v-toolbar dark color="primary">
                    <v-toolbar-title>Login form</v-toolbar-title>
                    <v-spacer></v-spacer>
                    <v-tooltip bottom>
                      <v-btn
                        icon
                        large
                        :href="source"
                        target="_blank"
                        slot="activator"
                      >
                        <v-icon large>code</v-icon>
                      </v-btn>
                      <span>Source</span>
                    </v-tooltip>
                  </v-toolbar>
                  <v-card-text>
                    <v-form>
                      <v-text-field prepend-icon="person" name="login" label="Login" type="text"></v-text-field>
                      <v-text-field prepend-icon="lock" name="password" label="Password" id="password" type="password"></v-text-field>
                    </v-form>
                  </v-card-text>
                  <v-card-actions>
                    <v-spacer></v-spacer>
                    <v-btn color="primary">Login</v-btn>
                  </v-card-actions>
                </v-card>
              </v-flex>
            </v-layout>
          </v-container>
         </v-container>  
        </v-content>
      </v-app>
    </div>
    

    new Vue({
      el: '#app',
      data: () => ({
        drawer: null
      }),
    
      props: {
        source: String
      }
    })
    <link rel="stylesheet prefetch" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Material+Icons">
    <link rel="stylesheet prefetch" href="https://unpkg.com/vuetify/dist/vuetify.min.css">
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/vuetify/dist/vuetify.min.js"></script>
    <div id="app">
      <v-app id="inspire">
        <v-content>
          <v-container style="background:red" fill-height>
            <v-container fluid fill-height>
              <v-layout align-center justify-center>
                <v-flex xs12 sm8 md4>
                  <v-card class="elevation-12">
                    <v-toolbar dark color="primary">
                      <v-toolbar-title>Login form</v-toolbar-title>
                      <v-spacer></v-spacer>
                      <v-tooltip bottom>
                        <v-btn icon large :href="source" target="_blank" slot="activator">
                          <v-icon large>code</v-icon>
                        </v-btn>
                        <span>Source</span>
                      </v-tooltip>
                    </v-toolbar>
                    <v-card-text>
                      <v-form>
                        <v-text-field prepend-icon="person" name="login" label="Login" type="text"></v-text-field>
                        <v-text-field prepend-icon="lock" name="password" label="Password" id="password" type="password"></v-text-field>
                      </v-form>
                    </v-card-text>
                    <v-card-actions>
                      <v-spacer></v-spacer>
                      <v-btn color="primary">Login</v-btn>
                    </v-card-actions>
                  </v-card>
                </v-flex>
              </v-layout>
            </v-container>
          </v-container>
        </v-content>
      </v-app>
    </div>

    另一种方式

    在包含登录表单的容器上添加一个类并添加以下 CSS

    new Vue({
      el: '#app',
      data: () => ({
        drawer: null
      }),
    
      props: {
        source: String
      }
    })
    .v-content__wrap {
      position: relative;
    }
    
    .login-container {
      position: absolute;
      padding: 20px;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
    }
    <link rel="stylesheet prefetch" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Material+Icons">
    <link rel="stylesheet prefetch" href="https://unpkg.com/vuetify/dist/vuetify.min.css">
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/vuetify/dist/vuetify.min.js"></script>
    <div id="app">
      <v-app id="inspire">
        <v-content>
          <v-container style="background:red" fill-height> </v-container>
          <v-container fluid fill-height login-container>
            <v-layout align-center justify-center>
              <v-flex xs12 sm8 md4>
                <v-card class="elevation-12">
                  <v-toolbar dark color="primary">
                    <v-toolbar-title>Login form</v-toolbar-title>
                    <v-spacer></v-spacer>
                    <v-tooltip bottom>
                      <v-btn icon large :href="source" target="_blank" slot="activator">
                        <v-icon large>code</v-icon>
                      </v-btn>
                      <span>Source</span>
                    </v-tooltip>
                  </v-toolbar>
                  <v-card-text>
                    <v-form>
                      <v-text-field prepend-icon="person" name="login" label="Login" type="text"></v-text-field>
                      <v-text-field prepend-icon="lock" name="password" label="Password" id="password" type="password"></v-text-field>
                    </v-form>
                  </v-card-text>
                  <v-card-actions>
                    <v-spacer></v-spacer>
                    <v-btn color="primary">Login</v-btn>
                  </v-card-actions>
                </v-card>
              </v-flex>
            </v-layout>
          </v-container>
    
        </v-content>
      </v-app>
    </div>

    cmets 中建议的另一种方式

    只保留一个填充高度容器

    new Vue({
      el: '#app',
      data: () => ({
        drawer: null
      }),
    
      props: {
        source: String
      }
    })
    <link rel="stylesheet prefetch" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Material+Icons">
    <link rel="stylesheet prefetch" href="https://unpkg.com/vuetify/dist/vuetify.min.css">
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/vuetify/dist/vuetify.min.js"></script>
    <div id="app">
      <v-app id="inspire">
        <v-content>
          <v-container style="background:red" fluid fill-height login-container>
            <v-layout align-center justify-center>
              <v-flex xs12 sm8 md4>
                <v-card class="elevation-12">
                  <v-toolbar dark color="primary">
                    <v-toolbar-title>Login form</v-toolbar-title>
                    <v-spacer></v-spacer>
                    <v-tooltip bottom>
                      <v-btn icon large :href="source" target="_blank" slot="activator">
                        <v-icon large>code</v-icon>
                      </v-btn>
                      <span>Source</span>
                    </v-tooltip>
                  </v-toolbar>
                  <v-card-text>
                    <v-form>
                      <v-text-field prepend-icon="person" name="login" label="Login" type="text"></v-text-field>
                      <v-text-field prepend-icon="lock" name="password" label="Password" id="password" type="password"></v-text-field>
                    </v-form>
                  </v-card-text>
                  <v-card-actions>
                    <v-spacer></v-spacer>
                    <v-btn color="primary">Login</v-btn>
                  </v-card-actions>
                </v-card>
              </v-flex>
            </v-layout>
          </v-container>
    
        </v-content>
      </v-app>
    </div>

    【讨论】:

    • 啊将容器放在容器中。你知道一种对元素进行分组而不对 UI 产生任何影响的方法吗?例如,假设我有 50 个组件,为了论证,我想将所有这些分组并有一个 v-if 语句,而不是有 50 个 v-if。基本上,组件仅显示某事是否属实。我可以在 3 分钟内接受答案
    • 对不起,我不知道 Vue 是否有效!我只是在逻辑上尝试了一些东西并找到了解决方案。
    • 经过测试,我无法将容器放入容器中。他们必须并排。有什么想法吗?
    • > Sorry I do not know Vue works ! I just tried something logically and figured out the solution. 你的意思是Vuetify?那么如何才能正确解决问题呢?当然你可以使用任意的 html 和 css 但这会破坏框架的目的。
    • @Traxo 我从来没有说过它是一个合适的解决方案,感谢您指出这一点。 :) 如果你有更好的解决方案,请告诉我,很想学习新东西 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2023-04-04
    • 2021-11-21
    • 1970-01-01
    相关资源
    最近更新 更多