DDR爱好者之家 Design By 杰米

运用场景:

新需求有个项目是要做问卷调查,其中必然会涉及到很多题目,以及一个题目下需要对多个人打分,手机端滑动的时候,就会发生这种现象,划上去会忘记了题目。 所以计算一定的距离之后需要对题头进行一个定位。使滑到相对于区域的题头一直固定在顶部,方便打分。

解决思路:

1.首先想到的是fixed布局就是题头到一定距离的时候就固定在屏幕的顶部。  (可以实现,但是过程不是很丝滑)
2.sticky布局

sticky就可以很好的实现这个需求,但是需要考虑到兼容性(兼容IE)

sticky实现思路:

1.首先需要记录滑块的位置,需要监听滚动事件:

window.addEventListener("scroll", this.handleScroll);

记得组件销毁前去移出这个事件
 beforeDestroyed() {
    window.removeEventListener("scroll", this.handleScroll);
  }

2.计算出每道题目的题头距离屏幕顶部的高度,并组成一个数组。

// 记得给每一条题目都设置ref,我的ref就是每道题的id

-- vue简略缩写---
<div
  :ref="question.id"
  v-for="(question, index) of formData.questions"
  :key="index"
>


// 为防止乱序问题,我还进行了一个排序
---- js -----
 this.topPositionArr = [];
  for (let key in this.$refs) {
      for (let idx in this.$refs[key]) {
        this.topPositionArr.push(this.$refs[key][idx].offsetTop);
      }
    }
    this.topPositionArr = [...new Set(this.topPositionArr)];
    this.topPositionArrtopPositionArr = this.topPositionArr.sort(
      (a, b) => {
        return a - b;
      }
    );        

3.滑动监听到的距离和获取到的题头进行一个比较,选择定位的题头。

// 兼容不同的游览器 不同游览器的offsetTop的取法是不一样的

handleScroll() {
    this.scrollTop = document.documentElement.scrollTop
  ? document.documentElement.scrollTop
  : document.body.scrollTop;
  
let scrollTop = this.scrollTop;
// 第一题的scrollTop不变,从第二题的scrollTop开始变
this.topPositionArr.forEach((item, idx) => {
  if (idx > 1) {
    this.scrollTop = scrollTop + 220;
  }
  //为什么这样做呢? 是因为iE不支持sticky布局,我们需要一个插件去协助使用
  if (this.scrollTop > item) {
    let elements = document.getElementById(`sticky${idx}`);
    stickyfill.add(elements);
  }
});
}

4.IE的兼容问题

因为IE是不支持sticky布局的,所以我们需要轮子 stickyfill

npm install stickyfill 
yarn add stickyfill

--- vue---
需要给题头的div标签一个动态的id,表示唯一性

<div
  :id="`sticky${question.index}`"
  class="isSticky"
>

单文件引入

在你需要的页面中引入:
<script src="path/to/stickyfill.min.js"></script>
var Stickyfill = require("stickyfill");
var stickyfill = Stickyfill();

js文件:

具体方法看上述3
let elements = document.getElementById(`sticky${idx}`);
stickyfill.add(elements);

以上就可以完美的实现哦~~~
PS:如果是只需要兼容谷歌,那就不需要这么麻烦,可以直接使用stiky布局,不再需要轮子 --
可以参考看看https://www.zhangxinxu.com/wordpress/2018/12/css-position-sticky/旭鑫大大的文章

最后效果图:

css之粘性sticky布局实现题头定位在顶部的方法

css之粘性sticky布局实现题头定位在顶部的方法

DDR爱好者之家 Design By 杰米
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
DDR爱好者之家 Design By 杰米

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。