顯示具有 OWDL - Language 標籤的文章。 顯示所有文章
顯示具有 OWDL - Language 標籤的文章。 顯示所有文章

星期日, 12月 10, 2023

表格第一列及第一行固定不動

 【語法】

<!DOCTYPE html>

<html>

<head>

   <meta charset="UTF-8">

   <title>表格第一列及第一行固定不動</title>

</head>

<style>

  div{

    width:70%;

    height:286px;

    overflow:auto;/* div高度有效。無此值則表格無捲軸 */

  }

  table {

    border:0px solid red; /* 測試用 */

    table-layout: fixed;

    width: 200px; /* 固定寬度 */

    border-collapse: collapse;

  }

  td, th {

    border:1px solid gray;

    border-left:0px;

    border-top:0px;

    width:100px;

  }

  td{

    left:0;     /* 須為0,行首全部固定,左右捲軸不能動。此屬性放在 td:first-child 也可以 */

    height:30px;

  }

  th {

    position:sticky;

    top:0;        /* 須為0,列首全部固定,上下捲軸不能動(包括灰色的那一格) */

    height:36px;

    background-color:lightblue;

  }

  th:first-child{

    position:sticky;

    left:0;      /* 須為0,列首第一格固定,左右捲軸不能動(包括灰色的那一格) */

    z-index:1;   /* 值須大於等於 1,代表固定不動。若等於0,則直橫向捲動都會變動 */

    background-color:lightgrey;

  }

  td:first-child{

    position:sticky; /* 「必須」放在此處*/

    background-color:lightpink;

  }


</style>

<body>

<div>

   <table>

      <thead>

         <tr>

            <th>交叉</th>

            <th>行一</th>

            <th>行二</th>

            <th>行三</th>

            <th>行四</th>

         </tr>

      </thead>


      <tbody align="center">

         <tr>

            <td>列一</td>

            <td>行01列01</td>

            <td>行02列01</td>

            <td></td>

            <td></td>

         </tr>


         <tr>

            <td>列二</td>

            <td>行01列02</td>

            <td></td>

            <td></td>

            <td></td>

         </tr>


         <tr>

            <td>列三</td>

            <td></td>

            <td></td>

            <td></td>

            <td></td>

         </tr>


         <tr>

            <td>列四</td>

            <td></td>

            <td></td>

            <td></td>

            <td></td>

         </tr>


         <tr>

            <td></td>

            <td></td>

            <td></td>

            <td></td>

            <td></td>

         </tr>


         <tr>

            <td></td>

            <td></td>

            <td></td>

            <td></td>

            <td></td>

         </tr>


         <tr>

            <td></td>

            <td></td>

            <td></td>

            <td></td>

            <td></td>

         </tr>


         <tr>

            <td></td>

            <td></td>

            <td></td>

            <td></td>

            <td></td>

         </tr>


         <tr>

            <td></td>

            <td></td>

            <td></td>

            <td></td>

            <td></td>

         </tr>


         <tr>

            <td></td>

            <td></td>

            <td></td>

            <td></td>

            <td></td>

         </tr>


         <tr>

            <td></td>

            <td></td>

            <td></td>

            <td></td>

            <td></td>

         </tr>


         <tr>

            <td></td>

            <td></td>

            <td></td>

            <td></td>

            <td></td>

         </tr>


         <tr>

            <td></td>

            <td></td>

            <td></td>

            <td></td>

            <td></td>

         </tr>

      </tbody>

   </table>

</div>

</body>

</html>


【截圖】

以下 Chrome:


以下 Firefox:




以下 Edge:


星期六, 9月 17, 2022

從 Javascript 修改 CSS

 <!DOCTYPE html>
<html><head></head>
<body>
<p id="foo">hello world</p>
<script>
    var foo = document.getElementById('foo');
    foo.style.color = 'blue';
    foo.style.fontWeight="bold";
    foo.style.fontSize="20px";
 
    // 函數-橫槓式
//    foo.style.setProperty("background-color","lightblue");
 
    // 函數-簡寫式
//    foo.style.setProperty("background","lightblue");
 
    // 函數-駝峰式(失敗,無此方式)
//    foo.style.setProperty("backgroundColor","lightblue");
 
    // 陣列-橫槓式
//    foo.style['background-color'] = '#ddd';
 
    // 陣列-駝峰式
//    foo.style['backgroundColor'] = 'lightyellow';
 
    // 陣列-簡寫式
//    foo.style['background'] = 'blue';
 
    // 橫槓式 (失敗,無此方式)
//    foo.style.background-color = "#eeb";
 
    //駝峰式
//    foo.style.backgroundColor = 'yellow';
 
    //簡寫式
//    foo.style.background = 'rgb(200,150,100)';
</script>
</body>
</html>

星期五, 9月 16, 2022

CSS background 3個應用範例

CSS 參考來源:點閱
CSS3 參考來源:點閱

現在大部份人使用 background 都是一個一個設定它的其它屬性,但若不涉及CSS3新增的屬性時,它其實可一次設定完畢!

-----------------------------------------------------
1、不同 Background 的宣告方式
-----------------------------------------------------
<!DOCTYPE html>
<html><head></head>
<body>
<style>
    div{
        border:1px solid red;
        width:200px;
        height:200px;
    }
    .test1{
        /* 原始大小 */
        background: #fff url('https://drive.google.com/uc?export=view&id=1bEx-mum880QycaawzUN7I26weTMNS-Me') no-repeat;
    }
    .test2{
        /* 新舊語法混合用,圖像最大化且不失真 */
        background: #fff url('https://drive.google.com/uc?export=view&id=1bEx-mum880QycaawzUN7I26weTMNS-Me') no-repeat;
        background-size:contain;
    }
    .test3{
        /* 新舊語法混合用,圖像最大化,要固定在div背面時,「卻穿透粘在body背景」 */
        background: #fff url('https://drive.google.com/uc?export=view&id=1bEx-mum880QycaawzUN7I26weTMNS-Me') no-repeat fixed;
        background-size:contain;
    }
    .test4{
        /* 新舊語法混合用,圖像最大化且失真 */
        background: #fff url('https://drive.google.com/uc?export=view&id=1bEx-mum880QycaawzUN7I26weTMNS-Me') no-repeat;
        background-size:cover;
    }
    .test5{
        /* 只用新語法,圖像最大化且不失真 */
        background-image:url('https://drive.google.com/uc?export=view&id=1bEx-mum880QycaawzUN7I26weTMNS-Me');
        background-repeat:no-repeat;
        background-size:contain;
        background-attachment:;
    }
</style>
第一個(原始大小)<br/>
<div class="test1"></div>
<p><br/>
第二個(一個 background 把各屬性全宣告完畢,結果正常)<br/>
<div class="test2"></div>
<p><br/>
第三個(要固定在div背面時,「卻穿透粘在body背景」)<br/>
<div class="test3"></div>
<p><br/>
第四個(background-size:cover 使底端不能正常顯示)<br/>
<div class="test4"></div>
<p><br/>
第五個(使用多個屬性才宣告完畢,結果也是正常)<br/>
<div class="test5"></div>
</body>
</html>


----------------------------------------------------------
2、background 上傳圖片及設定之運用
----------------------------------------------------------
<!DOCTYPE html>
<html><head></head>
<body>
<style>
    div{
        border:1px solid red;
        width:200px;
        height:200px;
    }
    .test1{
        /* 使用原始大小 */
        background: #fff url('https://drive.google.com/uc?export=view&id=1bEx-mum880QycaawzUN7I26weTMNS-Me') no-repeat;
    }
    .test2{
        /* 新舊語法混合用,圖像最大化且不失真 */
        background: #fff url('https://drive.google.com/uc?export=view&id=1bEx-mum880QycaawzUN7I26weTMNS-Me') no-repeat;
        background-size:contain;
    }
    .test3{
        /* 新舊語法混合用,Div 背景圖像最大化,固定在背景時『卻穿透粘在body背景上』*/
        background: #fff url('https://drive.google.com/uc?export=view&id=1bEx-mum880QycaawzUN7I26weTMNS-Me') no-repeat fixed;
        background-size:contain;
    }
    .test4{
        /* 新舊語法混合用,圖像最大化且失真 */
        background: #fff url('https://drive.google.com/uc?export=view&id=1bEx-mum880QycaawzUN7I26weTMNS-Me') no-repeat;
        background-size:cover;
    }
    .test5{
        /* 只用新語法,圖像最大化且不失真 */
        background-image:url('https://drive.google.com/uc?export=view&id=1bEx-mum880QycaawzUN7I26weTMNS-Me');
        background-repeat:no-repeat;
        background-size:contain;
        background-attachment:;
    }
</style>
<div class="test1"></div>
<p>
<div class="test2"></div>
<p>
<div class="test3"></div>
<p>
<div class="test4"></div>
<p>
<div class="test5"></div>
</body>
</html>


-----------------------------------------------------
3、background 之二圖片合併應用
-----------------------------------------------------
<!DOCTYPE html>
<html><head></head>
<body>
<style>
#example1 {
    margin-top:0px;
    background: url(https://drive.google.com/uc?export=view&id=1-J20rOq4FT45R9Fqe1PJmahdBwnX5zZ0) right bottom no-repeat, url(https://drive.google.com/uc?export=view&id=1W-VLYg2ZvLcyvcrw2bOMWKYDd7Lc12Lg) left top repeat;
    padding: 15px;
}
 
</style>
<div id="example1">
<h1>不是痛苦,只是不痛快</h1>
<p>一些官員只求自己職位,疏忽了人民需求,不是停用就是搞網軍。若一個國家會衰敗,這些蠹蟲是禍首!</p>
<p>我自反省,由於已看透這些爪耙子的底細,因他們而導致國民之損失,我並不感覺痛苦,只是心中不痛快而已~</p>
</div>
 
</body>
</html>

星期一, 7月 18, 2022

w3schools.com CSS 174種範本展示

※ 174種CSS 範本展示,包括各類 HTML 標籤(tag)的 CSS 設定範本

・CSS accent-color:三個物件,Checkbox、Radiobutton、Range
・CSS align-content:文字列的排列方式
・CSS align-items:Flexbox 的上下排列方式
・CSS align-self:Flexbox 的自訂排列的方式 (algin-self 取代 Flexbox 預設的排列方法)
・CSS backdrop-filter:背景瀘鏡的運用(濾鏡功能,可把前景物件變透明)

星期五, 7月 15, 2022

常用網頁字符

 字 符     HTML Name     HTML Code     CSS Code      說  明 
×   &times;   &#215;   \00D7   乘法的叉叉,右上方關閉視窗的通用叉叉
✕   空   &#10005;   \2715   網頁顯示中,大「乘法叉」近一半。在一般記事本則只略大一小點,近乎相同
‹   &lsaquo;   &#8249;   \2039   微
›   &rsaquo;   &#8250;   \203A   微
❬               細
❭               細
❮               中
❯               中
❰               粗
❱               粗
«   &laquo;
  &#171;   \00AB   放大至50px就會順眼
»   &raquo;   &#187;   \00BB   放大至50px就會順眼
✖   空   &#10006;   \2716   粗體的叉叉字符
○   空   &#000;   \0000   空白
○   空   &#000;   \0000   空白
○   空   &#000;   \0000   空白
○   空   &#000;   \0000   空白
○   空   &#000;   \0000   空白
○   空   &#000;   \0000   空白
○   空   &#000;   \0000   空白
○   空   &#000;   \0000   空白
○   空   &#000;   \0000   空白
○   空   &#000;   \0000   空白
○   空   &#000;   \0000   空白
○   空   &#000;   \0000   空白
○   空   &#000;   \0000   空白
○   空   &#000;   \0000   空白

※ 常用字符連結網頁:
  ・☑✖
  ・☐☒

※ 背誦字符的簡單方式:
  ・記下它的 「 Unicode Number 」,它通常等同 CSS Code,或八進位的編號。
  ・八進位的背誦方式,是加一個「 x 」,以✖為例是 「 &#x 」 加上 「 2716; 」

※ 全部字符:
  ・(英) HTML4,5 Entity Name (字符) A~Z - w3schools.com
  ・(繁) HTML 4, 5 Entity Name (字符) A~Z - w3big.com

星期日, 4月 18, 2021

Web Share to 語法

◆ LINE 範例

https://social-plugins.line.me/lineit/share?url=https://hahow.in/&text=%E8%B7%9F%20YouTuber%20%E8%8E%AB%E5%BD%A9%E6%9B%A6%E5%AD%B8%E7%BE%8E%E5%9C%8B%E9%81%93%E5%9C%B0%E7%9A%84%E8%AA%AA%E8%A9%B1%E7%BF%92%E6%85%A3%20https%3A%2F%2Fhahow.in%2Fcourses%2F5f14aeabcad0d0afe5ea3898%2Fmain&from=line_scheme 

 

◆ Facebook 範例

https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fhahow.in%2Fcourses%2F5f14aeabcad0d0afe5ea3898%2Fmain&quote=%E8%B7%9F%20YouTuber%20%E8%8E%AB%E5%BD%A9%E6%9B%A6%E5%AD%B8%E7%BE%8E%E5%9C%8B%E9%81%93%E5%9C%B0%E7%9A%84%E8%AA%AA%E8%A9%B1%E7%BF%92%E6%85%A3&v=3

 

◆ LinkedIn 範例

https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Flink.medium.com%2FIoIhlZpCzfb

星期一, 9月 21, 2020

即時預覽圖片、多檔上傳 (with no bootstrap, no JQuery)


程式碼:

<!DOCTYPE html>

<html lang=zh-Hant>

<head>

<title>preview picture with no bootstrap no jQuery</title>

    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

</head>

<style>  

#OriginInput{

border:1px solid red;

height:30px;  

opacity:100; /* 必須為 0,覆蓋的「綠色圖片按鈕」才有作用 */

  width:90px;

        cursor:pointer;


}  

    #click_me{/*這是圖片,來當覆蓋按鈕*/

    margin-top:0px;

    margin-left:-60px;

        opacity:100; /* 0:不顯示 */

        /* cursor:pointer; 没作用,被 #OriginInput 強制取代 */

    }


</style>  

<body>

(1) 三種方式取得上傳圖片資料:二進位碼字串、UTF-8字串、Base64編碼字串。<br />

    (2) 上傳圖檔絕對路徑不正確,基本是瀏覽器之安全設定問題<br />

    (3) 綠色圖片游標變手型時,點按可上傳圖檔 但CSS要先設定 OriginInput.opacity = 0<br />

    (4) 預覽圖片可依需求動態調整大小<br />

    (5) 本程式已有多檔上傳功能,略改寫就能達到<br />

    <br />

    

    <div id="result" style="border:1px solid red;">測試結果區</div>

<form action="後台程式名.php" method="post" enctype="multipart/form-data">

<input id="PretendInput" type="text" readonly >

<input id="OriginInput" type="file"  multiple accept="image/gif, image/jpeg, image/png"  onchange="setFilePath()" >

<img id="click_me" src="https://via.placeholder.com/100x35/00FF00/" ><br />

</form>

</body>

<script>

function setFilePath(){


//--- 取得單一檔案路徑 + 檔名 - 第1種正確 => 

        var oOriginInput=document.getElementById("OriginInput");

        var oFiles=document.getElementById("OriginInput").files[0];

        if(oFiles && oFiles.name.trim().length > 4){

            let reader = new FileReader();


/*

            //-- 開始:用二進位字串顯示圖片資料 (讀出圖片16進位資料)

reader.readAsBinaryString(oFiles);

reader.onload = function(e) {

let vData = e.target.result;

                document.getElementById("result").innerHTML = null;

document.getElementById("result").innerHTML = vData;

};

            //-- 結束

*/

/*

            //-- 開始:用UTF-8字串顯示圖片資料 (讀出圖片16進位資料,呈現很多都無字型碼)

reader.readAsText(oFiles,'UTF-8');

reader.onload = function (e) {

let vData = e.target.result;

                document.getElementById("result").innerHTML = null;

document.getElementById("result").innerHTML = vData;

};

            //-- 結束

*/


            //-- 開始:解譯Base64編碼,直接預覽圖片 (讀出圖片16進位資料)

            reader.readAsDataURL(oFiles);

            reader.onload = function (e) {

                let vData = e.target.result;

                

                //let vData = document.getElementById("OriginInput").result; <= 錯誤語法

                //說明:(1) e.target == document.getElementById("OriginInput"), 但是 input

                //         没有 result 屬性。

                //     (2) 判斷 e.target 應該是最早取得結果值的物件,而 OriginInput 則是較後期才

                //         取得上傳的資料(或由e.target 把部份值塞給 OriginInput 的屬性變數)。

                

                //塞入完整「檔案路徑 + 檔名」

                document.getElementById("PretendInput").value=oOriginInput.value;

                            

                //預覽檔名

                document.getElementById("result").innerHTML =null;

                document.getElementById("result").innerHTML =oFiles.name + " <br /> ";

                

                //預覽圖片 (以下這段程式中的 vData 資料不是字串,是base64之圖片編碼)

                document.getElementById("result").innerHTML += "<img src='" + vData + "' style='width:120px;height:120px;'  alt='" + oFiles.name + "' />";

            };         

        //-- 結束


        }else{

        document.getElementById("PretendInput").value="";

        }



    

/*

        //--- 第2種 -- 取得單一「檔案路徑 + 檔名」之結果不正確 => C:\fakepath\sa.png

        var oFilePath=document.getElementById("OriginInput");       

        if(oFilePath.value.trim().length > 0){

document.getElementById("PretendInput").value=oFilePath.value;

alert("取得檔案路徑及檔名:" + oFilePath.value);

        }else{

        document.getElementById("PretendInput").value="";

        }

*/        


/*

        //--- 取得檔案名稱(適合多檔上傳架構)

        var oFiles=document.getElementById("OriginInput").files;

        var j=oFiles.length;

//console.log("共 " + j + " 個檔名");


        for(let i=0;i<j;i++){

if (oFiles[i]){

//alert("取得第 " + parseInt(i+1) + " 個檔名:" + oFiles[i].name.trim());

                

//以下三個有反應

console.log("取得第 " + parseInt(i+1) + " 個 name:" + oFiles[i].name.trim());

console.log("取得第 " + parseInt(i+1) + " 個 type:" + oFiles[i].type.trim());

console.log("取得第 " + parseInt(i+1) + " 個 size:" + oFiles[i].size);

                

//以下二個 undefined                

console.log("取得第 " + parseInt(i+1) + " 個 tmp_name:" + oFiles[i].tmp_name);

console.log("取得第 " + parseInt(i+1) + " 個 error:" + oFiles[i].error);

}

}

*/


/*

        //--- 取得檔案名稱(適合單檔上傳架構)

        var oFiles=document.getElementById("OriginInput").files;

        

//if(oFiles && oFiles.length>0 && sFileName.length > 0){

        if(oFiles){

        let sFileName=oFiles[0].name.trim();

        document.getElementById("PretendInput").value=sFileName;

        alert("取得檔案名稱:" + sFileName);

        }else{//清空檔名

        document.getElementById("PretendInput").value="";

        }

*/

}  

</script>

</html>

星期日, 9月 20, 2020

即時預覽圖片、單檔上傳 (with bootstrap & JQuery)








原始程式碼:

<!DOCTYPE html>

<html lang=zh-Hant>

<head>

<title>picture upload with bootstrap and jQuery</title>

    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" rel="stylesheet" type="text/css">

<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js" ></script>

<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js"></script>

<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" ></script>

</head>

<style>

  .image-preview-wrapper{

    display: block;

    max-width: 310px;

    max-height: 310px;

    width: 100%;

    border: 2px solid #cccccc;

    margin: 0 auto;

    position: relative;

    cursor: pointer;

  }


  .spinner-wrapper {

    opacity: 0;

    margin: 0;

    padding: 0;

    left: 50%;

    top: 50%;

    transform: translate(-50%, -50%);

  }


  .opacity-1 {

    opacity: 1;

  }

  

  #idSubmit{

  cursor:pointer;

  }

  

  #file-uploader, #idFilePath{

  cursor:pointer;

  }


</style>


<body>

<br /><br />

<div class="row">

<div class="col-12 col-md-6 mx-auto">

  <a style="float:left" href="https://pjchender.blogspot.com/2019/01/js-javascript-input-file-upload-file.html">程式來源</a>

</div></div>            

<br /><br />

    

<label class="text-center mb-5 image-preview-wrapper" for="file-uploader">

<img src="https://via.placeholder.com/500x300?text=click to upload" alt="image-placehoder" class="img-thumbnail" data-target="image-preview">

    <!-- loading --->

<div class="spinner-wrapper position-absolute" data-target="spinner">

<div class="spinner-border text-secondary" role="status">

<span class="sr-only">Loading...</span>

</div>

</div>

</label>


  

<div class="row">

<div class="col-12 col-md-6 mx-auto">

<div class="custom-file">

<form action="後台程式名.php" method="post" enctype="multipart/form-data">

<input type="file" class="custom-file-input"  id="file-uploader" multiple accept="image/gif, image/jpeg, image/png" data-target="file-uploader" onchange="setFilePath()" >

<label class="custom-file-label"  id="idFilePath">點按上傳檔案</label>

                    <br /><br />

                    <input type="submit" id="idSubmit" value="Submit">

</form>

</div>

</div>

</div>


</body>


<script>

function setFilePath(){

    document.getElementById("idFilePath").innerText=document.getElementById("file-uploader").value;

    }

</script>


<script>

// STEP 1: select element and register change event

const imagePreview = document.querySelector('[data-target="image-preview"]');

const spinner = document.querySelector('[data-target="spinner"]');

const fileUploader = document.querySelector('[data-target="file-uploader"]');

fileUploader.addEventListener("change", handleFileUpload);


async function handleFileUpload(e) {

  try {

const file = e.target.files[0];

setUploading(true);

if (!file) return;


const beforeUploadCheck = await beforeUpload(file);

if (!beforeUploadCheck.isValid) throw beforeUploadCheck.errorMessages;


const arrayBuffer = await getArrayBuffer(file);

const response = await uploadFileAJAX(arrayBuffer);

alert("File Uploaded Success");

showPreviewImage(file);

  } catch (error) {

alert(error);

console.log("Catch Error: ", error);

  } finally {

e.target.value = '';  // reset input file

setUploading(false);

  }

}


// STEP 2: showPreviewImage with createObjectURL

// If you prefer Base64 image, use "FileReader.readAsDataURL"

function showPreviewImage(fileObj) {

  const image = URL.createObjectURL(fileObj);

  imagePreview.src = image;

}


// STEP 3: change file object into ArrayBuffer

function getArrayBuffer(fileObj) {

  return new Promise((resolve, reject) => {

const reader = new FileReader();

// Get ArrayBuffer when FileReader on load

reader.addEventListener("load", () => {

  resolve(reader.result);

});


// Get Error when FileReader on error

reader.addEventListener("error", () => {

  reject("error occurred in getArrayBuffer");

});


// read the blob object as ArrayBuffer

// if you nedd Base64, use reader.readAsDataURL

reader.readAsArrayBuffer(fileObj);

  });

}


// STEP 4: upload file throguth AJAX

// - use "new Uint8Array()"" to change ArrayBuffer into TypedArray

// - TypedArray is not a truely Array,

//   use "Array.from()" to change it into Array

function uploadFileAJAX(arrayBuffer) {

  // correct it to your own API endpoint

  return fetch("https://jsonplaceholder.typicode.com/posts/", {

headers: {

  version: 1,

  "content-type": "application/json"

},

method: "POST",

body: JSON.stringify({

  imageId: 1,

  icon: Array.from(new Uint8Array(arrayBuffer))

})

  })

.then(res => {

  if (!res.ok) {

throw res.statusText;

  }

  return res.json();

})

.then(data => data)

.catch(err => console.log("err", err));

}


// STEP 5: Create before upload checker if needed

function beforeUpload(fileObject) {

  return new Promise(resolve => {

const validFileTypes = ["image/jpeg", "image/png"];

const isValidFileType = validFileTypes.includes(fileObject.type);

let errorMessages = [];


if (!isValidFileType) {

  errorMessages.push("You can only upload JPG or PNG file!");

}


const isValidFileSize = fileObject.size / 1024 / 1024 < 2;

if (!isValidFileSize) {

  errorMessages.push("Image must smaller than 2MB!");

}


resolve({

  isValid: isValidFileType && isValidFileSize,

  errorMessages: errorMessages.join("\n")

});

  });

}


function setUploading(isUploading) {

  if (isUploading === true) {

spinner.classList.add("opacity-1");

  } else {

spinner.classList.remove("opacity-1");

  }

}

</script>

</html>

星期六, 12月 14, 2019

清單 - Web 各類範例

編輯

◆ CSS Only
  ◇ 水平線
   ・Div 底框當水平線及其色系

  ◇ 文字相關
   ・文字間距(字字之間,不是列列之間)

  ◇ 背景相關
   ・CSS background 3個應用範例


◆ Javascript 為主
  ◇ CSS
   ・從Javascript 修改 CSS


◆ 綜合 (css, html, javascript 等)
  ◇ Upload - 圖片
   ・即時預覽圖片、多檔上傳 (with no bootstrap, no JQuery)
   ・即時預覽圖片、單檔上傳 (with bootstrap & JQuery)

  ◇ Share to
   ・Web Share to 語法 (LINE, Facebook)

  ◇ 表格 (table)
   ・表格第一列及第一行固定不動

星期二, 11月 26, 2019

判斷上網設備(手機,桌機),並動態導向至可不同網頁

◆ 程式目的: 判斷上網設備(手機,桌機)並動態導向至不同網頁

◆ 注意事項: 以下程式必須放在HTML head > meta > titile 之後的第一時間執行

◆ split("/")技術細節說明

  ※web url sample: https://a.b.c/web_root/language/real_root/sub_folder
  ※web_root == folder of: desktop, mobile, ftp, ...
  ※language == en, tw, cn, ...
  ※real_root == index.html, index.php, folder name of project, css, imgs, js, ...
  
  aUrl[0] == https:
  aUrl[1] == null
  aUrl[2] == a.b.c
  aUrl[3] == web_root
  ...

◆ Javascript Source Code
<script>
  // web url sample: https://a.b.c/web_root/language/real_root/sub_folder
  var sOriginUrl = document.URL;
  var aUrl = sOriginUrl.split("/");

  if (aUrl[3] === "desktop" && (aUrl[4] === "" || typeof aUrl[4] == "undefined")){
    window.location = "/desktop/<language>";
  } else if (aUrl[3] === "mobile" && (aUrl[4] === "" || typeof aUrl[4] == "undefined")){
    window.location = "/mobile/<language>";
  }

  var gotoNewWebLocation = function() {
    var w = window,
      d = document,
      b = d.getElementsByTagName("body")[0],
      e = d.documentElement,
      x = e.clientWidth || b.clientWidth,
      y = e.clientHeight || b.clientHeight;
    
    // 舊手機規格以「768px-1」為判斷依據。Bootstrap 4 已改為「1200px-1」
    // 本人建議,仍須考量幾個手機螢幕規格的判斷點:
    //     1440x810, 1600x900, 1920x1080, 2560x1440
    // 其中,以 1920 x 1080 為門檻(人類視覺只要超過1920px就無法分辨出差別)
    
    // 注意 n == 所要判斷字串的字數,若是en, tw 則是 2
    if (x <= 767) { // or 1079
      if (aUrl[3] == "desktop" && aUrl[4].substr(0,n) == "<language>" ) window.location = "/mobile/<language>";
    } else {
      if (aUrl[3] == "mobile" && aUrl[4].substr(0,n) == "<language>") window.location = "/desktop/<language>";
    }
  };
  gotoNewWebLocation();
  
  if (window.addEventListener) {
    window.addEventListener("resize", gotoNewWebLocation);
    window.addEventListener("orientationchange", gotoNewWebLocation);
  } else if (window.attachEvent) { // 相容IE事件
    window.attachEvent("onresize", gotoNewWebLocation);
  }
</script>

星期日, 9月 13, 2015

PHP 常用函式真假值

source: http://seanphpbook.blogspot.tw/2009/10/php-empty-isset-php.html

PHP 函式:gettype, empty, is_null, isset, if($x), ==, ===


真假值第一圖:


真假值第二圖: