position:fixedのコンテンツの横幅を指定する方法 結城永人 -2023年2月20日 テンプレートのImaginary themeにポップアップの表示を付けようとしてCSSのposition:fixedを使おうとしたら横幅が画面から突き抜けてしまって困った。 調べるとposition:fixedのコンテンツの位置指定の基準が普通とは異なることに起因している。 固定位置指定は絶対位置指定に似ていますが、要素の包含ブロックがビューポートによって定義される初期包含ブロックであるという点が異なり、祖先の一つに transform, perspective, filter の何れかのプロパティが none 以外 (CSS Transforms Spec を参照) に設定されている場合は例外で、その場合は祖先が包含ブロックとしてふるまいます。 position|MDN|Mozilla 通常、position:fixedのコンテンツは固定位置指定として親要素ではなくてビューポートと呼ばれる大外の画面の領域を基準として配置される。 だから位置取りをずらして表示しようとすると幅が広いほどに反対側へ突き抜けてしまう場合も出て来るし、位置取り自体も合せ辛くなってしまうことがある。 以前、位置取りに関してはボタンなどのposition:fixedのHTML要素をサイトの幅に合わせて表示する方法で、分かった。 今回、コンテンツを画面内に収めるにはどうするかで、横幅を指定する二つの方法が見付かったので、纏めておきたい。 position:fixedと一緒に使うとビューポートを基準にサイト全体の横幅を捉えてコンテンツをはみ出さずに配置することができる。 widthで横幅を指定するleftとrightで横幅を指定する 今回のマークアップは些細な日常の記事/追加ページの本文の左下に固定表示された概要ボタンから出て来る記事/追加ベージの基本情報のポップアップに使っているから押すとposition:fixedではみ出さないコンテンツの実装例を確認することができる。 widthで横幅を指定する position:fixedのコンテンツをleftかrightで横にずらすとコンテンツの横幅との関係で、はみ出してしまうことがある。 だからコンテンツの横幅と左右の余りの横幅を足して画面の横幅一杯を越えないようにコンテンツの横幅のwidthを指定すれば画面内にきっちり収めることができる。 最大幅のmax-widthを使ってもコンテンツを一定の範囲内に収められることは変わらない。 サイトと画面の幅が一致する場合のマークアップ width:calc(100% - コンテンツの余り) モバイルのスマホやタブレットならばサイトと画面の幅が一致していることが多い。その場合は計算式のcacl()を使って100%(position:fixedの基準のビューポートに対して)からleftやrightですらした分だけ引くとコンテンツが画面からはみ出すことはなくなる。 left:50pxとright:50pxでのwidthのマークアップ例 width:calc(100% - (50px + 50px)) サイトと画面の幅が一致する場合は左右から50pxずつ離れた範囲内にコンテンツが表示される。 calcl()の書き方はもっと簡略化できる。 width:calc(100% - 50px - 50px) 括弧を減らすことができるし、予め答えが分かって「50px + 50px」ならば「100px」と書いて計算式の一部を省略することもできる。 サイトよりも画面の幅が大きい場合のマークアップ width:calc(100% - 調整したコンテンツの余り) デスクトップのパソコンならばサイトと画面の幅が一致してなくて前者よりも後者の方が大きいかも知れない。その場合は計算式のcacl()を使ってposition:fixed のコンテンツの位置取りをサイトの領域に入るように調整する必要がある。ビューポートの分を差し引いてしまえばサイトの領域に絞ってコンテンツの横幅を指定できるから画面からはみ出すことはなくなる。 left:50pxとright:50pxでのwidthマークアップ例 width:calc(100% - ((50% - サイト全体の横幅 / 2 + 50px)) + (50% - (サイト全体の横幅 / 2 + 50px))) サイトよりも画面の幅が大きい場合に大外の画面の分を差し引いてサイトの左右の端から50pxずつ離れた範囲内にコンテンツが表示される。 calcl()の書き方はもっと簡略化できる。 width:calc(サイト全体の横幅 / 2 - 50px) + サイト全体の横幅 / 2 - 50px)) 括弧を減らすことができるし、もしも左右均等に配置するならば計算式を一つに纏めることもできる。 width:calc((サイト全体の横幅 / 2 - 50px) * 2)) または width:calc((サイト全体の横幅 - 100px)) サイト全体の横幅も決まって例えば「1240px」ならば全て計算して「1140px」と答えだけをwidthの値に使っても構わない。 leftとrightで横幅を指定する position:fixedのコンテンツの位置取りを指定するtopとleftとrightとbottomは同じ方向の二つの値を同時に指定するとコンテンツの幅も決めることができる。 なので横幅はleftとrightを同時に指定するとwidthで指定したのと変わらなくて、それ以上、広がることは基本的になくなる。 サイトと画面の幅が一致する場合のマークアップ left:左の位置;right:右の位置 モバイルのスマホやタブレットならばサイトと画面の幅が一致していることが多い。その場合はleftとrightを同時に指定するとその範囲にコンテンツが表示される。 left:50pxとright:50pxの同時使用のマークアップ例 left:50px;right:50px サイトと画面の幅が一致する場合は左右から50pxずつ離れた範囲内にコンテンツが表示される。 サイトよりも画面の幅が大きい場合のマークアップ left:調整した左の位置;right:調整した右の位置 デスクトップのパソコンならばサイトと画面の幅が一致してなくて前者よりも後者の方が大きいかも知れない。その場合は計算式のcacl()を使ってposition:fixed のコンテンツの位置取りをサイトの領域に入るように調整する必要がある。ビューポートの分を差し引いてしまえばサイトの領域に絞ってコンテンツの左右の位置を指定できるから画面からはみ出すことはなくなる。 left:50pxとright:50pxの同時使用のマークアップ例 left:calc(50% - サイト全体の横幅 / 2 + 50px;right:calc(50% - サイト全体の横幅 / 2 + 50px サイトよりも画面の幅が大きい場合に大外の画面の分を差し引いてサイトの左右の端から50pxずつ離れた範囲内にコンテンツが表示される。 サイト全体の横幅も決まって例えば「1240px」ならばleftもrightも一部を計算してそれぞれに「50% - 570px」 と計算式を簡略化できる。 二つの方法のデバイス毎の振り分け position:fixedのコンテンツの横幅の指定は画面の大きさによって異なるから完全に対応するには二種類のマークアップをメディアクエリ/@media screenによって振り分けて使うことになる。 マークアップをモバイルに振り分けると @media screen (max-width:サイトの最大幅) { モバイル用のposition:fixedのコンテンツの横幅のマークアップ } マークアップをデスクトップに振り分けると @media screen (min-width:サイトの最大幅に「1px」を足したもの) { デスクトップ用のposition:fixedのコンテンツの横幅のマークアップ } 画面がサイトの最大幅を越えるところからposition:fixedの横幅のマークアップが変わるので、メディアクエリのマークアップの切り替えの条件の画面幅の指定に使える。 最近ではコンテナクエリ/@containerでのマークアップの振り分けも可能になっている。親要素の幅に応じて切り替えることができる。その場合もposition:fixedのコンテンツのマークアップの切り替えの条件になるのはサイトの最大幅という画面幅を越えるかどうかであることに変わりはない。 widthの方法とleftとrightの方法はどちらも同じようなもので、モバイルでもデスクトップでも計算が少ないleftとrightの方法がwidthの方法よりも少し使い易いというくらいの違いしかないかも知れない。 コメント 新しい投稿 前の投稿
イヤーワームという頭の中で音楽が勝手に流れる現象を引き起こすストレスを反省 以前から頭の中で音楽が勝手に流れることが良くあって近頃でもブログで取り上げたばかりの モーツァルトの幻想曲K.397 や K.375 や ribbonの Virgin Snow などを体験していた。いつも好きな曲ばかりで鼻歌を伴って喜ばしい気持ちになるし、好調の証のように捉えてい...
芦名星のたぶん本当の死因 芦名星は自殺した。その前後、 三浦春馬と竹内結子の自宅のクローゼットでの首吊りという同じ仕方での連続自殺 があり、他殺の陰謀論も思い浮かぶけど、しかし違うのではないか。今の 日本の芸能界には死にたくなる気持ち悪さがある し、芸能人が裕福な生活でも自殺することはさほど不思議ではない...
幸せの良さはインパクトが物凄く大きいために人々の印象にも残り易いと考える ブログのヘッダーの背景画像を変更した。無料素材の クリスティン・フォークトの写真 を使っている。 Pexelsで見付けるや否や本当に素晴らしく気に入ってしまった A woman in snowflakes by Kristin Vogt / Pexels 雪の中で紺...
アガサ・クリスティの誘拐された総理大臣の日本語訳 十九から二十世紀のイギリスの作家、小説家の アガサ・クリスティ の小説の 誘拐された総理大臣 (1923)の日本語訳を行った。一つの文学作品として人間の洞察力に富んだ優れた内容を持つだけではなく、表現も意義深いから外国語の英語の聞き取りと読み取りの教材としても最適だと感じる。 ...
Imgurで画像URLと埋め込みコードを取得する方法 Imgur は自分でアップロードした画像については画像URL/直リンクを取得して他のサイトにHTMLのimgタグで表示させられる。 そして自分と他の人たちも含めて画像の埋め込みコードを取得して他のサイトのHTMLに、そのまま、記載して表示させられもする。 目次 Img...
俳句の規則:字数と季語と切れ字 概要 俳句の規則 俳句は、十七文字という短い詩の中で、季節を感じさせる言葉(季語)を使い、切れ字で語調を整えて表現する伝統的な日本の文学形式です。 句の基本的な構成要素 字数を十七文字に揃える:俳句は大きく三つの部分に分けられる。上句(かみく)と中句(なかく)...
日常の些細な出来事に触れる幸せの味わいは小さいというイメージが欠かせない 誰にでも分かる些細な日常というと他でもなく、小さな幸せの味わいではないか。 永遠の詩人として本質的な認識に基づく命の尊さを伝え届けなくてはならないと考えるけれどもアクセスアップのためには誰にでも分かる些細な日常のイメージも大事にするべきだろう。 小さな幸せの味わいをどこま...
シソンヌのラーメン屋:とんこつラーメンを臭いラーメンと呼んだコントが好き シソンヌ (お笑い)のラーメン屋のコントが面白かった。とんこつラーメンを臭いラーメンと呼ぶから僕も同じだったと気付いた。 シソンヌのラーメン屋 (Google検索) 否、店によってはそばを通りかかるだけでも堪らないくらい臭いから、一体、何だろうと本当に思わずにはいられなか...
今春に咲き出した桜の花の写真を幾つか撮って来た サイバーショットのW170を使った。七八年前のコンパクトカメラで、 一眼カメラのα5100を買って お役後免の状態に差しかかっているけど、どうするかと考えてしまわざるを得ない。画質としては力強い。画素数が10.1MPで、レンズがカールツァイスということで、写真の風合いが凄いと...
キム・テヒの反日活動を日本人としてどこまで許せるか かつて韓国ドラマの IRIS -アイリス- を観て何て綺麗で可愛くて良いんだと一目で度肝を抜かれた俳優に キム・テヒ がいた。 映画『アイリス -THE LAST-』予告編 by TAEWON ENTERTAINMENT from シネマトゥデイ 日本で放映されたのが2...
コメント