• 締切済み

display:block;を指定した置換要素の幅

通常のブロック要素であれば親要素の幅まで広がりますが、 置換要素の場合display:block;を指定しても幅が広がりませんよね。 置換要素をブロック要素と同様な幅算出させる方法ってありますか? 具体的にはiPhone/Android向けのデザインでbuttonを親要素の横幅いっぱいにしたいのですが、 width:100%;だとbuttonにmarginを設定した場合にはみ出てしまうので使い勝手がよくないのです。 Firefoxの場合はwidth:-moz-available;を指定することで期待する挙動になるのですが、 webkitで似たようなことを実現する方法があれば教えてください!

みんなの回答

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.5

>buttonが直接marginを持っていた方が都合がよいのでそういった方法があるか、という質問です。  あくまで、form要素内のbuttinですが、本来インライン要素なのでdisplay:blockに指定した時点でblockとしてのサイズになりますから、その親のコンテナブロックとの関係でサイズが決定されますからむりでしょう。 >さまざまな理解度の人間が編集に関わりますので、このような前提条件がありません。  これは、さすがに想定外です。私も担当部署で編集を許可していることがありますが、その場合は、「サイト全体のデザインを統一しないと利用者が混乱する」という名目で、詳細なテンプレートやマニュアルを渡し、かつ講習を受けてもらいます。それが出来ない場合は、SSPで処理するデータ形式や、XMLにしてもらっています。 [XML] <文書>  <title></title>  <著者>   <部署>    <部></部>    <課></課>    <係></係>   </部署>   <名前>    <氏></氏><名></名>   </名前>  </著者>  <記事> ・・・とか。 >複数人で制作するので共通のデザインとして  ^^^^^^^^^^^^^^^   ^^^^^^^^^^^^  の場合は、最低限、共通の文書構造に従ったHTMLを作成してもらうと言うことが絶対に必要になります。それをなくして、共通のデザインというのは無理です。それについては、クライアントに理解してもらうしかありません。もちろん、こちから一方的に決めるものではなく、あくまで要望と限界の相談になります。  そうしておくと、将来、担当者や業者が変わっても継続的にメンテナンス可能になります。

noname#220471
質問者

お礼

ありがとうございます。 私もある程度調べたので、現状では無理そうだという結論に達しています。 時間を割いておつきあいいただきありがとうございます。 常に共通の文書構造に従ったHTMLが作成できるのは理想的ですね。 こちらは大きめのメディアを運営しているインハウスなのでなかなか厳しそうです。 多くのサイトが未だにHTML構造的におかしいところを見ても、ほとんどのところではなかなか理想的に行かず苦労しているのだと思います。 この辺の課題は質問の内容とは関係ありませんので終了とさせていただきます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.4

>そういった作業や不要なhtmlや複雑なcssを生み出したくないということです。  示されたHTMLから、HTMLで作成されていると推測されます。HTML5の最大の変更点(と私が思っているの)は、文書構造を適切にマークアップすることです。以前のHTMLにあったプレゼンテーションに関わる要素・属性がすべて削除されています。 ★新しい要素 ( http://standards.mitsue.co.jp/resources/w3c/TR/html5-diff/#new-elements )  これは、 ・「全く余白がないと各自で余白を空けたくなり」 ・「<br>を足してみたり」 ・「デザイナーであれば新たにclassを付けてmarginを付けたり」することはなくなるということですね。  そのため、HTML5ではHTMLが極めてシンプルになり、文書構造を示すために必要だったdivやspan、あるいはclass名が劇的に減少します。  そのため「各自がmarginをつけるというデザインのために余計なタグや、余計なCSSを書かなくて済」みます。  そのかわり、文書構造には厳密性が求められますから、「blockで囲む」以前に、囲まれているはずです。 「置換要素の場合display:block;を指定しても幅が広がりませんよね。」 display:blockを指定した時点で、width:autoに、また継承しないですから 【引用】____________ここから 'width'  Value: <length> | <percentage> | auto | inherit  Initial: auto  ・・・【中略】・・・  Inherited: no  ・・・【中略】・・・  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ここまで[10.2 Content width: the 'width' property( http://www.w3.org/TR/CSS2/visudet.html#propdef-width )]より  巾はwidth,margin,paddingで指定できます。  そんなに悩まなくても良いと思うのですが・・  

noname#220471
質問者

補足

おっしゃりたい意図がよく分からないのですが、 >文書構造を適切にマークアップする まず、さまざまな理解度の人間が編集に関わりますので、このような前提条件がありません。全く出来ないというわけではりませんが、場合によっては構造が正しくないこともあるかもしれません。 また、共通デザインとして用意しているbuttonにはmarginを設定していません。ですので利用者は「余白を空ける」という余計な作業が生まれます。 ですので、下記のようなこともありません。 >そのため「各自がmarginをつけるというデザインのために余計なタグや、余計なCSSを書かなくて済」みます。 ですがbuttonに直接marginを設定せずとも余白は作れますので、それほど大きな問題ではありませんが、buttonが直接marginを持っていた方が都合がよいのでそういった方法があるか、という質問です。

全文を見る
すると、全ての回答が全文表示されます。
  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.3

>複数人で制作するので共通のデザインとしてbuttonにmarginを持たせたかったというのが今回の実現したい内容です。 >エンジニア等cssを修正しない人がhtmlを編集したり、cssの理解度も様々な人が制作に携わるので、aやinput、buttonでも同様な挙動で、marginも設定された共通の環境を提供したかったという作業効率の問題です。  なら、逆に簡単なのではないですか?下手に知っていて弄くられると難しくなますが・・(^^) ★こういう場合、もっとも大事なことはHTMLとCSSの基本だけです。すなわち、デザインのためにHTMLを書かない。HTMLは文書構造を記述することに徹底するということです。  「共通のデザインとしてbutton」というふうに、デザインにひこずられるとHTMLもスタイルシートも複雑化して手が付けられなくなります。

noname#220471
質問者

補足

現状デフォルトでmarginが付いてないので、各自がmarginをつけるというデザインのために余計なタグや、余計なCSSを書かなくて済むように、シンプルにしたいという目的の質問です。 全く余白がないと各自で余白を空けたくなりますよね? エンジニアであれば<br>を足してみたり、デザイナーであれば新たにclassを付けてmarginを付けたりと複雑化するかもしれません。 そういった作業や不要なhtmlや複雑なcssを生み出したくないということです。

全文を見る
すると、全ての回答が全文表示されます。
  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.2

>見出し等、他の要素が横幅いっぱいに使ったりしますので、paddingで調整したく >ありません。回避策としては間に別のブロック要素をはさんでその要素に対して >marginまたはpaddingを持たせるしかないのですが、  とは言っても、文法的におかしいので「別のブロック要素」で囲むしかないのでは?、否が応でもブロックは生成されますので。  また、HTML5では文法上は<button>要素に親要素の制約はありませんが、<form>内に置かれたときはレンダリングが異なります。拝見したHTMLで見る限りは、button要素を使う必要はないのではないかと・・。スタイルシートで何でもできるのでわざわざ<button>を使う必要はないのではないかと思いますが? [文書解析木] section       id="test"  |- h1  |- p  |- 匿名ブロック補完  |  |- a           class="test1  |  |- a           class="test2"  |- p  |- 匿名ブロック補完  |  |- button        class="test1"  |  |- button        class="test2" <section id="test"> _<h1>見出し</h1> _<p>非置換要素</p> _<a href="#" class="test1">[A] test 1</a> _<a href="#" class="test2">[B] test 2</a> _<p>置換要素</p> _<form action=""> __<p><button type="button" class="test1">[C] test 1</button></p> __<p><button type="button" class="test2">[D] test 2</button></p> _</form> _<form action=""> __<p><button type="button" class="test1">[C] test 1</button></p> __<p><button type="button" class="test2">[D] test 2</button></p> _</form> </section> body {margin: 0; padding: 0;} #test h1 {background-color: red;} #test a.test1 {display: block; margin: 20px; background-color: lime;} #test a.test2 {display: block; margin: 20px; background-color: pink; width: 100%;} #test form p{padding:0;margin:20px;} #test form p button{padding:-1px;width:100%;background-color: lime;} #test form+form p{padding:1px;margin:20px;} #test form+form p button{width:100%;background-color: pink;}

noname#220471
質問者

お礼

回答ありがとうございます。 サンプルは不具合が再現する例として書いたもので、実際には当然ブロック要素で囲んだり様々な要素が発生します。 今のところ別のブロック要素にmarginを持たせることで同様のデザインは表現できるのですが、複数人で制作するので共通のデザインとしてbuttonにmarginを持たせたかったというのが今回の実現したい内容です。 エンジニア等cssを修正しない人がhtmlを編集したり、cssの理解度も様々な人が制作に携わるので、aやinput、buttonでも同様な挙動で、marginも設定された共通の環境を提供したかったという作業効率の問題です。 どなたか御存知であればと思いこちらに書かせていただきましたが、私自身いくつか試して断念したので解決できないのはしょうがないと思っています。 おつきあいいただきありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.1

いいえ、きちんと表示されるはずです。 width:100%であっても、margin/paddingが指定してあると、その内側のサイズが算出値になるのですから、正しい挙動です。 ・8.1 Box dimensions ( http://www.w3.org/TR/CSS2/box.html#box-dimensions ) ・Since child elements (generally) inherit the computed values of their parent, ( http://www.w3.org/TR/CSS2/syndata.html#percentage-units )  親要素の算出値を継承する。  どういうマークアップに対して、どのようなデザインしたいかの愚多的な内容がわからないのですが、あらかじめ算出基準になる親要素のpaddingで調整しておくとか・・

noname#220471
質問者

補足

回答ありがとうございます。 ご説明の通り、親要素の算出値を継承しますので、包含ブロック(Containing blocks)に対してmargin/paddingを指定しても、その内側のサイズを算出値としますが、やりたい事としては要素自身にmarginを使いたいのです。 こちらの説明不足でしたので、下記にサンプルHTMLを記載します。 <style> body {margin: 0; padding: 0;} #test h1 {background-color: red;} #test .test1 {display: block; margin: 20px; background-color: lime;} #test .test2 {display: block; margin: 20px; background-color: pink; width: 100%;} </style> <section id="test"> <h1>見出し</h1> <p>非置換要素</p> <a href="#" class="test1">[A] test 1</a> <a href="#" class="test2">[B] test 2</a> <p>置換要素</p> <button type="button" class="test1">[C] test 1</button> <button type="button" class="test2">[D] test 2</button> </section> こちらの例で期待する挙動は[A]になります。 見出し等、他の要素が横幅いっぱいに使ったりしますので、paddingで調整したくありません。回避策としては間に別のブロック要素をはさんでその要素に対してmarginまたはpaddingを持たせるしかないのですが、そうしなくてすむ方法がありますか、という質問です。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ブロック要素の幅を中身の幅に合わせるには?

    CSSの記述に関してわからないことがあります。 ブロック要素の幅をブロック要素の中身の幅に合わせて自動的に変わるようにしたいのですが、CSSでそのような設定をすることは可能なのでしょうか? table要素を使えば可能なのは知っていますが、divのような他のブロック要素でも、CSSの設定を行えば可能なのでしょうか? 少し調べたところ、Firefoxの場合は display: table; とすればよいようなのですが、IE6では正しく表示できませんでした。他の手段はないのでしょうか? よろしくお願いします。

    • ベストアンサー
    • CSS
  • 可変幅でabsolute指定で中央配置できません

    可変幅でabsoluteを指定すると中央配置できなくなります。 ブラウザの幅に合わせて中身のサイズも合わせて伸縮するサイトを構築したくて色々試しているのですが、どうしてもうまくできません。 どのように指定したらできるのでしょうか?困っています、どなたかお助けください。 例えば画像が固定のサイズであれば  width:500px; position:absolute; left:50%; margin-left:-250px; 見たいな形で中央配置できるのですが、可変の場合、、伸縮させたいので、横幅は常に500pxとはなりません。 よろしくお願い致します。

    • ベストアンサー
    • CSS
  • 要素の多い置換

    Perlでテキストデータの加工をしています。 ●あ●い●う…というデータを, ◆う◆い◆あ…に置換する場合  s/●(.*?)●(.*?)●(.*?)/◆\3◆\2◆\1/g; というやりかたをしていますが, 要素が10個以上になった場合は (つまり,\9から先は) どのように指定したらよいのでしょうか? たいへん初歩的な質問かもしれませんが, どなたかご教授ください。

    • ベストアンサー
    • Perl
  • ブロックレベル要素内ブロックレベル要素のmargin-topが効かない

    <html><head><style> *{ margin:0; paddgin:0; border:none; } div#wrap{ background:#BBB; width:600px; height:900px; margin:30px auto; } div#header{ background:#999; width:150px; height:60px; margin:30px; } </style></head><body> <div id="wrap"> <div id="header"> </div> </div> </body></html> 例えばこの用な場合で、divの中にdivが入っている場合など…中に入っているdiv要素のmargin-topが効きません。原因がよくわらないのですが、どのような条件の時にmargin-topは効かなくなるのでしょうか?また解決策はどのようなものがあるでしょうか?このようなケースでmargin-topが効かなくなったのが二度目でどうしても気になったので質問させていただきました。よろしくお願いします。

    • ベストアンサー
    • HTML
  • div要素の幅をWindow幅に合わせて変更したい

    下記のような形でdiv要素の#main_frameの幅を$(window).width()の値に合わせて指定しているのですが、ブラウザのwindowサイズを操作した場合に表示が崩れてしまいます。 windowサイズの操作がなされた場合、#main_frameの幅も自動的に変わるようにしたのですが方法はありますでしょうか。 <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript">   $(document).ready(function(){     $('#main_frame').css('width', ($(window).width() - 110) + 'px');   }); </script>

  • HTMLの要素の間が空いてしまうのはなぜ??

    HTMLの要素の間が空いてしまうことがあります。firefoxで空いてしまい、IEでは空かないのですが、なぜでしょうか?それぞれの要素のwidthやheightを指定しても解消されません。marginでマイナス設定すると逆にIEで要素が重なってしまうのです。どなたかご教示くださいお願いいたします。

    • ベストアンサー
    • HTML
  • CSSでイメージを縦並びに表示する際にブロック要素にする必要はあるのでしょうか?

    CSS初心者です。 サイト制作中に疑問に思ったのですが、イメージを縦並びに3つ並べて 中央に配置する時、あるページに「イメージをブロック要素にする」と書かれてたのですが、それは正しいのでしょうか?初心者の為、悩んでしまいました。 (html上) <img src="○○" width="200" height="200" alt="○○" /> <img src="○○" width="200" height="200" alt="○○" /> <img src="○○" width="200" height="200" alt="○○" /> (CSS上) img { display: block;←ここでブロック要素にする必要がわかりません。 margin: 0 auto 10px; text-align: center; } 後、違う質問で凄く初歩的なことなのですが、この「イメージを中央にする」時は「領域で中央に」という考え方は間違いなのでしょうか? 例えば先程のイメージの場所を、そのボックス内全てのものを中央にすると考えた場合、 (html上) <div id="center"> <img src="○○" width="200" height="200" alt="○○" /> <img src="○○" width="200" height="200" alt="○○" /> <img src="○○" width="200" height="200" alt="○○" /> </div> (CSS上) div#center { margin: 0 auto; text-align: center; } div#center img { margin-bottom: 10px; } と<div>でセンターにしても文法的にはおかしくないんでしょうか?? 初心者過ぎてすいません。教えて下さい。宜しくお願いします。

  • CSSで<p>の幅指定を解除したい。

    CSSで<p>の幅指定を解除したい。 今、部のHPを作成しています。先輩がある程度作ってくれていたのですが、 #main p {width:450px; margin-left:auto; margin-right:auto; text-align:left } となっていてmain内のすべての<p>が幅指定されています。 これだと都合が悪いところがありましてこれを一部解除したいのです。 .○○ p {text-align:left} このようにclassを作ってみましたが変化なし。 どのようにすればよいのでしょうか?

    • ベストアンサー
    • HTML
  • HTMLの表で幅を指定しても折り返すことは無理なのでしょうか?

    以下のHTMLの表は横幅を指定していますが、 すごく横長な表になってしまいます。セルの幅を指定してもセル内の文字を折り返す事は不可能なのでしょうか? <html> <head> <title>table</title> </head> <body> <table width="570" border="1"> <tr><td width="130"> test1</td> <td bgcolor="#CCCCCC" width="440"> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo </td></tr></table> </body> </html>

    • ベストアンサー
    • HTML
  • CSSで指定したblock要素の配置が、ブラウザ毎に異なるのを統一させ

    CSSで指定したblock要素の配置が、ブラウザ毎に異なるのを統一させたい 下記のようなhtmlとcssで、マウスオン時に画像が切り替わる横型メニューを作成しました。 ※image/top_menu.gifには、ロゴと平常時メニューが全て含まれており、ロゴはブロック要素でハイパーリンク出来るようにしてあります。メニュー項目は、マウスオン時にオン用の画像を表示するようにしてあります。 <div id="top"> <ul> <li class="logo"><a href="#"><span class="alt">logo</span></a></li> </ul> <div id="menu"> <ul> <li class="home"><a href="index.html"><span class="alt">ホーム</span></a></li> <li class="products"><a href="products.html"><span class="alt">商品情報</span></a></li> </ul> </div> </div> =============================以下CSS============================= .alt { display:none; } #top { width:75em; height:14.3em; margin-left:auto; margin-right:auto; background:url(image/top_menu.gif) center no-repeat; } #menu { width:74em; position:static; } #menu ul { padding:0 0 0 1em; margin:0; } #menu li { float:left; } #top ul { padding:0 0 0 1em; margin:0; } #top li { list-style:none; } /*トップメニュー各項目(通常時)*/ li.logo a { display:block; margin-left:1em; width:17.5em; height:9em; } li.home a { display:block; width:14.1em; height:4.5em; margin-top:0.8em; margin-left:1.3em; } li.products a { display:block; width:14.1em; height:4.5em; margin-top:0.8em; } /*トップメニュー各項目(マウスオン時)*/ .home a:hover { background:url(image/on_home.gif) no-repeat; } .products a:hover { background:url(image/on_products.gif) no-repeat; } FireFox、Safariでは意図した通りに表示されるのですが、 Windows7“以外の”IEでは、横位置は正常ですが、縦位置がずれてしまいます。 ※どうやら、logoとmenuの間の余白が原因のようで、Windows7以外のIEにのみ余白が現れてしまうようです。 IE全体で異なるのであればまだ方法があると思うのですが、 「Windows7では今のままで、それ以外では表示位置を変えて・・・」 などと言うことが出来るのでしょうか? 本音を言うと、OSやブラウザの振り分けをせず、同じCSSで対応するのがベストなのですが。 出来るだけスマートな方法で解決したいと思っていますが、良い案が見つかりません。 どなたかご教授の程、よろしくお願いいたします。 ※なお、CSSに関してはまだビギナーなので、出来るだけ具体的で細かい解答をお願いいたします。

    • ベストアンサー
    • HTML