質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

90.12%

PHPコード挿入、実行によるHTMLの隙間

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 336

YutaNkai

score 29

イメージ説明
![イメージ説明]

下がPHP挿入後です。上の画像では画像が上辺にピッタリくっついていますが、下の画像では2枚目以降から隙間ができています。
またWIFI無料などの文字も崩れています。原因はどこにありますでしょうか、検証しても画像を囲んでいるBOXにマージン、パディングなどはありませんでした。

<?php

ini_set('display_errors', 1);

require_once("Database.php");
require_once("functions.php");

$dtabase = new Database();
$hotels = "";
$hotelsPics = "";
$hotelsDisplayTags = "";

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $word = postvalue('destination');
    $hotels = $dtabase->getHotels($word);
    $hotelsPics = $dtabase->getHotelsPics($word);
    $hotelsDisplayTags = $dtabase->getHotelsDisplayTags($word);
} else {
    header("Location: top.html");
    exit;
}
?>

<!DOCTYPE html>
<html lang="en" dir="ltr">

<head>
  <meta charset="utf-8">
  <title>SeeHotels</title>
  <link rel="icon" href="favicon.ico">
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.13/css/all.css" integrity="sha384-DNOHZ68U8hZfKXOrtjWvjxusGo9WQnrNx2sqG0tfsghAvtVlRW3tvkXWZh58N9jp" crossorigin="anonymous">
  <link rel="stylesheet" href="css/showhotels.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
  <script src="jquery.customSelect.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
  <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1/themes/ui-lightness/jquery-ui.css">
  <script src="showhotels.js"></script>
</head>

<body>
  <header>
  </header>

  <main>
    <div class="container">

      <div class="lookup">
        絞り込み条件
      </div>

      <div class="hotels">
        <div class="mainrequirements">
          <span id="sortbylow" class="selected">料金の低い順</span><span id="sortbyrating" class="">高評価</span><span id="recommended" class="">おすすめ</span>
        </div>

        <?php foreach ($hotels as $hotel): ?>

        <div class="hotel">
          <div class="hotelpicks">
            <?php foreach ($hotelsPics as $pic): ?>
            <?php if (($hotel['hotel_id'] == $pic['hotel_id']) && ($hotel['country_code'] == $pic['country_code'])): ?>
            <div class="mainpick">
              <img src="imgs/<?php echo $pic['main_pics']; ?>" width="300" height="300" alt="">
            </div>
            <div class="others">
              <img src="imgs/<?php echo $pic['others1']; ?>" width="85" height="85" alt="">
              <img src="imgs/<?php echo $pic['others2']; ?>" width="85" height="85" alt="">
              <img src="imgs/<?php echo $pic['others3']; ?>" width="85" height="85" alt="">
            </div>
           <?php endif ?>
           <?php endforeach ?>
          </div>

          <div class="hotelinfo">
            <h2 class="hotelname"><?php echo $hotel['hotel_name'] ;?></h2>
            <div class="tags">
              <?php foreach ($hotelsDisplayTags as $tag): ?>
              <?php if (($hotel['hotel_id'] == $tag['hotel_id']) && ($hotel['country_code'] == $tag['country_code'])): ?>
              <span><?php echo $tag['tag'];?></span>
              <?php endif ?>
              <?php endforeach ?>
            </div>
            <div class="rating">
              <span class="rateposition"><span>非常に良い</span><span class="rate">8.5</span></span>
            </div>
            <div class="price">
              <span class=""><?php echo $hotel['price']; ?>/1泊(1人)</span>
            </div>
          </div>
          <div class="clear"></div>
        </div>
        <?php endforeach ?>
        <div class="clear"></div>
      </div>


    </div>
  </main>

  <footer>

  </footer>
</body>

</html>
* {
  margin: 0;
  padding: 0;
  /*全要素のマージン・パディングをリセット*/
}

h1, h2, h3, h4, h4, h6, p {
  margin: 0;
  padding: 0;
}

body {
  font-family: Verdana, sans-serif;
  margin: 0;
  box-sizing: border-box;
}

.clear {
  clear: both;
  /*floatの解除、ここがポイント*/
}

.container {
  width: 960px;
  margin: 0 auto;
  padding: 40px 0;
}

/*main*/
.lookup {
  width: 230px;
  float: left;
  /* background-color: blue; */
}

.hotels {
  width: 730px;
  /* background-color: #dcdcdc; */
  float: right;
}

.mainrequirements {
  margin-bottom: 50px;
}

.mainrequirements span {
  text-align: center;
  cursor: pointer;
  display: inline-block;
  width: 28.9%;
  border: solid 1px #808080;
  padding: 10px 15px;
  font-weight: bold;
  color: #808080;
}

.mainrequirements .selected {
  border: solid 1px #1e90ff;
  background-color: #1e90ff;
  color: #ffffff;
  font-weight: bold;
}

.hotel {
  box-shadow: 0 0 8px #808080;
}

.hotel:not(:last-child) {
  margin-bottom: 40px;
}

.hotelpicks {
  float: left;
}

/*hotelinfo*/
.hotelinfo {
  float: right;
  width: 400px;
}

.hotelname {
  margin-bottom: 50px;
}

.hotelinfo .tags {
  width: 350px;
  margin-bottom: 50px;
}

.hotelinfo .tags span {
  border: solid 1px #228b22;
  display: inline-block;
  width: 120px;
  text-align: center;
  padding: 5px;
  border-radius: 3px;
  font-weight: bold;
  color: #228b22;
}

.hotelinfo .tags span:not(:last-child) {
  margin-right: 10px;
  margin-bottom: 5px;
}

.hotelinfo .rating {
  width: 350px;
  font-size: 22px;
  font-weight: bold;
  margin-bottom: 50px;
  position: relative;
}

/*上手くいっている部分*/
.rating .rateposition {
  position: absolute;
  right: 0px;
}

.rating .rate {
  display: inline-block;
  font-weight: bold;
  background-color: #1e90ff;
  color: #ffffff;
  text-align: center;
  margin-left: 5px;
  padding: 3px 5px;
  border-radius: 2px;
}

.hotelinfo .price {
  /*反映されないbackground*/
  /* background-color: red; */
  width: 350px;
  /* background-color: #808080; */
  height: 100px;
  font-size: 22px;
  font-weight: bold;
  position: relative;
}

/*問題の部分*/
.price span {
  display: inline-block;
  color: #cd5c5c;
  position: absolute;
  right: 0px;
  bottom: 0px;
}

追記
WIFI無料などの文字崩れは設定している、widthをなくすことにより解決しました。
以前画像の隙間は未解決です。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

1行ごとにHTMLから離脱せず、
なるべくブロック化するべき。
HTMLからの離脱に伴って、不要な改行コードや空白文字で隙間ができます。
隙間ができている箇所の、
webブラウザでのHTMLソース表示をして、
もとのphpと比較してください。
そして不要な空白文字や改行文字が出ないように工夫します。

例えば:

        <div class="hotel">
          <div class="hotelpicks">
            <?php foreach ($hotelsPics as $pic): ?>
            <?php if (($hotel['hotel_id'] == $pic['hotel_id']) && ($hotel['country_code'] == $pic['country_code'])): ?>
            <div class="mainpick">
              <img src="imgs/<?php echo $pic['main_pics']; ?>" width="300" height="300" alt="">
            </div>


インデントした位置にHTMLからの離脱を設けてあるんだが、
そういう箇所がHTML上に余計な空白や改行コードとして出力されてしまう。
phpファイル編集の可読性が若干犠牲になっても

        <div class="hotel">
          <div class="hotelpicks">
<?php 
            foreach ($hotelsPics as $pic):
              if (($hotel['hotel_id'] == $pic['hotel_id']) && ($hotel['country_code'] == $pic['country_code'])):
?>            <div class="mainpick">
              <img src="imgs/<?php echo $pic['main_pics']; ?>" width="300" height="300" alt="">
            </div>


などとすることで余計な空白や改行コードを出力することを抑え込むことができる。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/11 16:31

    ありがとうございます。
    <?php foraeach(): ?>
    <?php if(): ?>
    <?php endif: ?>
    <?php endforeach ?>

    ではなく、

    <?php foraeach(): if(): ?>
    <?php endforeach ?>
    ということですか

    キャンセル

  • 2019/02/11 16:34

    ヒアドキュメントでやっちゃえばよくね?(関係のない改行を含まない)

    キャンセル

  • 2019/02/11 19:45

    phpのコードが連続するところで、いちいち行単位で離脱する必要はない、って意味。
    行単位でHTMLからの離脱をする発送でいるうちは、なかなか気づけないと思われる。
    ヒアドキュメントも使いこなしができると便利ですよねー。

    キャンセル

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

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る