
人と自然を創造する - 誰もが健康であるために。
更新ログ(HTML・CSS・JS)‐ 主な内容のみ記録、後の変更・修正・改善のための参考ログ
- 2026/1/31フッターメニュー
- フッターメニューの不具合を改善
会社概要、社票説明、沿革(ダイジェスト・詳細)のページのみ
左列のフッターリンクが最初の2文字だけリンクが効かない不具合を発見。
(例:採用情報 なら │採用│の部分がリンク無効)
原因:
PCサイトでの、画面左側の追従メニュー
│会社概要│
│社票説明│
│沿 革│
これを動かす .luxy-el が 透明なままフッターリンクの上にかぶっているためである。
改善策:
#footermenuのクラス要素に
position: relative を指定することで
#footermenu が「独立した基準(レイヤー)」になり、
luxy の transform レイヤーより“手前”として扱われるようになる。
↓↓↓ 追記
#footermenu {
position: relative;
z-index: 10;
}
補足:
やらなくてよい対処
・z-index を無限に上げる
・aタグ側に position を足す
・文字に padding を足す
今回の理解を一言でまとめると
relative は「子配置」だけのためではない
z-index を“有効化するスイッチ”
transform 持ち要素と戦うための防具
- 2026/1/30フッターメニュー
- フッターメニューの軽微な改善
HTMLのルールではリストタグ「ul」や「li」の中に「div」や「p」や「a」タグを入れてはいけない。
入れても体制は崩れないが、「ul」や「li」 は箇条書き(リスト)に使われるタグで、
視覚障害者が使う読み上げソフトでは ul を見つけると li を数え「○個の箇条書きです」と
読み上げるものがある。これは ul の中には li しかないことが前提。
ルールを無視すればこの読み上げが正常に働かない。
例
<ul>
<li><div class="title">事業概要</div></li> ← ルール違反(「li」の中に「div」)
<li><a href="business.html">主要商品</a></li>
</ul>
↓
改善後
<ul>
<li class="title-row title">事業概要</li>
<li><a href="business.html">主要商品</a></li>
</ul>
CSS(style.css)追記:(タイトルの前のアイコンを消す)
/* リストの先頭の行(title-row)だけアイコンを表示させない */
#footermenu li.title-row::before {
content: none !important; /* アイコンを消去 */
margin-right: 0 !important; /* アイコン用の余白も消去 */
}
- 2026/12/11沿革
- 沿革ダイジェストをタブレットなどで見たときの表示改善
iPad など、タブレット端末で画面の向き(縦横)を変えたとき、
リンクバーなのどの表示が乱れるため、以下のJSを追記してリロードさせることで再表示を行う。
// 画面の向きが変わった時のイベント
window.addEventListener('orientationchange', function() {
// alert("画面の向きが変わりました。再読み込みします。");
location.reload();
});
// iPadなどのリサイズ判定用(予備)
let lastWidth = window.innerWidth;
window.addEventListener('resize', function() {
if (window.innerWidth !== lastWidth) {
lastWidth = window.innerWidth;
// alert("画面サイズが変更されました。再読み込みします。"); // 必要に応じて解除
location.reload();
}
});
ただし、このリロードにより画像が表示されなくなった。
結果的に、CSS の .zoom-out-image に display: block !important; を追記して表示されるようになった。
原因として、画像の <img> タグは、標準では「インライン要素(テキストと同じ扱い)」のため、
画像が読み込まれるまでの間、ブラウザは「ここにはまだ何も内容がない」と判断し、一時的に高さを 0px として扱われ、JavaScript(Intersection Observer)の判定から漏れた?と思われる。
あるいは、CSSの.zoom-out-image に height: 100% や object-fit を指定したが、
これらは「親要素に高さがあること」が前提の命令で、
display: block がなかったときは、画像が親要素の枠組みを正しく押し広げることができず、結果として親要素ごと「潰れた状態(高さ0)」になっていたと考えられる。
他の似た現象を回避させるため、TOPページのSlickスライドの画像にも /*追記*/ した。
.mainimg {
display: block !important; /* 追記 インライン要素だと高さが出ない場合があるため */
width: 100%; /*追記*/
height: auto; /*追記*/
position: relative;
cursor: pointer;
}
- 2026/1/21レビュー
-
レビューページをスマホなどで見たときの年代リンクメニューの表示改善
PCサイトと同じメニュー表示では年数が下に伸びて画面が隠れてしまうため改善した。
スマホではメニューバー下のリンク(年数)を非表示とし、代わりに画面下部にポップアップメニューで表示させた。
HTML:
各review〇〇〇.html に追記
<script src="js/main-review.js"></script>
<div class="sp-popup-nav">
<a href="review2011.html">2011</a>
<a href="review2012.html">2012</a>
<a href="review2013.html">2013</a>
<a href="review2014.html">2014</a>
<a href="review2015.html">2015</a>
<a href="review2016.html">2016</a>
<a href="review2017.html">2017</a>
<a href="review2018.html">2018</a>
<a href="review2019.html">2019</a>
<a href="review2020.html">2010</a>
<a href="review2021.html">2021</a>
<a href="review2022.html">2022</a>
<a href="review2023.html">2023</a>
<a class="youtube" href="">
<img src="images/youtube.png"></a>
</div>
CSS;
style-review.css に追記
/* 各年度へのリンクをスマホでは半透明のポップアップにする。 */
.sp-popup-nav {
display: none !important; /* jQueryのfadeInで表示させるため初期は非表示 */
position: fixed !important; /* 念のため固定を再宣言 */
bottom: 20px!important; /* 念のため固定を再宣言 */
left: 5% !important; /* 念のため固定を再宣言 */
width: 70% !important; /* 念のため固定を再宣言 */
background: rgba(255, 255, 255, 0.85); /* 半透明 */
backdrop-filter: blur(5px); /* 背景ぼかし */
padding: 15px 0;
/* border-radius: 50px; */
box-shadow: 0 4px 15px rgba(0,0,0,0.2);
z-index: 50; /* Highslide JSのコントロールよりも下になる様に! */
/* text-align: center; */
/* 横並びの設定 */
display: flex;
flex-wrap: wrap; /* ★これで自動改行されます */
justify-content: flex-start; /* ★これで全ての行が左寄せになります */
gap: 10px 20px; /* ★リンク同士の間隔(上下10px、左右15px) */
}
/* JSがクラスを追加した時や、表示状態の時は !important で上書きして出す */
.sp-popup-nav-show {
display: flex !important;
}
/* リンクの装飾 */
.sp-popup-nav a {
text-decoration: none;
color: #333;
font-weight: bold;
font-size: 14px;
/* widthを指定せず、文字の長さに合わせるか、一定幅にする */
min-width: 50px;
text-align: center
}
/* YouTubeアイコンのサイズ調整 */
.sp-popup-nav a.youtube img {
height: 1.2em; /* 文字の大きさに合わせる(1.2文字分程度の高さ) */
width: auto; /* 横幅は自動計算して比率を維持 */
vertical-align: middle; /* 文字と並んだ時に高さを中央に揃える */
}
/*スマホ用のポップアップリンクは通常非表示、スマホの時だけ表示させる。*/
.sp-popup-nav {
display: none !important; /* !importantでJSのfadeInを一時的に無効化 */
}
/*----------------------------------------
ここから下は画面幅414px以下の追加指定
------------------------------------------*/
/*メニューバーの年代リンクは非表示*/
#re-mainmenu ul{
display: none;
}
/*スマホ用のポップアップリンクを表示、スマホの時だけ表示させる。*/
.sp-popup-nav {
display: flex !important;
}
/*----------------------------------------
ここから下は画面幅415px以上430px以下の追加指定
------------------------------------------*/
/*メニューバーの年代リンクは非表示*/
#re-mainmenu ul{
display: none;
}
/*スマホ用のポップアップリンクを表示、スマホの時だけ表示させる。*/
.sp-popup-nav {
display: flex !important;
}
/*----------------------------------------
ここから下は画面幅415px以上430px以下の追加指定
------------------------------------------*/
/*メニューバーの年代リンクは非表示*/
#re-mainmenu ul{
display: none;
}
/*スマホ用のポップアップリンクを表示、スマホの時だけ表示させる。*/
.sp-popup-nav {
display: flex !important;
}
/*----------------------------------------
ここから下は画面幅600px以上の追加指定
------------------------------------------*/
/*スマホ用の年代ポップアップリンクを表示*/
.sp-popup-nav {
display: flex !important;
}
/*----------------------------------------
スマホの横向き (Smartphone Landscape)
目安: 幅481px以上~767px以下 かつ 横向き
------------------------------------------*/
@media screen and (min-width: 481px) and (max-width: 767px) and (orientation: landscape) {
/*メニューバーの年代リンクは非表示*/
#re-mainmenu ul{
display: none;
}
/*スマホ用の年代ポップアップリンクを表示*/
.sp-popup-nav {
display: flex !important;
}
/* ※注意! 下の閉じカッコ } はこのブロックに必要なので、削除しないで下さい。 */
}
/*----------------------------------------
「タッチ操作」かつ「縦向き」かつ「幅が一定以上(スマホ越え)」
------------------------------------------*/
@media (pointer: coarse) and (orientation: portrait) and (min-width: 600px) {
/*
iPad (無印・mini・Pro) の縦置きはほぼすべてここに入ります。
一般的なスマホの縦持ち(幅400px前後)は除外されます。
*/
/*メニューバーの年代リンクは非表示*/
#re-mainmenu ul{
display: none !important;
}
.sp-popup-nav {
display: flex !important;
}
/* ※注意! 下の閉じカッコ } はこのブロックに必要なので、削除しないで下さい。 */
}
/* 「タッチ操作」かつ「横向き」かつ「幅が一定以上(スマホ越え)」 */
@media (pointer: coarse) and (orientation: landscape) and (min-width: 600px) {
/*
iPad (無印・mini・Pro) の縦置きはほぼすべてここに入ります。
一般的なスマホの縦持ち(幅400px前後)は除外されます。
*/
.sp-popup-nav {
display: flex !important;
}
/* ※注意! 下の閉じカッコ } はこのブロックに必要なので、削除しないで下さい。 */
}
/*----------------------------------------
ここから下は画面幅1000px以上の追加指定
------------------------------------------*/
/*スマホ用のポップアップリンクを表示、スマホの時だけ表示させる。*/
.sp-popup-nav {
display: none !important;
}
JS:
main-review.js を新規設置
$(function() {
var scrollElement = $('.sp-popup-nav');
// 最初は隠しておく
scrollElement.hide();
$(window).scroll(function() {
if ($(this).scrollTop() > 0) { // 例えば100pxスクロールしたら表示させるには 0 → 100 にする。
scrollElement.fadeIn().addClass('sp-popup-nav-show');
} else {
scrollElement.fadeOut().removeClass('sp-popup-nav-show');
}
});
});
- 2026/1/20採用情報
-
正式公開に際して「採用情報」情報のページを追加。
たの製薬企業の採用ページを参考とし、募集要項以外の前置きなどの文章を掲載した。
「確かな信頼」を共に創る、新しい力との出会いを
共に働くことへの「私たちの想い」
・個人を尊重し、誰もが自然体でいられる職場へ
・あなたの能力・スキルが発揮できる職場
・混ざり合うことで、辿り着けない場所へ
PICK UP - 求めたい職場の日常 -
・「あなたの『気づき』が、命を守る品質になる。」
・「経験」を「組織の資産」として歓迎する。
・「正しさを追求する若手が、主役。個の誠実さを尊重するチーム」
このページの人物画像はAIで生成
- 2026/1/20正式公開
-
旧ホームページを差し替えて、本サイトを正式に公開した。
- 2026/1/16問い合わせ
- PHPの問い合わせを一部修正。
問題点:
送信後 SynologyNASでは「完了画面」に移行したが、レンタルサーバーでは「完了画面」に自動移行しなかった。
レンタルサーバーでは送信後「完了画面」へ移行せず「メッセージは正常に送信されました」の1行のみが表示され、F5を押すと完了画面へ移行する現象。
修正箇所:
echo 'メッセージは正常に送信されました';
この部分をコメントアウトにする。
// echo 'メッセージは正常に送信されました';
原因:
header("location: ...") の前に echo で文字を出力していることが原因。
AIの回答:
なぜF5(更新)で完了画面が出るのか?
送信ボタンを押すと、echo のせいでリダイレクトが失敗し、画面には「メッセージは正常に送信されました」という文字だけが残ります。
この時、裏側では $_SESSION["comp"]="comp" の処理までは実行されています。
F5キーで再読み込みすると、プログラムが最初から走り、すでにセッションに "comp" が入っているため、else 側の完了画面表示(showComplete)が実行されるという仕組みです。
修正案
デバッグ用にメッセージを出したい場合は、echo ではなくJavaScriptでリダイレクトするか、出力バッファリング(ob_start())を使用する方法がありますが、最もシンプルな解決策は echo を消すことです。
―――
WebArenaでリダイレクトが停止した理由は、サーバー設定の
出力バッファリング (output_buffering) が「無効(Off)」になっていたためと考えられます。
なぜSynologyでは完了画面へ自動以降したのか?
Synology NASなどの環境では、デフォルトで 出力バッファリングが「有効(On または 4096バイトなど)」 に設定されていることが多いです。
バッファリング有効(Synologyなど): echo した文字を一旦サーバー内のメモリに貯めます。まだブラウザに送信していないので、その後に header()(リダイレクト命令)が来ても、ヘッダー情報を先頭に差し込んで一緒に送ることができます。
バッファリング無効(WebArenaなど): echo した瞬間に、文字データがブラウザへ送信されます。PHPのルールでは「データ送信後にヘッダー(リダイレクト)を送ることはできない」ため、命令が無視され、画面が止まってしまいます。
サーバーによる挙動の違い
レンタルサーバー(WebArena、さくら、エックスサーバー等)は、セキュリティやパフォーマンスの観点から設定が厳格(バッファリング無効)になっていることが一般的です。
もし今後も同じコードを使い回したい場合は、PHPファイルの先頭(<?php のすぐ次)に ob_start(); と記述すれば、どのサーバーでも Synology と同じように echo があっても動くようになりますが、基本的には不要な echo は消しておくのが最も安全な作法です。
- 2026/1/16採用情報
- 『採用に関するお問合せ』フォームの設置検討
まもなく正式に本サイトを公開する可能性がある。
旧サイトではイメージが悪く、求人をするには不適切と判断したためである。
それに先駆けて、採用に関する問い合わせの設置に着手した。
既存の「お問合せ」(PHP)の一部を変更して inquiry-recuruite.php として仮設置。
設置場所は、暫定的にフッターメニューの「トップページ」の下に「<採用情報」のリンクを設けて誘導。
「採用に関するページ」に移行して、問い合わせフォームへのボタンなどを設置予定である。
- 2024/5/10サイト内検索機能
- トップページにサイト内検索を設置
PHP(原型):
ここから------------
<?php
// 検索キーワードを取得
$searchTerm = isset($_GET['q']) ? $_GET['q'] : '';
// 検索キーワードが入力されているかチェック
if (!empty($searchTerm)) {
$files = glob('../*.html'); // フォルダ内の全HTMLファイルを取得
$searchResults = [];
foreach ($files as $file) {
$content = file_get_contents($file); // ファイルの内容を取得
$lines = explode("\n", $content); // ファイルの内容を行に分割
foreach ($lines as $lineNumber => $lineContent) {
if (stripos($lineContent, $searchTerm) !== false) { // 大文字小文字を無視して検索
// HTMLタグを除外してマッチした行を取得
$lineContentWithoutTags = strip_tags($lineContent);
// ファイルとマッチした行を結果に追加
$searchResults[] = ['file' => $file, 'line' => $lineContentWithoutTags, 'lineNumber' => $lineNumber + 1];
break; // 最初に見つかった行のみを取得するためにループを抜ける
}
}
}
// 検索結果を出力
if (!empty($searchResults)) {
echo '<p>検索キーワード: ' . $searchTerm . '</p>';
foreach ($searchResults as $result) {
echo '<p><a href="' . $result['file'] . '">' . $result['file'] . '</a> - 行番号: ' . $result['lineNumber'] . ' - ' . htmlspecialchars($result['line']) . '</p>';
}
} else {
echo '<p>検索キーワードにマッチするページはありません。</p>';
}
} else {
echo '<p>検索キーワードを入力してください。</p>';
}
?>
ここまで------------
上記PHP(原型)に対して次の修正を加えた。
↓
↓
・HTML中のコメントを除去する
・スクリプトタグ内のコメントを除去する
・スタイルシート内のコメントを除去する
・特定のページやメニューバーのテキストを除外する条件を追加
・大文字小文字を無視して検索
・検索キーワードを含むの前後のコンテキスト(マッチした前後2行)を出力
・一部のHTMLタグが検索結果に出力されるためHTMLタグ記号を除外する
・メージタイトルを取得して出力
・メージの更新日時、ヒット件数も表示
・クリックイベントのソースコードが出力するので特定的に除外する
修正後のPHP:
ここから------------
<!-- 検索結果が出力されたページ上にも検索フォームを設置する -->
<form action="search.php" method="GET" target="_blank">
<input type="text" name="q" placeholder="検索キーワードを入力してください" value="<?php echo isset($_GET['q']) ? htmlspecialchars($_GET['q']) : ''; ?>">
<button type="submit">検索</button>
</form>
<?php
// 検索キーワードを取得
$searchTerm = isset($_GET['q']) ? $_GET['q'] : '';
// 検索キーワードが入力されているかチェック
if (!empty($searchTerm)) {
$files = glob('../*.html'); // フォルダ内の全HTMLファイルを取得
$searchResults = [];
foreach ($files as $file) {
$content = file_get_contents($file); // ファイルの内容を取得
// HTML中のコメントを除去する
$content = preg_replace('/!--(.|\s)*?-->/', '', $content);
// スクリプトタグ内のコメントを除去する
$content = preg_replace('/