目标: 实现详情页中header渐隐渐现效果

当进入详情页的时候,详情页的左上角有一个返回的按钮,向下拉详情页的时候,返回箭头会慢慢消失,取而代之的是一个蓝色的header。

  1. 创建Header.vue组件,完成基本的框架构建与引入操作
  2. 返回箭头的基本布局与样式美化:
<div><div class="header-abs"><div class="iconfont header-abs-back"></div></div><div class="header-fixed"></div>
</div>
.header-absposition absolutetop .2remleft .2remwidth .8remheight .8remline-height .8remborder-radius .4remtext-align centerbackground rgba(0, 0, 0, .6rem).header-abs-backfont-size .4remcolor #fff

当点击这个返回箭头的时候希望它跳转回主页:

<div><router-link tag="div" to="/" class="header-abs"><div class="iconfont header-abs-back"></div></router-link><div class="header-fixed"></div>
</div>
  1. header-fixed部分的布局与样式美化。 这个与城市选择页面的header几乎一样,复制过来稍微改动即可:
<div class="header-fixed"><router-link to="/"><div class="iconfont header-fixed-back"></div></router-link>景点详情
</div>
.header-fixedposition fixedleft 0right 0top 0height $headerHeightline-height $headerHeighttext-align centercolor #fffbackground $bgColorfont-size .32rem.header-fixed-backposition absolutetop 0left 0width .64remtext-align centerfont-size .4remcolor #fff
  1. 逻辑实现: 当进入这个详情页面的时候,返回箭头是默认显示的,而header-fixed部分则与之相反, 页面向下滑动大概60px的时候返回箭头渐渐隐藏,header-fixed逐渐显示出来。所以我们就需要对window.addEventListener事件进行监听。

因为我们使用了keep-live,所以页面一被展示,activated这个生命周期钩子就会被执行。

methods: {handleScroll () {console.log(document.documentElement.scrollTop)}
},
activated () {window.addEventListener('scroll', this.handleScroll)
}

根据上面的逻辑,我们在获得向上的滚动距离后就可以这样做:

methods: {handleScroll () {const top = document.documentElement.scrollTopif (top > 60) {this.showAbs = false}else {this.showAbs = true} }
}

基本的逻辑实现了,接下来就是渐隐渐现的效果。首先,给header-fixed设置一个动态的style,并在data中定义这个opacityStyle数据,默认情况下它的opacity为0.希望的是,当用户的滚动距离在60px到140px之间会出现在这个渐隐渐现的效果。

<div class="header-fixed" v-show="!showAbs":style="opacityStyle"
><router-link to="/"><div class="iconfont header-fixed-back"></div></router-link>景点详情
</div>
data() {return {showAbs: true,opacityStyle: {opacity: 0} }
},
methods: {handleScroll () {const top = document.documentElement.scrollTopif (top > 60) {let opacity = top / 140opacity = opacity > 1 ? 1 : opacitythis.opacityStyle = {opacity: opacity}this.showAbs = false}else {this.showAbs = true} }
}

其中的三元表达式的意思是,当滚动的距离大于140px的时候header-fixed的opacity一直是1。上面代码中设置opacityStyle的部分使用ES6的写法:

methods: {handleScroll () {const top = document.documentElement.scrollTopif (top > 60) {let opacity = top / 140opacity = opacity > 1 ? 1 : opacitythis.opacityStyle = { opacity }this.showAbs = false}else {this.showAbs = true} }
}

至此,渐隐渐现的替换效果就实现了。

代码提交

补充: 对全局事件的解绑

问题: 在详情页面加载的时候,我们使用了生命周期钩子activated,在这里对window做了一个事件的绑定。我们在一个组件的某一个标签上绑定一个事件不会有什么问题,它不会影响到其他的组件,但是当我们给一个全局对象绑定一个事件的时候,将会对外部的组件也会产生影响。

我们在handleScroll方法中输出一个console.log(scroll),在详情页面滚动的时候,scroll会被不断的输出,当返回到首页滚动页面的时候,scroll依然会被输出,所以这里看出,把事件绑定在全局对象上将会对其他组件也会产生影响。

我们使用了keep-alive的时候,会多出一个activated的生命周期函数,它在每次页面展示的时候会被执行,与之对应的,还提供了了一个叫做deactivated的生命周期函数,它将在页面即将被隐藏或者是即将被新的页面替换的时候执行,我们就可以利用这个生命周期钩子在页面离开这个页面之间解绑全局对象上绑定的事件:

deactivated () {window.removeEventListener('scroll', this.handleScroll)
}

代码提交

这次代码修改的时候没有创建分支,直接修改了文件。先在master分支push上去,然后切换到上次的detail-header分支,然后和master进行一个合并再push上去。

  1. git branch 可以查看分支
  2. git add .
  3. git commit -m ‘fix problem’
  4. git push
  5. git checkout detail-header
  6. git merge master
  7. git push

去哪儿-17-detail-header相关推荐

  1. php 接口响应头处理,PHP--获取响应头(Response Header)方法

    方法一: ========================================== $baiduUrl = "http://www.baidu.com/link?url=LZE_ ...

  2. 转:PHP--获取响应头(Response Header)方法

    转:http://blog.sina.com.cn/s/blog_5f54f0be0102uvxu.html PHP--获取响应头(Response Header)方法 方法一: ========== ...

  3. 20.进入商品详情页Detail

    like.vue组件中 给li添加一个点击事件 @click="goDetail" 对应的方法 methods:{goDetail(){this.$router.push({pat ...

  4. 无心剑中译叶芝诗17首

    文章目录 1.两鬓染霜 2.华衣 3.饮酒歌 4.山盟海誓 5.他谈起情人谷 6.长久沉默后 7.漫步柳园 8.茵纳斯弗利岛 9.哀悼失恋 10.时辰到,智慧来 11.心绪 12.国色天香 13.诗人 ...

  5. php 获取header auth,php CURL Auth请求头和响应头获取

    $oCurl = curl_init(); // 设置请求头, 有时候需要,有时候不用,看请求网址是否有对应的要求 $header[] = "Content-type: applicatio ...

  6. 17.openssl编程——RSA介绍

    17.1  RSA介绍 RSA算法是一个广泛使用的公钥算法.器密钥包括公钥和私钥.他能用于数字签名.身份认证以及密钥交换.RSA密钥信息主要包括: * n:模数 * e:公钥指数 * d:私钥指数 * ...

  7. 报错:C1189#error: The <experimental/filesystem> header providing std::ex………………

    具体报错为:#error The <experimental/filesystem> header providing std::experimental::filesystem is d ...

  8. 2021最新! Springboot 2.X集成ElasticSearch 7.6.2(入门版)

    目录 1.版本选择 2.ElasticSearch 安装 2.1 新增配置 2.2 设置登录密码 2.3 ElasticSearch作为windows服务启动 3 ElasticSearch-head ...

  9. Android G.711音频编解码

    需求背景: 博主目前所在的公司是一家做视频通讯的公司,所以对音频,视频这一块对编码方式都有一定的要求,由于之前一直没有接触JNI这一块,突然让我去做音频的转码还是有一定的苦难的.一开始对于JNI编程我 ...

  10. PS网页设计教程XXIV——从头设计一个漂亮的网站

    作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,"熟读唐诗三百首,不会作诗也会吟". 本系列的教程来源于网上的PS教程,都是国外的 ...

最新文章

  1. Windows Server 2012 R2/2016/2019无法安装.NET Framework 3.5.1或语言包的解决方法
  2. pyInstaller 参数简介
  3. [python3 - TroubleShooting] requests爬取中文网站后直接print,以及保存csv乱码
  4. matlab全下标方式取出,matlab习题
  5. Android入门逆引手册 - 12 评分条(RatingBar)的使用
  6. JS module的导出和导入
  7. 数据中心实施服务器虚拟化前的十大思考
  8. fir1截止频率计算_数字信号处理 实验五:FIR数字滤波器设计与软件实现
  9. 解决载入自定义视图时出现InflateException #8:Error inflating的错误
  10. Python数据结构之字节,字节数组
  11. Linux截图gif,Ubuntu下截图与录制视频并作成gif图片
  12. IAP(程序内购买): 完全攻略
  13. jqfactor_analyzer源代码解读02
  14. 安装ubuntu 遇到的问题
  15. 计算机使用计数制是,进位计数制
  16. 深入学习理解Java集合
  17. MYSQL 安装步骤
  18. 几种媒体文件(MediaPlayer,Realplay,QuickTime)的调用代码
  19. 前端页面阻尼效果实现
  20. ARFoundation之路-光照估计

热门文章

  1. 使用PostgREST的RestAPI操作之 类型转JSON对象 | 嵌入视图
  2. 容器编排技术 -- Kubernetes kubectl create service clusterip 命令详解
  3. 容器编排技术 -- Kubernetes kubectl 命令表
  4. Oracle结果集缓存(Result Cache)--服务器、客户端、函数缓存
  5. Mybatis理解与入门步骤
  6. Mac远程连接Windows的远程桌面服务
  7. 【C语言】输入10个人的成绩,求平均值
  8. nw.js 打包换桌面图标_我如何使用CometChat和NW.js构建桌面聊天应用程序(以及方法)
  9. 如何在Telegram机器人中设置推送通知
  10. 笛卡尔函数_笛卡尔,伯克利和函数式React式编程