如何修复在移动动表现差异很大的选择框---中级程序员研究

在移动端开发中,我们往往需要按照设计稿去高度还原效果图,并且实现交互方式,下面看一下一个标签的表现形式: select

在iOS中的表现:

但是在安卓上并不是这样的效果

交互表现得差异性需要优化,那么问题来了,怎么优化。如何去保持同一标签可以表现相同得样式和交互方式。其实这也是前端的重要工作之一:兼容性和适配,也对应着招聘的要求之一:高度还原设计稿;言归正传,看到select不同的表现。我们如何实现这个替换呢?用过element-ui,iview等框架的小伙伴都知道,他们为了保持统一的表现,放弃了select,option;而是封装了自己的el-select 或者Select;

iviewui中的select

vant中的picker

element-ui

以上框架都实现了select的封装,但是在开放中,我们如果没有使用它们自身的框架,而是我们项目本身的框架,用起来很是费劲;大家都知道前端开发现在最火的是组件化开发,组件就是组件,可以快速移植和安装;最重要的是可以差异化这个组件,而且你也便于维护;安装其中的某个组件,你可能要花费30分钟去修改配置和调试,但是极有可能不会成功,这是很痛心、很扎心;

那么推荐下面一个最简单的替换组件,

yh-select

这个组件昨天发布,对没有错就是我写的,支持 npm install yh-select ,目前只支持vue, 安装完成后,select option ,可以用一行标签搞定了,详情请看yh-select;(如果你想一起组队开发组件,那么请加微信xingguangbi,我们一起发布自己的组件)

修复不同的表现方式和交互方式,需要我们去替换产生差异的一些标签,用相同的标签去组装我们想要的效果:

下面分享一下我替换select的思路:

ul>li存放option的每一列,外面再来一个div包裹它,下拉的箭头实现,背景色去填充,不使用图片和字体图标,好处:尽量减少组件的依赖性,减少请求;

一个点击外部的指令

const clickoutsideContext = "@@clickoutsideContext";

export default {
  /*
   @param el 指令所绑定的元素
   @param binding {Object}
   @param vnode vue编译生成的虚拟节点
   */
  bind(el, binding, vnode) {
    const documentHandler = function(e) {
      if (!vnode.context || el.contains(e.target)) {
        return false;
      }
      if (binding.expression) {
        vnode.context[el[clickoutsideContext].methodName](e);
      } else {
        el[clickoutsideContext].bindingFn(e);
      }
    };
    el[clickoutsideContext] = {
      documentHandler,
      methodName: binding.expression,
      bindingFn: binding.value
    };
    setTimeout(() => {
      document.addEventListener("click", documentHandler);
    }, 0);
  },
  update(el, binding) {
    el[clickoutsideContext].methodName = binding.expression;
    el[clickoutsideContext].bindingFn = binding.value;
  },
  unbind(el) {
    document.removeEventListener(
      "click",
      el[clickoutsideContext].documentHandler
    );
  }
};

 核心组件如下:

<template>
  <div
    v-clickoutside="handleClose"
    class="select-wrapper"
    @click.prevent="selF"
    :class="{‘active‘:selFlag}"
    :style="{‘z-index‘:min}"
  >
    <div class="inners">{{models[names]}}</div>
    <div class="arrow" @click.stop="selF"></div>
    <ul v-show="selFlag">
      <li
        :class="{‘active‘:models.value==item.value}"
        v-for="(item,index) in options"
        :key="index"
        :value="item[val]"
        @click.stop="sels(item)"
      >{{item[names]}}</li>
    </ul>
  </div>
</template>
<script>
import clickoutside from "./close";
export default {
  directives: { clickoutside },
  model: {
    prop: "sel",
    event: "change"
  },
  props: ["options", "sel", "val", "names"],
  data() {
    return {
      selFlag: false,
      models: "",
      min: 0
    };
  },
  methods: {
    selF() {
      this.min = 100;
      this.selFlag = !this.selFlag;
    },
    init() {
      this.models = this.sel;
    },
    sels(item) {
      this.models = item;
      this.selFlag = !this.selFlag;
      this.$emit("change", item);
    },
    handleClose() {
      this.min = 0;
      this.selFlag = false;
    }
  },
  mounted() {
    this.init();
  }
};
</script>
<style scoped>
.select-wrapper {
  width: 120px;
  border: 1px solid #999;
  padding: 2px 30px 0 5px;
  font-size: 12px;
  height: 18px;
  position: relative;
  z-index: -1;
}
.inners {
  padding-right: 30px;
  overflow: hidden;
}
.select-wrapper .arrow {
  position: absolute;
  top: 50%;
  right: 10px;
  z-index: 30;
  transform: translateY(-50%);
  border-top: 5px solid #999;
  border-left: 5px solid transparent;
  border-right: 5px solid transparent;
}
.active {
  box-shadow: 0 0 3px #1e90ff;
}
.select-wrapper ul {
  list-style: none;
  margin: 0;
  padding: 0;
  width: fit-content;
  text-align: left;
  position: absolute;
  max-height: 160px;
  overflow-y: auto;
  bottom: 0;
  transform: translateY(101%);
  left: 0;
  z-index: 10;
  background: #fff;
  border: 1px solid #1e90ff;
  min-width: 100%;
}
.select-wrapper li {
  padding: 0 45px 0 0;
  background: #fff;
}
.select-wrapper li:hover {
  background: #1e90ff;
  color: #fff;
}
.select-wrapper li.active {
  background: #1e90ff;
  color: #fff;
}
</style>

  源码地址:我要下载源码 (如果喜欢,请记得star一下);

最后提供一个问题解答的机会,交流的微信群,可以一起交流学习,如果你想进入请加微信:xingguangbi(备注交流解答);

原文地址:https://www.cnblogs.com/starryqian/p/10301999.html

时间: 2024-11-10 00:42:23

如何修复在移动动表现差异很大的选择框---中级程序员研究的相关文章

很认真的聊一聊程序员的自我修养

首先要谈的是,今天的话题所聊的程序员包含哪些人? 在中国,写程序,不仅仅是一种兴趣,更多的时候,还是一种普通职业和谋生工具 大公司有厉害的程序员,优秀的架构师,但大量的小公司也有很多普通的程序员.在我这些年的工作经历中,也越来越深刻的感受到普通程序员的影响和力量.对于高阶程序员,所谓八仙过海各有神通,各有各的成就,各有各的修养,但程序员在达成较高的水平之前,有一些"自我修养",是最基础的,是普世的. 所以今天的话题面向的程序员,就是所有的正在写代码或者曾经写过代码的程序员,也包括广义上

很认真地聊一聊程序员的自我修养

最近看了<浅谈程序员的英语学习>,对于文章中的观点我非常认同,英语是非常重要的,但文章站的高度还是太高,具体表述的学习方法我不是很认同,也认为不太实际,恰好之前有一篇一直没有发表的文章想重新发布,就借此机会和大家很认真的谈一谈程序员的自我修养问题. 先介绍一下利益相关,我的背景: 初中开始参加信息学与数学竞赛,大学本科软件工程专业,毕业后在银行做大数据分析与项目管理,后自主创业,做过传媒公司.软件外包公司,现在中国(南京)软件谷有个工作室,做些自己喜欢的事情.15年编码经验,6年创业经验.主要

程序员很穷

程序员很穷,他们要么是显得很穷,要么是真的很穷. 前几天一位做市场的同事跑过来问,池老师,我有一位朋友,快 30 了,想转行写程序,您觉得有戏吗?我看了看满目疮痍的他说,如果是你就没戏. 30 多岁转行做程序员当然可行,毕竟历史上存在一些大器晚成的案例,这些经过渲染和修饰的案例给在时间长河中苦苦挣扎的人们带来些许希望的火光,但那毕竟是火光,一阵风来过,也许就灭了.如果你真的热爱技术和编程,渴望通过自己的代码实现别人的想法,或自己的想法,为世界带来更美好的产品,那么任何时候学习编程都不晚,编程给你

程序员很穷(转)

原文  http://macshuo.com/?p=1328 程序员很穷,他们要么是显得很穷,要么是真的很穷. 前几天一位做市场的同事跑过来问,池老师,我有一位朋友,快30了,想转行写程序,您觉得有戏吗?我看了看满目疮痍的他说,如果是你就没戏. 30多岁转行做程序员当然可行,毕竟历史上存在一些大器晚成的案例,这些经过渲染和修饰的案例给在时间长河中苦苦挣扎的人们带来些许希望的火光, 但那毕竟是火光,一阵风来过,也许就灭了.如果你真的热爱技术和编程,渴望通过自己的代码实现别人的想法,或自己的想法,为

程序员工资为什么普遍很高,原来是因为这个...

点击上方“程序员江湖”,选择“置顶或者星标” 你关注的就是我关心的! 来源:互联网 在中国,虽然程序员这个职业已经非常普及,但大多数人对程序员的了解还仅仅停留在薪资高的层面上.至于为什么薪资高,到底在做什么,很多人还是说不上来. 其实,程序员与其他行业的工作没有本质上的区别.现阶段社会任何一个岗位都有一定的入职门槛,只不过这个门槛有高低的区别.门槛越高的职位,收入也越高,这是一个基本常识. 会计.销售.司机.医生等大家耳熟能详的工作,实际上和程序员没有本质上的区别. 如果你决定成为一名司机,你需

程序员为什么很容易焦虑

其实不止程序员啦,感觉这个时代大家都很焦虑. 在这个遍地都是程序员的时代,大家似乎认准了程序员就是吃青春饭的,30+以上的程序员写代码没有年轻人写的好了,大家都很怕被年轻人替代,也怕到了三十岁真的找不到工作,毕竟裁员的也挺多的.虽然这时候可以转行做产品或者做项目经理或者做架构师,但并不是每个程序员都有这个实力的.由于最近身边很多大公司的30+的程序员来到我公司当管理,我就在想,很多职业,医生,律师,会计都是越老越资深,越老越值钱,怎么到程序员就越老越害怕被年轻人代替,只能去转行呢.干了十年的程序

斯坦福大学公开课机器学习:machine learning system design | data for machine learning(数据量很大时,学习算法表现比较好的原理)

下图为四种不同算法应用在不同大小数据量时的表现,可以看出,随着数据量的增大,算法的表现趋于接近.即不管多么糟糕的算法,数据量非常大的时候,算法表现也可以很好. 数据量很大时,学习算法表现比较好的原理: 使用比较大的训练集(意味着不可能过拟合),此时方差会比较低:此时,如果在逻辑回归或者线性回归模型中加入很多参数以及层数的话,则偏差会很低.综合起来,这会是一个很好的高性能的学习算法. 原文地址:https://www.cnblogs.com/chenwenyan/p/8326027.html

程序员生存定律--使人生永动的势能

程序员生存定律这系列的目录在这里:程序员生存定律--目录 喜欢从头瞄的,可以移步. ------------------------------------------------------------------------------ 这篇说的是精神,比较务虚,不感兴趣的可以略过. 在国内有一个很特别的现象:高中打了鸡血一样使劲学习的人,到了大学往往会放松下来,跑去享受生活了,大学里打游戏.打牌.临考冲刺的大有人在. 这倒也在情理之中,高中不学真考不上大学,考不上大学真就完蛋了:大学不学,

大数据公司挖掘数据价值的49个典型案例!信息量很大

大数据公司挖掘数据价值的49个典型案例 对于企业来说,100条理论确实不如一个成功的标杆有实践意义,本文的主旨就是寻找"正在做"大数据的49个样本. 力图从企业运营和管理的角度,梳理出发掘大数据价值的一般规律:一是以数据驱动的决策,主要通过提高预测概率,来提高决策成功率;二是以数据驱动的流程,主要是形成营销闭环战略,提高销售漏斗的转化率;三是以数据驱动的产品,在产品设计阶段,强调个性化;在产品运营阶段,则强调迭代式创新. 上篇 天然大数据公司的各种套餐 从谷歌.亚马逊.Facebook