html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>定义组件title> <script src="https://unpkg.com/vue@next">script> head> <body> <div id="root">div> body> <script> const app = Vue.createApp({}) const vueComponent = { data() { return { msg: '你按下了按钮', count: 0 } }, methods: { btnClick() { alert(this.msg + ++this.count + '次') } }, template: `
按钮按下了{{count}}次div> ` } app.component("my-alert", vueComponent); app.mount('#root'); script> html>
如上述代码,组件运行后会报错:
vue@next:1616 [Vue warn]: Component is missing template or render function.
at
warn$1 @ vue@next:1616
finishComponentSetup @ vue@next:8759
setupStatefulComponent @ vue@next:8661
setupComponent @ vue@next:8583
mountComponent @ vue@next:6945
processComponent @ vue@next:6920
patch @ vue@next:6522
render @ vue@next:7680
mount @ vue@next:5926
app.mount @ vue@next:10819
(匿名) @ component.html:74
如果不使用组件,直接写到实例里面的话能够正常跑,但不知道组件的引入哪里出错了,望指点。
只在js中定义了自定义组件,而并未在html中使用自定义组件,故存在渲染错误。且自定义组件只能在Vue挂载的标签内使用。
闲话少说,先上效果图
可以看到,当页面超出某一位置时,主导航消失,副导航显示,当页面重新回到该位置时,主导航会再次显示
简单说下原理,其实页面当中本身就存在着两个导航栏,只是通过v-show来控制他们俩之间的显隐
而副导航是固定在浏览器窗口的,所以他的position必须是fixed,即相对浏览器窗口进行定位
剩下的事情就是我们监听页面的滚动高度来判断在什么时刻进行动画效果的展示
原理是不是很简单!原理搞懂后,我们就抓紧实现,首先你的demo上一定要有足够的高度可以使页面上下滚动,做好这一点之后,我们开始编写代码
首先两个导航栏是同级的关系,关于导航栏中细节的样式就不多阐述了,主要看大体代码
我使用的编译器是stylus,与sass的编写方式略有不同
.nav-absolute
position : absolute
left : 0
top : 0
right : 0
width : 100%
background : url(../assets/img/31.png)
background-repeat : no-repeat
background-size : cover
width : inherit
height : 260px
padding : 30px 0
首先是主导航,父级position一定要给好relative,否则absolute会找与之最相近的父级(父级可为relative也可absolute),若都没有则相对浏览器窗口进行定位,那我们的效果就是实现不了了
其次是副导航的样式,即要相对窗口进行定位
.fixed-wrapper
position : fixed
left : 240px
top : 0
right : 0
width : 100%
background : url(../assets/img/fixed-nav.png)
background-repeat : no-repeat
background-size : cover
width : inherit
height : 60px
padding : 5px 0
z-index : 99!important
接下来要开始监听窗口滚动的位置
scrollLength () {
let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
const top = document.documentElement.scrollTop
console.log(scrollTop)
if (scrollTop > 120) {
let opacity = top / 240
opacity = opacity > 1 ? 1 : opacity
this.showOpacity = { opacity }
this.showNav = false
}
if (scrollTop < 240) {
this.showNav = true
}
}
给大家看一下打印的监听高度
大家可以看到在不同位置打印出的不同高度,这里我选择的是当高度大于120时开始进行动画效果,那么下面的含义其实就是我要控制主导航栏消失时opacity的效果,即让他有一个慢慢消失的动画效果(虽然消失的还是挺快的- - 、),这里的showNav是提前在data中声明好的,在两个导航栏父元素的div中分别加入v-show=“showNav"和v-show=”!showNav"即可
到这里整个动画效果就实现啦!是不是很简单
希望我们共同进步,如有更高效更简洁的实现方法还望大佬不吝赐教!