質問するログイン新規登録

Q&A

解決済

1回答

2276閲覧

下向きの矢印のような形(V字のような形)のサイトを作りたいが、コーディング方法が分からない。

cheshire-cat

総合スコア73

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2023/08/07 15:43

0

0

HTMLとCSSを使って、図のようなWebサイトを作りたいです
(この図は実は私のコーディング事例1をスクリーンショットでとったものです。私のコーディングは後で示します。)。

問題は、灰色のグラデーションの部分の作り方です。
この部分には文章や画像が入るのですが、最後は、下向きにとがっているような形(Vの字のような形)にしたいと考えています。
このWebサイトで難しいと感じている点は2点あり、

1点目は灰色の部分のグラデーションをどのように作るのか? という点です。
仮にこの点がグラデーションではなく、べた塗りであれば、四角形と下向きの三角形をつくって組み合わせる、という方法を採ることが考えられます。ですがグラデーションのため、うまく色の調整をするのが難しい気もします。

2点目は、下向きにとがっている部分(灰色のグラデーションと黄色の間)に灰色で線が引かれていることです。この線をどのように表現するのかが悩ましいです。

このようなサイトをどのようにして作ったらいいか? というのが今回の質問です。

イメージ説明

参考までに私の作った方法を記載すると、私は以下のようにしてこのサイトを作りました
(コーディング事例1。500pxとか300pxとかの長さについては適当に入れています。この部分は、本来は本文の分量によって変化します。)。

clip-pathを使うことで、下向きにとがっている部分(V字の部分)を作っています。
そして灰色の線の部分(灰色のグラデーションと黄色の間)はボックスの長さを少しずつずらすことで作成しています
(長さの%を少しずつ変えることで作成しています)。

HTML

1<div class="block"> 2 <h2>タイトル</h2> 3 <div class="block__under"> 4 <div class="block__middle"> 5 <div class="block__up"> 6 ここに文章を入れる 7 </div> 8 </div> 9 </div> 10</div> 11<div class="block-2"></div>

CSS

1.block__under { 2 background-color: yellow; 3} 4 5.block__middle { 6 background-color: #c8c8c8; 7 clip-path: polygon(0 0, 100% 0, 100% 89%, 50% 100%, 0 89%); 8} 9 10.block__up { 11 height: 500px; 12 background-image: linear-gradient(to bottom, #c8c8c8, #eeeeee); 13 clip-path: polygon(0 0, 100% 0, 100% 88%, 50% 99%, 0 88%); 14} 15 16.block-2 { 17 height: 300px; 18 background-color: yellow; 19}

しかしながら、私の作成方法は良くないと思っています。
なぜなら私の作成方法だと、本文に文章や画像を大量に記載した場合、サイトがどんどん縦に長くなるのですが、それに伴い、V字の角度もどんどん鋭くなるためです。V字の角度が鋭くなると、これまでは表示されていた部分が表示されなくなります。
(実はスマホサイトとパソコンサイトでも、V字の角度が異なるため、表示内容が見えたり見えなかったりします。)

これを防ぐためには、本文の分量の変化に伴い、私の設定した%も修正する必要があるのですが、それはかなり手間がかかります。
本文の分量が変化してもV字の角度が変化しないようなサイトを作りたいです。

また他の方法として、以下の方法も考えました(コーディング事例2)。

HTML

1<h2>タイトル</h2> 2<div class="block"> 3 <p>ここに文章を入れる</p> 4</div> 5<div class="block-2"></div>

CSS

1*, 2*::before, 3*::after { 4 box-sizing: border-box; 5} 6 7.block { 8 height: 500px; 9 background-image: linear-gradient(to bottom, #c8c8c8, #eeeeee); 10 position: relative; 11 overflow-x: hidden; 12} 13.block::before, .block::after { 14 content: ""; 15 display: block; 16 width: 50vw; 17 height: 100%; 18 position: absolute; 19 bottom: 0; 20 background-color: yellow; 21} 22.block::before { 23 left: 0; 24 border-right: 20px solid #c8c8c8; 25 transform: skew(70deg); 26 transform-origin: bottom center; 27} 28.block::after { 29 right: 0; 30 border-left: 20px solid #c8c8c8; 31 transform: skew(-70deg); 32 transform-origin: bottom center; 33} 34 35.block-2 { 36 height: 300px; 37 background-color: yellow; 38}

この方法は疑似要素を作り、疑似要素をskewで変化させる方法です。
先ほどの作り方とは異なり、本文が増えてもV字の角度が鋭くなるということはありません。
その点は優れているのですが、V字の頂点のところの重なり方が、きれいではないです。

これらの例のように、色々考えてはみたものの、満足のいくコーディングに仕上がっていません。
私の考えた方法とは全く違う方法でも構いませんので、なるべく簡便な、手間ひまのかからない方法でこのサイトを作りたいと考えています。
何らかのアイデアをお持ちの方のお知恵をお借りしたいです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

guest

回答1

0

ベストアンサー

最初のサンプルのHTMLはそのままで、CSSを下記のようにしたらどうでしょう。

css

1.block__middle { 2 background-color: #c8c8c8; 3 clip-path: polygon(0 0, 100% 0, 100% calc(100% - 10vw), 50% 100%, 0 calc(100% - 10vw)); 4} 5 6.block__up { 7 height: auto; 8 background-image: linear-gradient(to bottom, #c8c8c8, #eeeeee); 9 clip-path: polygon(0 0, 100% 0, 100% calc(100% - 10vw), 50% 100%, 0 calc(100% - 10vw)); 10 transform: translatey(-5px); 11 padding-bottom: 10vw; 12}

境界線の角度はcalc(100% - 10vw)の部分のvwの数値で、
境界線の太さは、transform: translatey(-5px); のpxの数値で、
調整してください。

padding-bottom: 10vw; は中身のコンテンツがclip-pathによって隠れるのを防ぐ目的です。

CodePenサンプル

別案

解決済みですが、デザインレイアウトのためにHTMLに不必要な要素を追加しているのが気になりましたので、質問の2つ目のサンプルのHTMLで実現する方法も提示しておきます。

css

1.block { 2 background-color: #c8c8c8; 3 clip-path: polygon(0 0, 100% 0, 100% calc(100% - 10vw), 50% 100%, 0 calc(100% - 10vw)); 4 padding-bottom: 10vw; 5 position: relative; 6} 7.block::before { 8 content: ""; 9 width: 100%; 10 height: 100%; 11 position: absolute; 12 background-image: linear-gradient(to bottom, #c8c8c8, #eeeeee); 13 clip-path: polygon(0 0, 100% 0, 100% calc(100% - 10vw), 50% 100%, 0 calc(100% - 10vw)); 14 z-index: -1; 15 transform: translatey(-5px); 16} 17.block-2 { 18 height: 300px; 19 background-color: yellow; 20 margin-top: -12vw; 21 padding-top: 12vw; 22}

背景のグラデーションはbefore疑似要素につけて背面に配置します。
translatey()で上にずらして親要素のグレーの背景が見えるようにして境界線とします。
次のブロックは、ネガティブマージンで重ねます。

CodePenサンプル

投稿2023/08/07 17:01

編集2023/08/08 18:41
hatena19

総合スコア34377

cheshire-cat

2023/08/08 08:51

お返事が遅くなり、申し訳ありません。 日中は仕事をしているため、確認が遅れました。 コードを拝見しましたが、大変スマートな記述であり、手間が大幅に削減されていると思います。 感心したところを書くと、 ・2つのブロックの5角形の記述が全く同一なので、作成の(計算の)手間が省ける ・transformを使って差を表現する方法は思いつきませんでした。また5pxという固定単位を使った点にも感心しました。なぜなら質問文には書き忘れていたのですが、私のように差を%で表現すると、本文の分量が増えるに従い、灰色の線がどんどん太くなってしまうという問題があったためです。 ・5角形の作り方で、vwを使っているため、本文が増えても、角度の大幅な変化がない。 といったところです。 大変役に立ちました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問