前端开发遇到的各类问题汇总

一、JS获取滚动条位置

1、获取坐标:

   IE  (event.x  event.y) 

2、获取滚动条位置(网页最前面没有):

     document.body.scrollTop (滚动条离页面最上方的距离)

     document.body.scrollLeft   (滚动条离页面最左方的距离)

  当我用js获取当前垂直或者水平方向滚动条位置的时候,使用"document.body.scrollTop"或者"document.body.scrollLeft"是无效的,得到的数值永远是0。但是,当写在“onscroll”事件里面的时候,上述方法可以获得当前滚动条的位置。

3、当网页最前面有以下内容:

  

     document.documentElement.scrollTop (滚动条离页面最上方的距离)

     document.documentElement.scrollLeft   (滚动条离页面最左方的距离)

所以为了准确取得当前滚动条的位置,正确的使用方法是:

     document.documentElement.scrollTop:垂直方向
     document.documentElement.scrollLeft:水平方向

 

二、通过window.onscroll来实现部分内容的适时显示

1、实现代码

 window.οnscrοll=function(){
   var fixed=document.getElementById("fixed");    //获取需要适时显示的元素节点
   var scrollTop = document.documentElement.scrollTop||window.pageYOffset||document.body.scrollTop;    //滚动条与页面顶部距离(包括pc端和移动端),window.pageYOffset和document.body.scrollTop用于获取移动端距离
   var allHeight=window.screen.height;    //获取整个页面的高度
   console.log("滚动条与页面顶部距离:"+scrollTop);
   console.log("整个屏幕的高度:"+allHeight);
   if(scrollTop>allHeight*1.2){    //给出判断条件,即高度如何时进行以下逻辑
     fixed.className="fix";     //给获取的元素节点加上相应的样式
   }else{
     fixed.className=" ";    //给获取的元素节点去除相应的样式
   }
 }

 

三、clipboard.js(插件)实现复制粘贴

1、 引入插件

  

2、基本使用

首先需要您需要通过传递DOM选择器,HTML元素或HTML元素列表来实例化它。

  new Clipboard('.btn');


  1、用一个元素当触发器来复制另一个元素的文本,data-clipboard-target属性后需要跟属性选择器

  id="foo" value="https://github.com/zenorocha/clipboard.js.git">

  

  另外还有另外一个属性data-clipboard-action属性,以指定是要要么copy还是要cut操作。默认情况下是copy。cut操作只适用于

  

 

  2、从属性中复制文本,不需要另一个元素当触发器,可以使用data-clipboard-text属性,在后面放上需要复制的文本.

  

3、其他说明

  1、通过运行检查clipboard.js是否支持Clipboard.isSupported(),返回true则可以使用。
  2、显示一些用户反馈或捕获在复制/剪切操作后选择的内容。操作,文本,触发元素

  var clipboard = new Clipboard('.btn');

  clipboard.on('success', function(e) {   console.info('Action:', e.action);   console.info('Text:', e.text);   console.info('Trigger:', e.trigger);   e.clearSelection();   });   clipboard.on('error', function(e) {   console.error('Action:', e.action);   console.error('Trigger:', e.trigger);   }); 

 

  3、该插件使用的是事件委托的方式来触发,所以大大减少了对dom的操作。

4、高级使用

如果你不想修改你的HTML,那么你可以使用一个非常方便的命令API。所有你需要做的是声明一个函数,写下你想要的操作,并返回一个值。下面是一个对不同id的触发器返回不同的值的例子。具体的使用方法请看https://clipboardjs.com

  
    
    
  
  

四、微信遮罩层提示浏览器下载(H5开发)

1、基本代码
  (1)、原生js
         var Terminal = {
           // 辨别移动终端类型
           platform : function(){
             var u = navigator.userAgent;
                     var app = navigator.appVersion;
             return {
                trident: u.indexOf('Trident') > -1, //IE内核
               presto: u.indexOf('Presto') > -1, //opera内核
               webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核
               gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1,//火狐内核
               mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端
               iOS: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
               Android: u.indexOf('Android') > -1 ,//android终端
                           Uc: u.indexOf('Linux') > -1, //uc浏览器
               iPhone: u.indexOf('iPhone') > -1 , //是否为iPhone或者QQHD浏览器
               iPad: u.indexOf('iPad') > -1, //是否iPad
               webApp: u.indexOf('Safari') == -1, //是否web应用程序,没有头部与底部
               weixin: u.indexOf('MicroMessenger') > -1, //是否微信 (2015-01-22新增)
               qq: u.match(/\sQQ/i) == " qq" //是否QQ
             };
           },
           // 辨别移动终端的语言:zh-cn、en-us、ko-kr、ja-jp...
           language : (navigator.browserLanguage || navigator.language).toLowerCase()
         }
          // 根据不同的终端,跳转到不同的地址
           var styles ='',
                 domDiv = styles +'
',
                 doms = domDiv +'';
                 doms +='
',
                      domh =  domDiv +'';
                 domh +='
',
                 theUrl = '',
                 isThis = Terminal.platform;
            //判断是否为移动终端
                 if(!isThis.mobile){
                      theUrl = 'http://resource.ws.kukuplay.com/zhangyu/download/zhangyutv-3.1.1-main-release.apk';
                 }else if( isThis.Android){                      //判断是否为Android设备
                 if( isThis.weixin){                             //判断是否为微信端
                     $("body").append(doms);
                          self.downloadInWeixin = true;                     //让微信浏览器识别下载
                window.location.hash = 'download';
                return;
              }else{
                     $(".pop-weixin").hide();
                }
              theUrl = 'http://resource.ws.kukuplay.com/zhangyu/download/zhangyutv-3.1.1-main-release.apk';     //安卓下载链接
           }else if( isThis.iPhone || isThis.iPad){                                                  //判断是否为ios端
              if( isThis.weixin){                                                                                //判断是否为微信端
                   $("body").append(domh);
                        self.downloadInWeixin = true;                        //让微信浏览器识别下载
                window.location.hash = 'download';
                return;
              }else{
                   $(".pop-weixin").hide();
              }
              theUrl = 'https://apk.zhangyu.tv/download/ota/';    //ios下载链接
           }
           if(theUrl != ""){
                     if(!isThis.mobile){
                          location.href = theUrl;
                   }else if(isThis.iPhone || isThis.iPad){
                     location.href = theUrl;
                }else if(isThis.Android){
                     location.src = theUrl;
                }
           }else{
                theUrl="" ;
           }
         }
 
   补充:
   ES6语法
    export function browser() {
      const u = navigator.userAgent;

      return {
        mobile: !!u.match(/AppleWebKit.*Mobile.*/),
        ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),
        android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1,
        iPhone: u.indexOf('iPhone') > -1,
        iPad: u.indexOf('iPad') > -1,
        isWx: u.indexOf('MicroMessenger') > -1,
        isQQ: u.indexOf('QQ/') > -1,
        isQQbrowser: u.indexOf('QQBrowser'),
        isWeiBo: u.indexOf('weibo') > -1,
        isLive: window.location.href.indexOf('islive') > -1
      };
    }

 五、腾讯营销QQ解决方案(网页上的客服聊天功能)

1、官网链接

https://id.b.qq.com/login/index

2、说明文档

 https://files.cnblogs.com/files/huangfeihong/%E8%85%BE%E8%AE%AF%E8%90%A5%E9%94%80QQ%E4%BA%A7%E5%93%81%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3.rar

 

六、H5移动页面自适应手机屏幕的方法

 

七、iOS/Android 微信及浏览器中唤起本地APP

 

八、pc端实现轮播效果

1、使用swiper插件

 
2、主要代码:

html:

<%-- 挂件广告位 --%>
  
    
      
    
    
    
    
  
 
css:
  自己定义
 
js:
//初始化Swiper对象
var mySwiper = new Swiper('.swiper-container', {
  autoplay:{
    dalay:1000,
  },
  loop:true,
});
//鼠标移进去的时候停止轮播
$(".swiper-container").mouseenter(function(){
  mySwiper.autoplay.stop();
});
//鼠标移出的时候开始轮播
$(".swiper-container").mouseleave(function(){
  mySwiper.autoplay.start();
});
 
九、css的层级问题
可以通过选择器具有的专用性的量来判定选择器的优先级,这种专用性的量是用四种不同的值来衡量的。它们可以被认为是千位、百位、十位和个位——在四个列种的简单数字:
1、千位:  如果声明实在style属性中该列加1分(这样的声明没有选择器,所以它们的专用性总是1000)否则为0
2、百位:在整个选择器中每包含一个ID选择器就在该列中加1分
3、十位:在整个选择器中每包含一个类选择器、属性选择器、或者伪类就在该列种加1分
4、个位:在整个选择器中每包涵一个元素选择器或者伪元素就在该列中加1分
选择器 千位 百位 十位 个位 合计值
h1(元素选择器) 0 0 0 1 0001
#indentifier(ID选择器) 0 1 0 0 0100
h1(元素选择器) + p(元素选择器)::first-letter(伪类) 0 0 0 3 0003
li(元素选择器)> a(元素选择器)[href*="zh-CN"](属性选择器) > .inline-warning(类选择器) 0 0 2 2 0022
没有选择器, 规则在一个元素的