如果引用或轉貼,麻煩註明出處與本網誌連結,否則視為侵權。

2021年9月29日

網頁設計 : 如何設計一個表頭固定但內容可以捲動的表格

作者: Fred F.M. Wang (FW知識瑣記) 日期: 2021-9-29

網頁中如何設計一個表頭固定但內容可以捲動的表格


       要讓表格表頭固定,內容可以捲動,首先,table header(thead)與table body(tbody)必須各

自設定顯示方式為block(CSS設定 display: block;),但是,table header(thead)與table body

(tbody)各自設定為block時,表頭與內容的欄位寬度就無法對齊。因此,必須透過Javascript設定table header欄寬與table body的欄寬一致


==================================================

<style>

thead.fixedHeader {    display: block;    }

thead.fixedHeader tr th { padding: 4px 0px!important;    }

tbody.scrollContent {  

    display: block;    

    overflow: auto;    

}

</style>



<table id="itemtable">

    <thead id="itemheader" class="fixedHeader">

       <tr>

    ..

    </tr>

    </thead>


   <tbody id="itemcontent" class="scrollContent">

       <tr>

    ..

    </tr>

   </tbody>


=============================================

 <script type="text/javascript">

$( document ).ready(function () {

   // 設定捲動區域,區域底部不要超過視窗底部

    var content_y = get_offset_y("itemcontent"); // 取得table body畫面左上角的座標y位置

    var content_height = window.screen.height - content_y - 200;   // 設定table body的高     

    document.getElementById("itemcontent").style.height= content_height + "px"; 

   

  // 設定table header欄寬與table body的欄寬一致 by Fred

  var theader = document.getElementById("itemheader");

  var tbody = document.getElementById("itemcontent");

  row0 = theader.rows[0];  // table header row

  row1 = tbody.rows[0];     // table body 1st row   


  // 逐一設定table header每一欄欄寬等於table body每一欄的實際顯示寬度

  for (var j = 0; j < row1.cells.length; j++) {

      row0.cells[j].style.width = (row1.cells[j].offsetWidth - 1) + "px";  // offsetWidth:實際顯示

寬度,注意要減一,否則無法對齊

  }


/* 取得一個HTML元素在畫面中的位置(左上角的座標y位置) */

function get_offset_y(id) {

    var e = document.getElementById(id);

    var offset = {x:0,y:0};

    while (e)

    {

       offset.x += e.offsetLeft;

       offset.y += e.offsetTop;

       e = e.offsetParent;

    }


    if (document.documentElement && (document.documentElement.scrollTop 

|| document.documentElement.scrollLeft))    {

       offset.x -= document.documentElement.scrollLeft;

       offset.y -= document.documentElement.scrollTop;

    

  } else if (document.body && (document.body.scrollTop || document.body.scrollLeft))   {

       offset.x -= document.body.scrollLeft;

       offset.y -= document.body.scrollTop;

  

  } else if (window.pageXOffset || window.pageYOffset)   {

       offset.x -= window.pageXOffset;

       offset.y -= window.pageYOffset;

    }


    // alert(offset.x + '\n' + offset.y);    

    return offset.y

}

</script>

註: 取得一個HTML元素在畫面中的位置參考來源https://stackoverflow.com/questions/211703/is-it-possible-to-get-the-position-of-div-within-the-browser-viewport-not-withi

2021年9月18日

志工往事

作者: Fred F.M. Wang (FW知識瑣記) 撰寫日期:2020-12-19

今天看一本書"台灣心臟外科第一人 洪啟仁醫師的生命故事",回憶起大約30年前在簡稱"兒心"的心臟病兒童基金會當志工的往事。
 
民國78年偶然的機會經過台北市青島西路兒心與兒癌(兒童癌症基金會)門口,突發當志工的想法,於是就進入兒心擔任志工,幫忙一些資訊系統的開發與維護等事務。 
 
當志工期間知道有各種兒童常見的心臟病,一般的如心臟瓣膜缺損,心室中隔缺損等,嚴重的如法洛氏四合症(合併四種異常),大動脈轉位(也就是出生時大動脈與肺動脈接心臟的位置相反了),甚至有俗稱"青蛙心"的單心室(出生時只有一個心室)患者。嚴重的通常都是先天性心臟病,病童外觀很明顯的是皮膚,嘴唇發黑發紫。
 
印象最深刻的是一個媽媽抱著一個很小的嬰兒到兒心辦公室來申請手術補助,因為心臟病的關係,小嬰兒甚至沒有力氣吸奶,媽媽只能一湯匙一湯匙地餵。
 
這段時間從許許多多的捐款,知道社會各個角落有許多善心人,默默行善,支持著兒心,支持著這些病童與他的家人。
 
除此之外,還有如書中洪啟仁醫師(創台灣首例法洛氏四合症手術成功)一樣致力於鑽研心臟手術的心臟外科醫師,讓這些孩童有康復的希望。
 
順便幫兒心宣傳一下
兒心官網 : http://www.ccft.org.tw
劃撥帳號:0100299 - 4 戶名:中華民國心臟病兒童基金會

 

 

2021年9月5日

阿甘正傳的啟示

作者: Fred F.M. Wang (FW知識瑣記) 日期:2021-9-5

 經過二十多年再看一遍電影"阿甘正傳",與年輕時有不同的感受。下面是自己三點感想 :

一 台詞 "Life was like a box of chocolates. You never know what you're gonna get 人生就像一盒巧克力,你永遠都不知道你下一塊吃到的是什麼口味。"

  感想 : 雖然人生的方向選擇是我們自己,但是,我們永遠不知道命運會帶我們去哪裡。不要怪罪命運,也不要花太多時間後悔,選擇我們所愛的,並愛我們所選擇的。

二 台詞 "There's only so much fortune a man really needs, and the rest is just for showing off. 人真正需要的財富只有那麼一些,剩下的只不過是用來炫燿罷了。"
  感想 : 財富在人生過程中的必要的,但是,生活必要之外的財富對我們並沒有多大的意義。需要之外的財富,我們可以選擇拿來做更有意義的事,例如幫助連生存所需的財富都沒有的人。

感想: 拋開人生不切實際的幻想,專注當下,盡力做好每件事情,就會有想不到的成就。

2021年9月2日

如何解決PHP日期2038年的限制?

作者: Fred F.M. Wang (FW知識瑣記) 日期:2021-9-2

以往以PHP寫日期相關程式,習慣用strtotime函式將字串轉換為時間,並用date函式以特定的日期

格式顯示出來。但是最近遇到了2038年後的日期顯示出問題了。如何解決呢? 


舊寫法 :


$date = date("Ymd",strtotime("2038-1-19"));

echo "2038-1-19 :" . $date . "<br />";     

使用日期(date)函式,結果顯示 2038-1-19 :20380119        


$date = date("Ymd",strtotime("2038-1-20"));

echo "2038-1-20 :" . $date . "<br />";   

使用日期(date)函式, 結果顯示 2038-1-20 :19700101            

由此看到日期(date)函式2038年1月20日之後的日期都無法正確顯示了


同樣要顯示日期增減也是會發生同樣的問題,當日期增加超過2038-1-20日,就無法顯示出來。

$this_date = Date("Ymd");

echo "today:" . $this_date . "<br />"; // 顯示 today:20210831


$date = date("Ymd",strtotime("+5985 days", strtotime($this_date)));

echo "add 5985 days:" . $date . "<br />"; // 顯示 add 5985 days:20380119


$date = date("Ymd",strtotime("+5986 days", strtotime($this_date)));

echo "add 5986 days:" . $date . "<br />";  // 顯示 add 5986 days:19700101        

    

怎麼解決2038年的限制呢?


您必須改用DateTime函式來取得日期(將日期字串轉成日期),並用format函式以特定的日期格式

顯示出來

$date =  new DateTime($this_date);


日期的增加則使用add函式

$date->add(new DateInterval("P6000D"));  // P開頭代表日期,6000D 代表 6000 天

echo "add 6000 days:" . $date->format("Ymd"); // add 6000 days:20380203