1.浙里办适老化前端样式解决方案

1.方案1:动态绑定样式
  1. 示例:
<span :class="(isElder ? 'elder_' : '') + 'title'">xxx</span>

// 样式
.title {
    font-size: 10rem;
}

.elder_title {
    font-size: 20rem;
}

2.vue.js引入外部样式

  1. 方式1:less文件
<style lang="less" scoped>
    @import "./index.less";
    @import "./indexOld.less";
</style>
  1. 方式2:scss文件
<style lang="scss" scoped>
@import "~./index.scss";
@import "~./indexOld.scss";
</style>

3.H5移动端开发中不同屏幕的设配

  1. 通常以rem为单位,它相对根元素html的字体大小来。例如大部分浏览器的默认字体大小为16px,所以1rem = 16px
  2. 在移动端开发中,UI设计的设计稿通常为375px或者750px。可以将根元素html的字体大小设置为100px。这样1rem=100px。可以根据UI设计稿的px单位直接得到以rem为单位的大小。
px / 100 = rem
  1. 假设UI设计稿屏幕宽度为750px,需要设置1rem = 100px。如下所示:原理是使用js动态改变html的font-size大侠,以适应不同尺寸屏幕设备能够正常显示。
<script>
    (function(doc, win) {
        // 根元素html
        var docEl = doc.documentElement,
            // orientationchange方向改变事件(横屏或者是竖屏)
            // 判断窗口有没有orientationchange这个方法,有就赋值给一个变量,没有就返回resize方法。
            resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
            recalc = function() {
                var clientWidth = docEl.clientWidth;
                if (!clientWidth) return;
                //把document的fontSize大小设置成跟窗口成一定比例的大小,从而实现响应式效果。
                //docEl.style.fontSize = 100 * (调试设备宽度 / 设计图宽度) + 'px';
                // 在写页面的过程中保持 调试设备宽度 等于 设计图宽度 就可以。
                // 这样就又可以愉快的使用123px是1.23rem的计算了
                docEl.style.fontSize = 100 * (clientWidth / 750) + 'px';
            };
        if (!doc.addEventListener) return;
        //addEventListener事件方法接受三个参数:第一个是事件名称比如点击事件onclick,第二个是要执行的函数,第三个是布尔值
        win.addEventListener(resizeEvt, recalc, false);
        //绑定浏览器缩放与加载时间
        doc.addEventListener('DOMContentLoaded', recalc, false);
    })(document, window);
</script>

4.less变量

  1. 定义less变量:
@grey-text-size: 0.9rem;
  1. 使用:
 .info-argent {
    color: #666666;
    font-size: @grey-text-size;
    line-height: 1.5;
}

5.vue项目中修改vux组件的样式

  1. 方式1:使用样式变量修改主题的颜色,参考https://doc.vux.li/zh-CN/development/theme.html
  2. 方式2:全局样式层级覆盖
    1. 示例:
    // 注意不能加scoped
    <style lang="less">
        @import './vux-component.less';
    </style>
    
    // vux-component.less示例如下
    @normal-text-size: 1rem;
    // vux中的XHeader组件相关的样式修改
    .vux-header {
        background-color: #FFFFFF !important;
        .vux-header-title {
            font-size: @normal-text-size !important;
            color: black !important;
        }
    }
    
    1. 只修改当前页面中vux组件的样式,而不会影响到其他页面中的vux组件的样式:使用vux组件最外层的class包裹。
    // root_div是index.vue的根元素
    .root_div {
        .vux-header {
            background-color: #FFFFFF !important;
            .vux-header-title {
                font-size: @normal-text-size !important;
                color: black !important;
            }
        }
    }
    

6.vue中的数组变化侦测

  1. 在开发中应当注意到数组的变化侦测问题:比如说数组内部的数据通过赋值语句成功修改,但是页面上未渲染成最新的数组数据。
  2. 调用下面数组的方法,vue才能够侦测到数组的变化。这些方法如下:
    1. push
    2. pop
    3. shift
    4. unshift
    5. splice
    6. sort
    7. reverse

7.自适应问题

  1. 使用百分比
  2. 使用rem:相对根元素html计算
  3. 使用vw:vw是视口宽度的百分之一。

8.移动端中显示图片

  1. a标签嵌套img标签:a标签默认是行内元素,所以需要将其改为行内块或者块元素。
a {
    height: 100%;
    display: inline-block;
    // line-height设置为0时,基线与底线间距离为0,空白消除
    line-height: 0;
    img {
        width: 100%;
        height: 100%;
    }
}
  1. 使用div标签包裹图片,div标签根据设计图中的图片的宽高设置width和height。示例如下:
.urgent-note-icon {
  width: 0.56rem;
  height: 0.6rem;
  margin-right: 0.42rem;
  display:flex;
  img {
    width: 100%;
    height: 100%;
  }
}

9.给div元素添加阴影效果

  1. 使用box-shadow属性
// 示例
box-shadow: 0px 0px 10px rgba(0, 0, 0, .3); 

10.滚动条

  1. 禁止页面出现的滚动条水平移动,允许垂直方向上显示滚动条
body {
    overflow-x: hidden;
    overflow-y: auto;
}

11.文本不换行

  1. 通常使用span标签装载文字,设置文本不换行
.text_2 {
    white-space: nowrap;
}

12.行内元素设置宽度

  1. 默认给行内元素设置宽度是不生效的,需要将行内元素设置为行内块或者块元素。

13.获取用户设备位置信息

1.方式1:使用原生高德地图API
  1. 注册高德开发者, 注册高德开发者,获取API key
    image.png
  2. API key的使用:参考https://lbs.amap.com/api/javascript-api/guide/abc/prepare
  3. JS API的加载方式:
    1. 异步加载:
    import Vue from 'vue'
    export default function MapLoader() {
        // 添加script元素
        let aMapScript = document.createElement('script')
        aMapScript.setAttribute('src', 'https://webapi.amap.com/maps?v=1.4.11&key=fa8e8927e15a841310c27fd8a4eaee5b&plugin=AMap.CitySearch')
        document.head.appendChild(aMapScript)
        return aMapScript.onload = function() {
            AMap.plugin('AMap.Geolocation', function() {
                var geolocation = new AMap.Geolocation({
                    // 是否使用高精度定位,默认:true
                    enableHighAccuracy: true,
                    // 设置定位超时时间,默认:无穷大
                    timeout: 10000,
                    // 定位按钮的停靠位置的偏移量,默认:Pixel(10, 20)
                    buttonOffset: new AMap.Pixel(10, 20),
                    //  定位成功后调整地图视野范围使定位位置及精度范围视野内可见,默认:false
                    zoomToAccuracy: true,
                    //  定位按钮的排放位置,  RB表示右下
                    buttonPosition: 'RB'
                })
    
                geolocation.getCurrentPosition()
                AMap.event.addListener(geolocation, 'complete', onComplete)
                AMap.event.addListener(geolocation, 'error', onError)
    
                // 定位成功
                function onComplete(data) {
                    // 将需要的数据挂载到vue原型对象上
                    Vue.prototype.$lat = data.position.lat;
                    Vue.prototype.$lng = data.position.lng;
                }
                // 定位出错
                function onError(data) {}
            })
        }
    }
    
    1. 同步加载:
      1. 在index.html中
      <script type="text/javascript">
          window._AMapSecurityConfig = {
              securityJsCode: '安全密钥值'
                  // serviceHost:'您的代理服务器域名或地址/_AMapService',  
                  // 例如 :serviceHost:'http://1.1.1.1:80/_AMapService',
          }
      </script>
      <script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=API key值&plugin=AMap.CitySearch"></script>
      
      1. 在需要引入地图的页面中
      import AMap from 'AMap';
      
      // 在生命周期函数mounted中
      mounted() {
          AMap.plugin("AMap.Geolocation", () => {
              var geolocation = new AMap.Geolocation({
                  // 是否使用高精度定位,默认:true
                  enableHighAccuracy: true,
                  // 设置定位超时时间,默认:无穷大
                  timeout: 10000,
              });
      
              // 获取当前用户所在城市和城市的经纬度
              geolocation.getCityInfo((status, result) => {
                      if (status == "complete") {}
                  })
              //获取用户当前的精确位置
              geolocation.getCurrentPosition((status, result) => {
                  if (status == "complete") {
                      console.log("result", result)
      
                  }
              })
          })
      },
      
      1. 在webpack.base.conf.js中,module.exports={}下添加
      externals: {
          'AMap': 'AMap'
      },
      

14.地图绘制

https://lbs.amap.com/api/javascript-api/guide/overlays/toolbar

15.一行或者多行显示不下,省略号显示

  1. 一行显示不下,就省略号显示
// 一行显示不下,省略号显示
.ellipsis {
    // 不换行
    white-space: nowrap;
    overflow: hidden;
    // 省略号的意思
    text-overflow: ellipsis;
}
  1. 两行显示不下,就省略号显示
 span {
    display: -webkit-box; // 将对象作为弹性伸缩盒子模型显示。
    -webkit-box-orient:vertical;//从上到下垂直排列子元素(设置伸缩盒子的子元素排列方式)
    -webkit-line-clamp: 2; // 表示显示的行数。
    /*值可设置*/
    overflow: hidden;
}
  1. 文本提示:使用title属性
<div class="response-text ellipsis" :title="warningDetail.responseInfo">{{
    warningDetail.responseInfo
}}</div>

16.渐变背景

  1. 线性渐变:使用linear-gradient元素。线性渐变在一条直线上从一个颜色过渡到另一个颜色。语法为:background-image:linear-gradient(角度,颜色)
background: linear-gradient(90deg, #A0DCFF 0%, #1880FF 100%);

17.div的设置

  1. 一般将盒子尺寸的计算方式设置为border-box,表示宽度和高度用来设置整个盒子可见框的大小,即width和height指的是内容区和内边距和边框的总大小。在这个前提下能用padding就用padding,不用margin。
div {
    box-sizing:border-box;
}

18.公众号获取code换取openid

  1. 获取方式有两种:静默授权和非静默授权。
    1. 静默授权:没有弹窗
    2. 非静默授权:有弹窗,需要用户手动点击确认登录。非静默授权可以获取openid、用户的头像、昵称等。

19.文字滚动效果

  1. transform属性:对元素进行旋转、缩放、移动、倾斜。其值有很多:
    1. translateX:表示在二维平面上水平向右移动元素
  2. @keyframes属性:用于定义关键帧。关键帧设置了动画执行的每一个步骤
  3. 使用动画实现文字向左滚动的效果示例:
<div class="line1-right">
    <div>{{ weather.info }}&nbsp;{{
            weather.weatherMin
        }}~{{ weather.weatherMax }}</div>
</div>
.line1-right {
    display: flex;
    align-items: center;
    height: 100%;
    width: 3.6rem;
    overflow: hidden;
    div {
        @keyframes roll {
            // 0%表示动画的开始时间
            0% {
                transform: translateX(3.6rem);
            }
            // 100%:表示动画的结束时间
            100% {
                transform: translateX(-100%);
            }
        }
        // 第一个值指定动画名称
        // infinite表示动画执行的次数为无限执行
        // linear表示动画的速度曲线
        // 10s表示动画的执行时间
        animation: roll linear 10s infinite;
        font-size: 0.26rem;
        font-family: PingFangSC-Regular,
        PingFang SC;
        font-weight: 400;
        color: #363a44;
        white-space: nowrap;
        width: max-content;
    }
}