前端開發遇到的各類問題匯總


一、JS獲取滾動條位置

1、獲取坐標:

   IE  (event.x  event.y) 

2、獲取滾動條位置(網頁最前面沒有<! DOCTYPE html >):

     document.body.scrollTop (滾動條離頁面最上方的距離)

     document.body.scrollLeft   (滾動條離頁面最左方的距離)

  當我用js獲取當前垂直或者水平方向滾動條位置的時候,使用"document.body.scrollTop"或者"document.body.scrollLeft"是無效的,得到的數值永遠是0。但是,當寫在“onscroll”事件里面的時候,上述方法可以獲得當前滾動條的位置。

3、當網頁最前面有以下內容:

  <! DOCTYPE html >

     document.documentElement.scrollTop (滾動條離頁面最上方的距離)

     document.documentElement.scrollLeft   (滾動條離頁面最左方的距離)

所以為了准確取得當前滾動條的位置,正確的使用方法是:

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

 

二、通過window.onscroll來實現部分內容的適時顯示

1、實現代碼

 window.onscroll=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、 引入插件

  <script src="js/clipboard.min.js"></script>

2、基本使用

首先需要您需要通過傳遞DOM選擇器,HTML元素或HTML元素列表來實例化它。

  new Clipboard('.btn');


  1、用一個元素當觸發器來復制另一個元素的文本,data-clipboard-target屬性后需要跟屬性選擇器

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

  <button class="btn" data-clipboard-target="#foo">
  </button>

  另外還有另外一個屬性data-clipboard-action屬性,以指定是要要么copy還是要cut操作。默認情況下是copy。cut操作只適用於<input>或<textarea>元素。


  <textarea id="bar">Mussum ipsum cacilds...</textarea>

  <button class="btn" data-clipboard-action="cut" data-clipboard-target="#bar">
    Cut to clipboard
  </button>

 

  2、從屬性中復制文本,不需要另一個元素當觸發器,可以使用data-clipboard-text屬性,在后面放上需要復制的文本.

  <button class="btn" data-clipboard-text="Just because you can doesn't mean you should — clipboard.js">
    Copy to clipboard
  </button>

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

  <body>
    <input id="foo" value="https://github.com/zenorocha/clipboard.js.git">
    <button id='foo_1' class="btn" data-clipboard-target="#foo">
    </button>
  </body>
  <script>
    new Clipboard('.btn', {
      text: function(trigger) {
        if(trigger.getAttribute('id')=='foo_1'){
          return 1;
        }else{
          return 2;
        }
      }
    });
  </script>

四、微信遮罩層提示瀏覽器下載(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 ='<style>.pop-weixin{position: fixed; z-index:10; left: 0px; top: 0px; width: 100%; height: 100%; filter:alpha(opacity= 50);-moz-opacity:0.5; opacity: 0.5;}</style>',
                 domDiv = styles +'<div class="pop-weixin">',
                 doms = domDiv +'<img src="http://pic.zhangyu.tv/upload/1534489187387481.png" width=100%>';
                 doms +='</div>',
                      domh =  domDiv +'<img src="http://pic.zhangyu.tv/upload/1534488743525331.png" width=100%>';
                 domh +='</div>',
                 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插件

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.0.2/css/swiper.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.0.2/js/swiper.min.js"></script>
 
2、主要代碼:

html:

<%-- 掛件廣告位 --%>
<div class=" swiper-container ">
  <div class="swiper-wrapper">
    <div class="swiper-slide">
      <img src="" class="floatAdImg">
    </div>
    <div class="swiper-slide">
    <img src="" class="floatAdImg">
    </div>
  </div>
</div>
 
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
沒有選擇器, 規則在一個元素的 <style> 屬性里 1 0 0 0 1000

 

 十、禁止ios全屏播放 
在video標簽中加上  x5-video-player-type="h5" x5-video-player-fullscreen="true" playsinline="true" webkit-playsinline="true" x-webkit-airplay="true"  即可
 
 十一、pc端屏幕分辨率適配問題

1、電腦屏幕及尺寸(分辨率)通常有下列幾種

  1024       1280          1366      1440       1680       1920 

2、可以通過簡單的媒體查詢方式來進行屏幕適配

  PC端響應式媒體斷點

    @media (min-width: 1024px){
      body{font-size: 18px}
    } /*>=1024的設備*/

    @media (min-width: 1100px) {
      body{font-size: 20px}
    } /*>=1100的設備*/
@media (min-width: 1280px) {   body{font-size: 22px;} } /*>=1280的設備*/ @media (min-width: 1366px) {   body{font-size: 24px;} } /*>=1366的設備*/ @media (min-width: 1440px) {   body{font-size: 25px !important;} } /*>=1440的設備*/ @media (min-width: 1680px) {   body{font-size: 28px;} } /*>=1680的設備*/
@media (min-width: 1920px) {   body{font-size: 33px;} } /*>=1920的設備*/
  
  注意: 用min-width時,小的放上面大的在下面,同理如果是用max-width那么就是大的在上面,小的在下面

十二、CSS3修改單選框radio默認

<!DOCTYPE html>
<html lang="en"> <head> <meta charset="utf-8"> <title> Document </title> </meta> <style media="screen" type="text/css"> .real-radio{ display: inline-block;
          width: 15px;
          height: 15px; background-color: #fff;
          border: 1px solid #000;
          border-radious: 8px;
          cursor: pointer; } .radio > input[type=radio]:checked ~ .real-radio{
          border: 1px solid red;
background-color: red; } .radio > input[type=radio]{ display: none; } </style> </head> <body> <label class="radio"> <input name="" type="radio" value="a"/> <span class="real-radio"></span> </label> </body> </html>
 
十三、vue中實現緩慢回到頂部
<template>
  <div v-if="showOrHide">
    <p class="go-top" @click="scrollToTop"><i class="el-icon-arrow-up"></i></p>
    <p class="app-download">章魚體育</p>
  </div>
</template>

<script>
export default {
  name: 'returnTop',
  data() {
    return {
      showOrHide: false,
      scrollTop: 0
    }
  },
  mounted() {
    window.addEventListener('scroll', this.getTopHeight);
  },
  destroyed() {
    window.removeEventListener('scroll', this.getTopHeight);
  },
  methods: {
    getTopHeight: function () {
      //vue中獲取導航條到頁面頂部的距離
      let topHeight = window.pageYOffset || document.documentElement.scrollTop  || document.body.scrollTop;
 
      this.scrollTop = topHeight;
      //按鈕的顯示和隱藏
      if (this.scrollTop > 400) {
        this.showOrHide = true;
      } else {
        this.showOrHide = false;
      }
    },
    scrollToTop: function () {
      let that = this;
      //定時器,實現緩慢回到頂部
      let timer = setInterval(function(){
        let speed = Math.floor(-that.scrollTop/15);
 
        if (that.scrollTop === 0) {  //到達頂部時清除定時器
          clearInterval(timer);
        } else {
          document.documentElement.scrollTop = document.body.scrollTop= that.scrollTop + speed;
        }
      }, 20)
    }
  },
}
 
十四、js 通過數組中的對象的屬性來去重
  
  let  hash = { };
 
   arr = arr.reduce((item, next) => {
    hash[next.a] ? ' ' : hash[next.a] = true && item.push(next);
     return item;
   }, [ ]);
  
  a是數組arr中對象共有的一個屬性,即要通過該屬性來去重
 
十五、vue中判斷終端類型
新建一個utils.js文件,拋出一個browser方法

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
  };
}
 
十六、用flex布局實現內容不滿一屏時的footer吸底
1、對外部容器
  display: flex;
  flex-direction: column;
  min-height: 100vh;
2、對 內部主體內容元素
  flex: 1;
3、代碼例子
   html
  <div id="app">
    <div class="header">
      頁面頭部
    </div>
    <div class="main">
      頁面內容
    </div>
    <div class="footer">
      頁面底部
    </div>
  </div>
 
   css
  #app {
    display: flex;
    flex-direction: column;
    min-height: 100vh;

    .main {
      flex: 1;
    }
  }
 
十七、自定義radio組件
 
1、html(使用了element-ui中的icon
  <label class="radio">
    <input name="" type="checkbox" v-model="currentFlag" />
    <span class="real-radio">
      <i class="el-icon-check"></i>
    </span>
  </label>
 
2、css
  .real-radio {
    display: inline-block;
    width: 15px;
    height: 15px;
    background-color: #fff;
    border: 1px solid #BFBFBF;
    border-radius: 8px;
    cursor: pointer;
  }

  .radio>input[type=checkbox]:checked~.real-radio {
    border: 1px solid #F03D37;
    background-color: #F03D37;
  }

  .radio>input[type=checkbox] {
    display: none;
  }

  .real-radio {
    i {
      padding-top: 1px;
      color: #fff;
    }
  }
 
十八、獲取某一個cookie
  getCookie(cookiename) {
    let name = cookiename + "=";
    let cs = document.cookie.split(';');
    for (let i = 0; i < cs.length; i++) {
      let c = cs[i].trim();
      if (c.indexOf(name) == 0) {
        return c.substring(name.length,c.length);
      }
    }
  }
 
十九、 如何解決圖片防盜鏈
 1、webpack配置(未實現)
 
 2、axios配置(未實現)
 
 3、增加元標簽
    
1  <meta name="referrer" content="no-referrer">

 

二十、傳參說明
 
二十一、特殊時期全網站變素裝
 
通用方法,增加全局樣式(css的filter(濾鏡)屬性):
 
 html { 
  filter: grayscale(100%); 
  -webkit-filter: grayscale(100%); 
  -moz-filter: grayscale(100%); 
  -ms-filter: grayscale(100%); 
  -o-filter: grayscale(100%); 
  filter: url("data:image/svg+xml;utf8,#grayscale"); 
  filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); 
  -webkit-filter: grayscale(1);
  
 
            


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM