关于作业的一些问题

来源:3-2 项目作业

soso_crazy

2019-06-29 17:06:38

  1. 屏幕适配问题,我没有按照视频中的屏幕适配,改为如下的屏幕适配,不知道是否有问题?


    ;(function () {
       'use strict';

       var docEl=document.documentElement,
           viewPortEl=document.querySelector('meta[name="viewport"'),
           dpr=window.devicePixelRatio||1,
           maxWidth=1204,
           minWidth=320;

       dpr=dpr>=3?3:(dpr>=2?2:1);

       docEl.setAttribute('data-dpr',dpr);
       docEl.setAttribute('max-width', maxWidth);
       docEl.setAttribute('min-width', minWidth);

       var scale=1/dpr,
           content='width=device-width,initial-scale='+scale+',maximum-scale='+scale+',minimum-scale='+scale+',user-scalable=no';

       if (viewPortEl) {
           viewPortEl.setAttribute('content',content);
       } else {
           viewPortEl=document.createElement('meta');
           viewPortEl.setAttribute('name','viewport');
           viewPortEl.setAttribute('content',content);
           document.head.appendChild(viewPortEl);
       }
       
       setUnitRem();
       
       window.addEventListener('resize',setUnitRem);
       window.addEventListener('pageshow',function (e) {
           if (e.persisted) {
               setUnitRem();
           }
       });
       
       function setUnitRem() {
           //以手机375px做标准,px2rem设置root font-size为37.5。所以ratio=375/37.5
           var ratio=10,
               viewWidth=docEl.getBoundingClientRect().width||window.innerWidth;

           console.log(viewWidth);
           //如果不设置最大最小宽度,viewWidth=viewWidth*dpr

           if (maxWidth&&(viewWidth/dpr>maxWidth)) {
               viewWidth=maxWidth*dpr;
           }else if (minWidth && (viewWidth / dpr < minWidth)) {
               viewWidth = minWidth * dpr;
           }

           docEl.style.fontSize=viewWidth/ratio +'px';
       }
    })();

2.关于左右侧数据联动的思路是什么?

3.为什么在shopBar.js中,点击购物车加减号联动左右侧是$('.left-item.active').click();?

4.为什么在right.js中addClick()中,$item=$(e.currentTarget).parents('.menu-item').first();为什么要加上first()?不是通过e.currentTarget获取到的.plus对应的menu-item只有一个,为什么还要加上first()?


function addClick() {
   $('.menu-item').on('click','.plus',function (e) { //e.curretnTarget是.plus
       //找到被点击.plus元素的父元素中子元素的.count元素
       var $count=$(e.currentTarget).parent().find('.count');

       $count.text(parseInt($count.text()||0)+1);

       $item=$(e.currentTarget).parents('.menu-item').first();

       //将右侧点击加号对应的menu-item,获取其在getMenuList中绑定的数据
       var itemData=$item.data('itemData');

       //当点击加号改写对应menu-item中绑定的数据中的chooseCount
       itemData.chooseCount=itemData.chooseCount+1;

       //联动购物车渲染内容函数
       window.ShopBar.renderItems();


   });

   $('.menu-item').on('click','.reduce',function (e) {
      var $count=$(e.currentTarget).parent().find('.count');

      if ($count.text()==0) return;
      $count.text(parseInt($count.text()||0)-1);

      var $item=$(e.currentTarget).parents('.menu-item').first();

      //获取右侧menu-item在渲染时绑定的数据(查看getMenuList)
      var itemData=$item.data('itemData');

      //点击减号,改变数据中的chooseCount
      itemData.chooseCount=itemData.chooseCount-1;

      //选择右侧菜品联动购物车菜品内容
      window.ShopBar.renderItems();

   });
}


写回答

1回答

好帮手慕慕子

2019-06-29

同学你好, 

  1. 你的这种适配方案在前面的移动端课程中,老师也讲过, 是可以实现适配效果的

  2. 左右侧数据联动的思路就是

    1)渲染左侧选项卡的时候,将每个选项卡对应的数据,通过data方法存储在对应的元素上

    http://img.mukewang.com/climg/5d173ce400013cf507660357.jpg

    2)在点击对应的选项卡,获取选项卡上存储的数据, 传递给右侧列表渲染数据

    http://img.mukewang.com/climg/5d173d380001e84a07800294.jpg

  3. $('.left-item.active').click()的主要作用是为了触发左侧选项的点击事件,因为左侧选项卡点击事件中调用了右侧渲染列表的refresh方法,所以可以重新渲染右侧列表

    1)从第二条可以知道, 右侧列表渲染的数据是从左侧传入进来的, 在购物车中点击加减号的时候,需要更新右侧列表的数据,所以每点击一次需要调用右侧的refresh这个函数重新渲染列表,实现联动效果。

    2)这里只是为了触发左侧的点击事件,调用refresh方法, 所以也可以直接写成$('.left-item').click();触发点击事件。

    3)老师这里写成$('.left-item.active')只触发选中选项卡的点击事件达到更新数据的目的。 提高程序的运行效率

  4. 同学你好, 这里可以直接使用$(e.currentTarget).parents('.menu-item')表示获取到得对应的menu-item, 老师这里写只是为了代码的严谨性可以可扩展性(后续可能会增加其他元素, 此时代码也不会报错)

如果帮助到了你, 欢迎采纳!

祝学习愉快~~~~


0

0 学习 · 6815 问题

查看课程